รายการตรวจสอบความปลอดภัยของ Firebase

โปรดปฏิบัติตามหลักเกณฑ์ต่อไปนี้เพื่อรักษาความปลอดภัยให้กับทรัพยากร Firebase และข้อมูลของผู้ใช้ รายการบางอย่างอาจไม่เกี่ยวข้องกับข้อกำหนดของคุณ แต่คุณควรคำนึงถึงรายการเหล่านั้นขณะพัฒนาแอป

หลีกเลี่ยงการเข้าชมที่เป็นการละเมิด

ตั้งค่าการตรวจสอบและการแจ้งเตือนสำหรับบริการแบ็กเอนด์

หากต้องการตรวจหาการรับส่งข้อมูลที่เป็นการละเมิด เช่น การโจมตีแบบปฏิเสธการให้บริการ (DOS) ให้ตั้งค่า การตรวจสอบและการแจ้งเตือนสำหรับ Cloud Firestore Realtime Database Cloud Storage และ Hosting

หากสงสัยว่าแอปพลิเคชันของคุณถูกโจมตี โปรด ติดต่อทีมสนับสนุนโดยเร็วที่สุดเพื่อ แจ้งให้ทราบถึงสิ่งที่เกิดขึ้น

เปิดใช้ App Check

เปิดใช้ Firebase App Check สำหรับทุกบริการที่รองรับ เพื่อช่วยให้มั่นใจว่าจะมีเพียงแอปของคุณเท่านั้นที่เข้าถึงบริการแบ็กเอนด์ได้

กำหนดค่า Cloud Functions เพื่อปรับขนาดให้เหมาะกับการรับส่งข้อมูลตามปกติ

Cloud Functionsจะปรับขนาดโดยอัตโนมัติเพื่อให้เป็นไปตามความต้องการของแอป แต่ในกรณีที่มีการโจมตี อาจหมายถึงค่าใช้จ่ายจำนวนมาก คุณป้องกันปัญหานี้ได้โดยจำกัดจำนวนอินสแตนซ์ที่ทำงานพร้อมกัน ของฟังก์ชันตามการรับส่งข้อมูลปกติของแอป

ตั้งค่าการแจ้งเตือนให้คุณได้รับแจ้งเมื่อใกล้ถึงขีดจำกัด

หากบริการของคุณมีการเพิ่มขึ้นของคำขออย่างรวดเร็ว โควต้าจะเริ่มทำงานและจำกัดอัตราการรับส่งข้อมูลไปยังแอปพลิเคชันของคุณโดยอัตโนมัติ โปรดตรวจสอบแดชบอร์ดการใช้งานและการเรียกเก็บเงิน แต่คุณยังตั้งการแจ้งเตือนงบประมาณ ในโปรเจ็กต์เพื่อให้ได้รับการแจ้งเตือนเมื่อการใช้ทรัพยากรเกินความคาดหมายได้ด้วย

ป้องกันการโจมตีแบบ DoS ตัวเอง: ทดสอบฟังก์ชันในเครื่องด้วยโปรแกรมจำลอง

คุณอาจทำ DoS ตัวเองโดยไม่ตั้งใจขณะพัฒนาCloud Functions เช่น สร้างลูปทริกเกอร์-เขียนแบบไม่มีที่สิ้นสุด คุณป้องกันไม่ให้ข้อผิดพลาดเหล่านี้ส่งผลต่อบริการที่ใช้งานจริงได้โดยการพัฒนาด้วย Firebase Local Emulator Suite

และหากคุณ DOS ตัวเองโดยไม่ตั้งใจ ให้ยกเลิกการติดตั้งฟังก์ชันโดยลบออกจาก index.js แล้วเรียกใช้ firebase deploy --only functions

ในกรณีที่การตอบสนองแบบเรียลไทม์มีความสำคัญน้อยกว่า ให้สร้างฟังก์ชันอย่างรอบคอบ

หากไม่จำเป็นต้องแสดงผลลัพธ์ของฟังก์ชันแบบเรียลไทม์ คุณสามารถลดการเข้าชมที่ละเมิดได้โดยการประมวลผลผลลัพธ์เป็นชุดๆ กล่าวคือ เผยแพร่ผลลัพธ์ไปยังหัวข้อ Pub/Sub และประมวลผลผลลัพธ์เป็นระยะๆ ด้วยฟังก์ชันที่กำหนดเวลาไว้

ทำความเข้าใจคีย์ API

คีย์ API สำหรับบริการ Firebase ไม่ใช่ข้อมูลลับ

คีย์ API สำหรับบริการ Firebase จะระบุโปรเจ็กต์และแอป Firebase ให้บริการเหล่านั้นเท่านั้น การให้สิทธิ์จะได้รับการจัดการผ่านGoogle Cloudสิทธิ์ IAM Firebase Security Rules และ Firebase App Check

คีย์ API ที่จัดสรรโดย Firebase จะถูกจํากัดให้ใช้ได้กับโดยอัตโนมัติ API ที่เกี่ยวข้องกับ Firebase หากการตั้งค่าแอปเป็นไปตามหลักเกณฑ์ในหน้านี้ คีย์ API ที่จำกัดไว้สำหรับบริการของ Firebase ก็ไม่จำเป็นต้องถือเป็นข้อมูลลับ และคุณสามารถใส่คีย์เหล่านั้นในโค้ดหรือไฟล์การกำหนดค่าได้อย่างปลอดภัย

ตั้งค่าข้อจำกัดของคีย์ API

หากใช้คีย์ API สำหรับบริการอื่นๆ ของ Google โปรดตรวจสอบว่าคุณได้ใช้การจำกัดคีย์ API เพื่อกำหนดขอบเขตคีย์ API ให้กับไคลเอ็นต์แอปและ API ที่คุณใช้

ใช้คีย์ API ที่จัดสรรโดย Firebase เท่านั้นสำหรับ API ที่เกี่ยวข้องกับ Firebase หากแอปใช้ API อื่นๆ (เช่น Places API สำหรับ Maps หรือ Gemini Developer API) ให้ใช้คีย์ API แยกต่างหาก และจำกัดให้ใช้กับ API ที่เกี่ยวข้อง

เก็บFCMคีย์เซิร์ฟเวอร์เป็นความลับ

FCMคีย์เซิร์ฟเวอร์ (ที่ใช้โดย HTTP API FCMรุ่นเดิม) เป็นข้อมูลที่ละเอียดอ่อนและต้องเก็บเป็นความลับ ซึ่งแตกต่างจากคีย์ API สำหรับบริการ Firebase

เก็บรักษาคีย์บัญชีบริการเป็นความลับ

คีย์ส่วนตัวของบัญชีบริการ (ที่ใช้โดย Firebase Admin SDK) เป็นข้อมูลที่ละเอียดอ่อนและต้อง เก็บไว้เป็นความลับ ซึ่งแตกต่างจากคีย์ API สำหรับบริการ Firebase

Firebase Security Rules

เริ่มต้นกฎในเวอร์ชันที่ใช้งานจริงหรือโหมดล็อกขณะคุมสอบ

เมื่อตั้งค่า Cloud Firestore, Realtime Database และ Cloud Storage ให้เริ่มต้น Firebase Security Rules เพื่อปฏิเสธการเข้าถึงทั้งหมดโดยค่าเริ่มต้น และเพิ่มกฎที่ให้สิทธิ์เข้าถึงทรัพยากรที่เฉพาะเจาะจงขณะพัฒนาแอป

ใช้การตั้งค่าเริ่มต้นอย่างใดอย่างหนึ่งสำหรับอินสแตนซ์ใหม่ของ Cloud Firestore (โหมดการผลิต) และ Realtime Database (โหมดล็อกขณะคุมสอบ) สำหรับ Cloud Storage ให้เริ่มต้นด้วยการกำหนดค่ากฎความปลอดภัย เช่นตัวอย่างต่อไปนี้

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

กฎความปลอดภัยเป็นสคีมา ให้เพิ่มกฎเมื่อเพิ่มเอกสาร

อย่าเขียนกฎความปลอดภัยหลังจากเขียนแอปแล้ว ซึ่งเป็นงานก่อนเปิดตัว แต่ให้เขียนกฎความปลอดภัยไปพร้อมๆ กับการเขียนแอป โดยถือว่ากฎความปลอดภัยเป็นเหมือน สคีมาของฐานข้อมูล: เมื่อใดก็ตามที่คุณต้องใช้ประเภทเอกสารหรือโครงสร้างเส้นทางใหม่ ให้เขียนกฎความปลอดภัยของเอกสารหรือเส้นทางนั้นก่อน

ทดสอบกฎความปลอดภัยระดับหน่วยด้วย Local Emulator Suite เพิ่มลงใน CI

หากต้องการให้กฎความปลอดภัยสอดคล้องกับการพัฒนาแอป ให้ทดสอบหน่วยของกฎด้วย Firebase Local Emulator Suite และเพิ่มการทดสอบเหล่านี้ลงในไปป์ไลน์ CI ดูคำแนะนำต่อไปนี้สำหรับ Cloud Firestore และ Realtime Database

การตรวจสอบสิทธิ์

การตรวจสอบสิทธิ์ที่กำหนดเอง: สร้าง JWT จากสภาพแวดล้อมที่เชื่อถือได้ (ฝั่งเซิร์ฟเวอร์)

หากมีระบบการลงชื่อเข้าใช้ที่ปลอดภัยอยู่แล้ว ไม่ว่าจะเป็นระบบที่กำหนดเองหรือบริการของบุคคลที่สาม คุณก็สามารถใช้ระบบที่มีอยู่เพื่อตรวจสอบสิทธิ์กับบริการของ Firebase ได้ สร้าง JWT ที่กำหนดเอง จากสภาพแวดล้อมที่เชื่อถือได้ จากนั้นส่งโทเค็นไปยังไคลเอ็นต์ ซึ่งใช้ โทเค็นเพื่อตรวจสอบสิทธิ์ (iOS+, Android, เว็บ, Unity, C++)

ดูตัวอย่างการใช้การตรวจสอบสิทธิ์ที่กำหนดเองกับผู้ให้บริการบุคคลที่สามได้ที่ บล็อกโพสต์ ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้ Okta

การตรวจสอบสิทธิ์ที่มีการจัดการ: ผู้ให้บริการ OAuth 2.0 มีความปลอดภัยมากที่สุด

หากใช้ฟีเจอร์การตรวจสอบสิทธิ์ที่มีการจัดการของ Firebase ตัวเลือกผู้ให้บริการ OAuth 2.0 / OpenID Connect (Google, Facebook ฯลฯ) จะปลอดภัยที่สุด คุณควรสนับสนุนผู้ให้บริการเหล่านี้อย่างน้อย 1 รายหากทำได้ (ขึ้นอยู่กับฐานผู้ใช้ของคุณ)

การตรวจสอบสิทธิ์ด้วยอีเมลและรหัสผ่าน: กำหนดโควต้าที่เข้มงวดสำหรับปลายทางการลงชื่อเข้าใช้เพื่อป้องกันการโจมตีแบบบรูตฟอร์ซ

หากคุณใช้บริการการตรวจสอบสิทธิ์ด้วยอีเมลและรหัสผ่านที่มีการจัดการของ Firebase ให้เพิ่มความเข้มงวดของ โควต้าเริ่มต้นของปลายทาง identitytoolkit.googleapis.com เพื่อป้องกันการโจมตีแบบ Brute Force คุณทำได้จากหน้า Identity Toolkit API ในคอนโซล Google Cloud

การตรวจสอบสิทธิ์ด้วยอีเมลและรหัสผ่าน: เปิดใช้การป้องกันการแจงนับอีเมล

หากคุณใช้บริการการตรวจสอบสิทธิ์ด้วยอีเมลและรหัสผ่านที่มีการจัดการของ Firebase ให้ เปิดใช้การป้องกันการแจงนับอีเมล ซึ่งจะป้องกันไม่ให้ผู้ไม่ประสงค์ดีใช้ปลายทางการตรวจสอบสิทธิ์ของโปรเจ็กต์ในทางที่ผิดเพื่อ คาดเดาชื่อบัญชี

อัปเกรดเป็น Google Cloud Identity Platform เพื่อใช้การตรวจสอบสิทธิ์แบบหลายปัจจัย

หากต้องการเพิ่มความปลอดภัยในการลงชื่อเข้าใช้ คุณสามารถเพิ่มการรองรับการตรวจสอบสิทธิ์แบบหลายปัจจัย ได้โดยการอัปเกรดเป็น Google Cloud Identity Platform รหัส Firebase Authentication ที่มีอยู่จะยังคงใช้งานได้หลังจากที่คุณอัปเกรด

การตรวจสอบสิทธิ์แบบไม่ระบุตัวตน

ใช้การตรวจสอบสิทธิ์แบบไม่ระบุชื่อสำหรับการเตรียมความพร้อมผู้ใช้งานใหม่แบบวอร์มเท่านั้น

ใช้การตรวจสอบสิทธิ์แบบไม่ระบุตัวตนเพื่อบันทึกสถานะพื้นฐานสำหรับผู้ใช้ก่อนที่ผู้ใช้จะลงชื่อเข้าใช้จริงเท่านั้น การตรวจสอบสิทธิ์แบบไม่ระบุตัวตนไม่ได้ใช้แทนการลงชื่อเข้าใช้ของผู้ใช้

เปลี่ยนผู้ใช้ไปใช้วิธีการลงชื่อเข้าใช้อื่นหากผู้ใช้ต้องการให้ข้อมูลของตนเองอยู่ในอุปกรณ์อื่นๆ

ข้อมูลการตรวจสอบสิทธิ์แบบไม่ระบุตัวตนจะไม่คงอยู่หากผู้ใช้ล้างพื้นที่เก็บข้อมูลในเครื่อง หรือเปลี่ยนอุปกรณ์ หากต้องการเก็บข้อมูลไว้แม้จะรีสตาร์ทแอปในอุปกรณ์เครื่องเดียว ให้เปลี่ยนผู้ใช้เป็นบัญชีถาวร

ใช้กฎความปลอดภัยที่กำหนดให้ผู้ใช้ต้องเปลี่ยนไปใช้ผู้ให้บริการลงชื่อเข้าใช้หรือยืนยันอีเมล

ทุกคนสร้างบัญชีที่ไม่ระบุชื่อในโปรเจ็กต์ของคุณได้ ด้วยเหตุนี้ โปรดปกป้องข้อมูลที่ไม่ใช่ข้อมูลสาธารณะทั้งหมดด้วยกฎความปลอดภัยที่กำหนดให้ใช้วิธีการลงชื่อเข้าใช้ที่เฉพาะเจาะจงหรืออีเมลที่ยืนยันแล้ว

เช่น

allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;

Cloud Functions ความปลอดภัย

อย่าใส่ข้อมูลที่ละเอียดอ่อนในตัวแปรสภาพแวดล้อมโดยเด็ดขาด

โดยปกติแล้วในแอป Node.js ที่โฮสต์ด้วยตนเอง คุณจะใช้ตัวแปรสภาพแวดล้อมเพื่อเก็บ ข้อมูลที่ละเอียดอ่อน เช่น คีย์ส่วนตัว อย่าทำเช่นนี้ใน Cloud Functions เนื่องจาก Cloud Functions ใช้สภาพแวดล้อมซ้ำ ระหว่างการเรียกใช้ฟังก์ชัน จึงไม่ควรจัดเก็บข้อมูลที่ละเอียดอ่อน ไว้ในสภาพแวดล้อม

  • หากต้องการจัดเก็บคีย์ API ของ Firebase (ซึ่งไม่ใช่ข้อมูลลับ) ให้ฝังคีย์ไว้ในโค้ด

  • หากใช้ Firebase Admin SDK ใน Cloud Functions คุณไม่จำเป็นต้อง ระบุข้อมูลเข้าสู่ระบบของบัญชีบริการอย่างชัดเจน เนื่องจาก Admin SDK จะรับข้อมูลดังกล่าวได้โดยอัตโนมัติในระหว่างการเริ่มต้น

  • หากคุณเรียกใช้ Google และ Google Cloud API ที่ต้องใช้ข้อมูลเข้าสู่ระบบบัญชีบริการ ไลบรารีการตรวจสอบสิทธิ์ของ Google สำหรับ Node.js จะรับข้อมูลเข้าสู่ระบบเหล่านี้ จากข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน ซึ่งจะมีการป้อนข้อมูลโดยอัตโนมัติใน Cloud Functions

  • หากต้องการทำให้คีย์ส่วนตัวและข้อมูลเข้าสู่ระบบสำหรับบริการที่ไม่ใช่ของ Google พร้อมใช้งานใน Cloud Functions ให้ใช้ Secret Manager

เข้ารหัสข้อมูลที่ละเอียดอ่อน

หากหลีกเลี่ยงการส่งข้อมูลที่ละเอียดอ่อนไปยังฟังก์ชันไม่ได้ คุณต้อง คิดค้นโซลูชันที่กำหนดเองเพื่อเข้ารหัสข้อมูล

ฟังก์ชันที่เรียบง่ายจะปลอดภัยกว่า หากต้องการฟังก์ชันที่ซับซ้อน ให้พิจารณาใช้ Cloud Run

พยายามทำให้ฟังก์ชันของคุณเป็นพื้นฐานและเข้าใจได้มากที่สุด ความซับซ้อน ในฟังก์ชันมักทำให้เกิดข้อบกพร่องที่สังเกตได้ยากหรือลักษณะการทำงานที่ไม่คาดคิด

หากต้องการตรรกะที่ซับซ้อนหรือการกำหนดค่าสภาพแวดล้อม ให้ใช้ Cloud Run แทน Cloud Functions

การจัดการสภาพแวดล้อม

ตั้งค่าโปรเจ็กต์การพัฒนาและโปรเจ็กต์การจัดเตรียมข้อมูล

ตั้งค่าโปรเจ็กต์ Firebase แยกต่างหากสำหรับการพัฒนา การทดลองใช้ และเวอร์ชันที่ใช้งานจริง อย่านำโค้ดฝั่งไคลเอ็นต์ไปรวมกับการทำงานจริงจนกว่าจะได้รับการทดสอบกับโปรเจ็กต์สเตจจิ้ง

จำกัดสิทธิ์เข้าถึงข้อมูลเวอร์ชันที่ใช้งานจริงของทีม

หากทำงานร่วมกับทีมขนาดใหญ่ คุณสามารถลดผลกระทบจากข้อผิดพลาด และการละเมิดได้โดยจำกัดการเข้าถึงข้อมูลการผลิตโดยใช้บทบาท IAM ที่กำหนดไว้ล่วงหน้าหรือบทบาท IAM ที่กำหนดเอง

หากทีมใช้ Firebase Local Emulator Suite (แนะนํา) สําหรับการพัฒนา คุณอาจไม่จําเป็นต้องให้สิทธิ์เข้าถึงที่กว้างขึ้นแก่โปรเจ็กต์เวอร์ชันที่ใช้งานจริง

การจัดการคลัง

ระวังการสะกดชื่อไลบรารีผิดหรือผู้ดูแลรายใหม่

เมื่อเพิ่มไลบรารีลงในโปรเจ็กต์ ให้ใส่ใจกับชื่อของไลบรารีและผู้ดูแลรักษา ไลบรารีที่มีชื่อคล้ายกับไลบรารีที่คุณต้องการติดตั้งอาจมีโค้ดที่เป็นอันตราย

อย่าอัปเดตไลบรารีโดยไม่เข้าใจการเปลี่ยนแปลง

โปรดดูบันทึกการเปลี่ยนแปลงของไลบรารีที่คุณใช้ก่อนอัปเกรด ตรวจสอบว่าการอัปเกรดเพิ่มมูลค่า และตรวจสอบว่าผู้ดูแลยังเป็นบุคคลที่คุณ ไว้ใจ

ติดตั้งไลบรารี Watchdog เป็นทรัพยากร Dependency สำหรับการพัฒนาหรือการทดสอบ

ใช้ไลบรารี เช่น Snyk เพื่อสแกนโปรเจ็กต์ หาทรัพยากร Dependency ที่ไม่ปลอดภัย

ตั้งค่าการตรวจสอบสำหรับ Cloud Functions และตรวจสอบหลังจากอัปเดตไลบรารี

หากคุณใช้ Cloud Functions SDK ของเครื่องบันทึก คุณจะ ตรวจสอบและรับการแจ้งเตือน เกี่ยวกับลักษณะการทำงานที่ผิดปกติได้ ซึ่งรวมถึงลักษณะการทำงานที่เกิดจากการอัปเดตไลบรารี