Danh sách kiểm tra bảo mật của Firebase

Để giữ lại tài nguyên Firebase và an toàn dữ liệu, hãy làm theo nguyên tắc. Không phải mặt hàng nào cũng đáp ứng yêu cầu của bạn, nhưng hãy giữ hình thành khi phát triển ứng dụng.

Tránh lưu lượng truy cập sai trái

Thiết lập tính năng giám sát và cảnh báo cho các dịch vụ phụ trợ

Để phát hiện lưu lượng truy cập sai trái, chẳng hạn như các cuộc tấn công từ chối dịch vụ (DOS), hãy thiết lập giám sát và cảnh báo Cloud Firestore, Realtime Database, Cloud StorageHosting

Nếu bạn nghi ngờ có một cuộc tấn công vào ứng dụng của mình, liên hệ với Nhóm hỗ trợ sớm nhất có thể để hãy cho họ biết điều gì đang xảy ra.

Bật App Check

Để đảm bảo chỉ những ứng dụng của bạn mới có thể truy cập vào các dịch vụ phụ trợ, hãy bật Firebase App Check cho mọi dịch vụ hỗ trợ.

Định cấu hình Cloud Functions để mở rộng quy mô cho lưu lượng truy cập bình thường

Cloud Functions tự động điều chỉnh quy mô để đáp ứng nhu cầu của ứng dụng, nhưng trong một sự kiện tấn công, điều này có thể đồng nghĩa với việc bạn sẽ phải trả một hoá đơn lớn. Để ngăn chặn điều này, bạn có thể giới hạn số lượng thực thể đồng thời của một hàm dựa trên lưu lượng truy cập bình thường của ứng dụng.

Thiết lập tính năng cảnh báo để nhận thông báo khi sắp đạt đến giới hạn

Nếu yêu cầu của bạn tăng đột biến, thường thì hạn mức sẽ được áp dụng và sẽ tự động được áp dụng để điều tiết lưu lượng truy cập đến ứng dụng của bạn. Hãy nhớ theo dõi Trang tổng quan về việc sử dụng và thanh toán, nhưng bạn cũng có thể đặt thông báo về ngân sách cho dự án của bạn để được thông báo khi mức sử dụng tài nguyên vượt quá mong đợi.

Ngăn chặn hiện tượng tự ngừng hoạt động: kiểm thử các hàm trên máy bằng trình mô phỏng

Bạn có thể dễ dàng vô tình tự sử dụng DOS trong khi phát triển Cloud Functions: chẳng hạn như bằng cách tạo một vòng lặp kích hoạt-ghi vô hạn. Bạn có thể ngăn chặn những lỗi này ảnh hưởng đến các dịch vụ trực tiếp bằng cách thực hiện phát triển với Firebase Local Emulator Suite.

Và nếu bạn vô tình tự DOS, hãy huỷ triển khai chức năng của mình bằng cách xoá nó từ index.js rồi chạy firebase deploy --only functions.

Trong trường hợp khả năng phản hồi theo thời gian thực ít quan trọng hơn, hãy sắp xếp cấu trúc để hoạt động phòng vệ

Nếu không cần trình bày kết quả của một hàm theo thời gian thực, bạn có thể giảm thiểu lưu lượng truy cập lạm dụng bằng cách xử lý kết quả hàng loạt: xuất bản kết quả với một Pub/Sub theo chủ đề và xử lý kết quả theo định kỳ bằng hàm được lên lịch.

Tìm hiểu về khoá API

Khoá API cho các dịch vụ Firebase không phải là khoá bí mật

Firebase chỉ sử dụng khoá API để xác định dự án Firebase của ứng dụng cho Firebase các dịch vụ và không kiểm soát quyền truy cập vào cơ sở dữ liệu hoặc dữ liệu Cloud Storage, tức là được thực hiện bằng Firebase Security Rules. Vì lý do này, bạn không cần coi khoá API cho các dịch vụ Firebase là khoá bí mật và bạn có thể nhúng các khoá đó một cách an toàn trong mã ứng dụng khách. Tìm hiểu thêm về Khoá API cho Firebase.

Thiết lập các quy tắc hạn chế đối với khoá API

Như một biện pháp ngăn chặn bổ sung chống lại kẻ tấn công cố gắng sử dụng khoá API của bạn để cho yêu cầu giả mạo, thì bạn có thể thêm Các hạn chế đối với khoá API để xác định phạm vi của khoá API đối với các ứng dụng khách và API mà bạn sử dụng.

Giữ bí mật FCM khoá máy chủ

Không giống như khoá API cho các dịch vụ Firebase, khoá máy chủ FCM (được sử dụng bởi API HTTP FCM) rất nhạy cảm và phải được giữ bí mật.

Giữ bí mật khoá tài khoản dịch vụ

Ngoài ra, không giống như khoá API cho các dịch vụ Firebase, khoá riêng tư của tài khoản dịch vụ (được sử dụng của Firebase Admin SDK) nhạy cảm và phải được giữ bí mật.

Firebase Security Rules

Khởi chạy các quy tắc trong chế độ phát hành công khai hoặc chế độ khoá

Khi bạn thiết lập Cloud Firestore, Realtime DatabaseCloud Storage, hãy khởi chạy quy tắc bảo mật để từ chối tất cả quyền truy cập theo mặc định và thêm các quy tắc cấp quyền truy cập vào khi phát triển ứng dụng.

Sử dụng một trong các chế độ cài đặt mặc định cho các thực thể mới của Cloud Firestore (chính thức ) và Realtime Database (chế độ khoá). Đối với Cloud Storage, hãy bắt đầu bằng một khoá bảo mật như sau:

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

Quy tắc bảo mật là một giản đồ; thêm quy tắc khi bạn thêm tài liệu

Đừng viết các quy tắc bảo mật sau khi bạn viết ứng dụng, như một kiểu trước khi phát hành công việc. Thay vào đó, hãy viết các quy tắc bảo mật khi bạn viết ứng dụng, xử lý chúng như một giản đồ cơ sở dữ liệu: bất cứ khi nào bạn cần sử dụng loại tài liệu hoặc cấu trúc đường dẫn mới, hãy viết quy tắc bảo mật trước.

Kiểm thử đơn vị các quy tắc bảo mật bằng Local Emulator Suite; thêm nó vào CI

Để đảm bảo các quy tắc bảo mật của bạn phù hợp với sự phát triển của ứng dụng, thử nghiệm đơn vị quy tắc của bạn bằng Firebase Local Emulator Suite rồi thêm các kiểm thử này vào quy trình CI. Hãy xem những hướng dẫn này về Cloud FirestoreRealtime Database.

Xác thực

Xác thực tùy chỉnh: đúc JWT từ môi trường đáng tin cậy (phía máy chủ)

Nếu bạn đã có hệ thống đăng nhập an toàn, cho dù là hệ thống tuỳ chỉnh hay dịch vụ bên thứ ba, bạn có thể sử dụng hệ thống hiện có của mình để xác thực với các dịch vụ của Firebase. Tạo JWT tuỳ chỉnh từ một môi trường đáng tin cậy, sau đó truyền mã thông báo đến khách hàng của bạn, chương trình này sẽ sử dụng mã thông báo để xác thực (iOS+, Android, Web, Unity, C++).

Để biết ví dụ về cách sử dụng phương thức xác thực tuỳ chỉnh với nhà cung cấp bên thứ ba, hãy xem bài đăng trên blog, Xác thực bằng Firebase bằng Okta.

Xác thực được quản lý: Nhà cung cấp OAuth 2.0 là những phương thức bảo mật nhất

Nếu bạn sử dụng các tính năng xác thực được quản lý của Firebase, OAuth 2.0 / OpenID Tùy chọn nhà cung cấp dịch vụ kết nối (Google, Facebook, v.v.) là an toàn nhất. Bạn sẽ hỗ trợ một hoặc nhiều nhà cung cấp trong số này nếu có thể (tuỳ thuộc vào người dùng của bạn cơ sở).

Xác thực bằng mật khẩu email: đặt hạn mức chặt chẽ cho điểm cuối đăng nhập để ngăn chặn các cuộc tấn công brute force

Nếu bạn sử dụng dịch vụ xác thực bằng mật khẩu email được quản lý của Firebase, hãy siết chặt hạn mức mặc định của điểm cuối identitytoolkit.googleapis.com để ngăn chặn thuật toán brute buộc các cuộc tấn công. Bạn có thể làm như vậy từ Trang API Bộ công cụ nhận dạng trong bảng điều khiển Google Cloud.

Xác thực mật khẩu email: Bật tính năng bảo vệ liệt kê email

Nếu bạn sử dụng dịch vụ xác thực email-mật khẩu do Firebase quản lý, bật tính năng bảo vệ liệt kê email, nhằm ngăn chặn đối tượng độc hại lợi dụng điểm cuối xác thực của dự án để đoán tên tài khoản.

Nâng cấp lên Google Cloud Identity Platform để xác thực đa yếu tố

Để tăng cường khả năng bảo mật khi đăng nhập, bạn có thể thêm tính năng hỗ trợ xác thực đa yếu tố bằng cách nâng cấp lên Google Cloud Identity Platform. Mã Firebase Authentication hiện tại của bạn sẽ tiếp tục hoạt động sau khi bạn nâng cấp.

Xác thực ẩn danh

Chỉ sử dụng phương thức xác thực ẩn danh để làm quen với quy trình làm quen

Chỉ sử dụng phương thức xác thực ẩn danh để lưu trạng thái cơ bản cho người dùng trước khi họ đăng nhập. Xác thực ẩn danh không thay thế cho người dùng đăng nhập.

Chuyển đổi người dùng sang một phương thức đăng nhập khác nếu họ muốn dữ liệu của mình trên các thiết bị khác

Dữ liệu xác thực ẩn danh sẽ không tồn tại nếu người dùng xoá dữ liệu cục bộ hoặc chuyển đổi thiết bị. Nếu bạn cần duy trì dữ liệu sau khi ứng dụng khởi động lại vào một thiết bị duy nhất, chuyển đổi người dùng sang một tài khoản vĩnh viễn.

Sử dụng các quy tắc bảo mật yêu cầu người dùng phải chuyển đổi thành nhà cung cấp dịch vụ đăng nhập hoặc đã xác minh email của mình

Bất kỳ ai cũng có thể tạo tài khoản ẩn danh trong dự án của bạn. Với suy nghĩ đó, bảo vệ tất cả dữ liệu không công khai bằng quy tắc bảo mật yêu cầu các phương thức đăng nhập cụ thể hoặc địa chỉ email đã xác minh.

Ví dụ:

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

Cloud Functions ném bóng chậm

Không bao giờ đưa thông tin nhạy cảm vào các biến môi trường

Thông thường trong một ứng dụng Node.js tự lưu trữ, bạn sử dụng các biến môi trường để chứa thông tin nhạy cảm như khoá riêng tư. Đừng thực hiện việc này trong Cloud Functions. Vì Cloud Functions sử dụng lại môi trường giữa các lệnh gọi hàm, không được dùng thông tin nhạy cảm được lưu trữ trong môi trường.

  • Để lưu trữ các khoá API Firebase (không phải là khoá bí mật), chỉ nhúng chúng vào mã.

  • Nếu đang sử dụng Firebase Admin SDK trong Cloud Functions, thì bạn không cần để cung cấp thông tin đăng nhập tài khoản dịch vụ một cách rõ ràng, vì Admin SDK có thể tự động thu nạp chúng trong quá trình khởi tạo.

  • Nếu bạn đang gọi API Google và API Google Cloud cần có tài khoản dịch vụ thông tin xác thực, thư viện Xác thực của Google cho Node.js có thể lấy các thông tin đăng nhập này từ thông tin xác thực mặc định của ứng dụng, được tự động điền vào Cloud Functions.

  • Để cung cấp khoá riêng tư và thông tin đăng nhập cho các dịch vụ không phải của Google cho người dùng Cloud Functions, sử dụng Secret Manager.

Mã hoá thông tin nhạy cảm

Nếu không thể tránh được việc truyền thông tin nhạy cảm đến các hàm, bạn phải đưa ra giải pháp tuỳ chỉnh của riêng mình để mã hoá thông tin.

Các hàm đơn giản sẽ an toàn hơn; nếu bạn cần sự phức tạp, hãy cân nhắc Cloud Run

Cố gắng giữ cho các chức năng của bạn cơ bản và dễ hiểu nhất có thể. Độ phức tạp trong hàm của bạn thường dẫn đến lỗi khó phát hiện hoặc hành vi không mong muốn.

Nếu bạn cần cấu hình logic hoặc môi trường phức tạp, hãy cân nhắc sử dụng Cloud Run thay vì Cloud Functions.

Quản lý môi trường

Thiết lập dự án phát triển và thử nghiệm

Thiết lập các dự án Firebase riêng biệt để phát triển, thử nghiệm và phát hành chính thức. Đừng hợp nhất mã ứng dụng khách vào phiên bản chính thức cho đến khi mã đó được kiểm thử so với thử nghiệm dự án.

Giới hạn quyền truy cập của nhóm vào dữ liệu thực tế

Nếu làm việc với một nhóm lớn hơn, bạn có thể giảm thiểu hậu quả của sai sót và sự cố vi phạm bằng cách giới hạn quyền truy cập vào dữ liệu sản xuất thông qua các vai trò IAM định sẵn hoặc các vai trò IAM tuỳ chỉnh.

Nếu nhóm của bạn sử dụng Firebase Local Emulator Suite (nên dùng) để phát triển, thì bạn có thể không cần cấp quyền truy cập rộng hơn vào dự án sản xuất.

Quản lý thư viện

Chú ý đến lỗi chính tả trong thư viện hoặc trình bảo trì mới

Khi thêm thư viện vào dự án của bạn, hãy đặc biệt chú ý đến tên của và những người duy trì thư viện. Một thư viện có tên tương tự như thư viện mà bạn định dùng cài đặt có thể chứa mã độc hại.

Không cập nhật thư viện khi chưa hiểu rõ các thay đổi

Xem qua nhật ký thay đổi của mọi thư viện mà bạn sử dụng trước khi nâng cấp. Đảm bảo bản nâng cấp sẽ gia tăng giá trị và kiểm tra để chắc chắn rằng đơn vị bảo trì vẫn là bên của bạn tin cậy.

Cài đặt thư viện bộ theo dõi dưới dạng phần phụ thuộc dành cho nhà phát triển hoặc kiểm thử

Sử dụng một thư viện như Snyk để quét dự án của bạn đối với các phần phụ thuộc không an toàn.

Thiết lập tính năng giám sát cho Cloud Functions; kiểm tra sau khi cập nhật thư viện

Nếu bạn sử dụng SDK trình ghi nhật ký Cloud Functions, sau đó bạn có thể giám sát và nhận cảnh báo về hành vi bất thường, bao gồm cả hành vi do cập nhật thư viện gây ra.