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

Để giữ an toàn cho tài nguyên Firebase và dữ liệu của người dùng, hãy làm theo các nguyên tắc sau. Không phải mọi mục đều nhất thiết phải áp dụng theo yêu cầu của bạn nhưng hãy ghi nhớ chúng khi bạn phát triển ứng dụng của mình.

Tránh giao thông lạm dụng

Thiết lập 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 lạm dụng, chẳng hạn như 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 cho 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, hãy liên hệ với bộ phận Hỗ trợ càng sớm càng tốt để cho họ biết điều gì đang xảy ra.

Bật kiểm tra ứng dụng

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

Định cấu hình Chức năng đám mây của bạn để mở rộng quy mô cho lưu lượng truy cập thông thường

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

Thiết lập cảnh báo để được thông báo khi gần đạt đến giới hạn

Nếu dịch vụ của bạn có yêu cầu tăng đột biến, thường thì hạn ngạch sẽ được áp dụng và tự động điều tiết lưu lượng truy cập vào ứng dụng của bạn. Đảm bảo giám sát bảng điều khiển Sử dụng và thanh toán nhưng bạn cũng có thể đặt cảnh báo ngân sách cho dự án của mình để đượ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ự DOS: kiểm tra các chức năng cục bộ bằng trình mô phỏng

Bạn có thể dễ dàng vô tình làm DOS khi phát triển Chức năng đám mây: ví dụ: bằng cách tạo vòng lặp kích hoạt-ghi vô hạn. Bạn có thể ngă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 quá trình phát triển của mình với bộ mô phỏng Firebase .

(Và nếu bạn vô tình sử dụng DOS, hãy hủy triển khai chức năng của mình bằng cách xóa nó khỏi index.js rồi chạy firebase deploy --only functions .)

Khi khả năng đáp ứng theo thời gian thực ít quan trọng hơn thì cấu trúc có chức năng phòng thủ

Nếu không cần hiển thị kết quả của một hàm trong 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ả theo đợt: xuất bản kết quả lên chủ đề Pub/Sub và xử lý kết quả theo định kỳ bằng hàm được lên lịch .

Hiểu khóa API

Khóa API cho dịch vụ Firebase không phải là bí mật

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

Thiết lập phạm vi khóa API

Để ngăn chặn kẻ tấn công cố gắng sử dụng khóa API của bạn để giả mạo các yêu cầu, bạn có thể tạo khóa API trong phạm vi ứng dụng khách của mình .

Giữ bí mật khóa máy chủ FCM

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

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

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

Quy tắc bảo mật

Khởi tạo quy tắc ở chế độ sản xuất hoặc chế độ khóa

Khi bạn thiết lập Cloud Firestore, Cơ sở dữ liệu thời gian thực và Lưu trữ đám mây, hãy khởi tạo các quy tắc bảo mật của bạn để 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 các tài nguyên cụ thể khi bạn phát triển ứng dụng của mình.

Đây là một trong những cài đặt mặc định cho các phiên bản mới của Cloud Firestore (chế độ sản xuất) và Cơ sở dữ liệu thời gian thực (chế độ khóa). Chọn tùy chọn này khi thiết lập một phiên bản cơ sở dữ liệu mới.

Đối với Cloud Storage, hãy bắt đầu với cấu hình quy tắc 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 lược đồ; 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 của mình, như một loại nhiệm vụ trước khi ra mắt. Thay vào đó, hãy viết các quy tắc bảo mật khi bạn viết ứng dụng của mình, coi chúng như một lược đồ cơ sở dữ liệu: bất cứ khi nào bạn cần sử dụng một loại tài liệu hoặc cấu trúc đường dẫn mới, trước tiên hãy viết quy tắc bảo mật của nó.

Quy tắc bảo mật kiểm tra đơn vị với Bộ mô phỏng; thêm nó vào CI

Để đảm bảo các quy tắc bảo mật của bạn theo kịp sự phát triển của ứng dụng, hãy kiểm tra đơn vị các quy tắc của bạn bằng bộ mô phỏng Firebase và thêm các thử nghiệm này vào quy trình CI của bạn. Xem các hướng dẫn này về Cloud FirestoreCơ sở dữ liệu thời gian thực .

Xác thực

Xác thực tùy chỉnh: tạo 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 tùy chỉnh hay dịch vụ của bên thứ ba, thì bạn có thể sử dụng hệ thống hiện có của mình để xác thực bằng các dịch vụ Firebase. Tạo JWT tùy chỉnh từ một môi trường đáng tin cậy, sau đó chuyển mã thông báo cho khách hàng của bạn, 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 xác thực tùy 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à an toàn 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 thì tùy chọn nhà cung cấp OAuth 2.0 / OpenID Connect (Google, Facebook, v.v.) là an toàn nhất. Bạn nên hỗ trợ một hoặc nhiều nhà cung cấp này nếu có thể (tùy thuộc vào cơ sở người dùng của bạn).

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

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

Xác thực mật khẩu email: Kích hoạ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 mật khẩu email được quản lý của Firebase, hãy bật tính năng bảo vệ liệt kê email để ngăn các tác nhân độc hại lạm dụng điểm cuối xác thực của dự án của bạn để đoán tên tài khoản.

Nâng cấp lên Nền tảng nhận dạng đám mây để xác thực đa yếu tố

Để tăng cường bảo mật khi đăng nhập, bạn có thể thêm hỗ trợ xác thực đa yếu tố bằng cách nâng cấp lên Cloud Identity Platform . Mã xác thực Firebase 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 xác thực ẩn danh để làm quen

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

Chuyển đổi người dùng sang phương thức đăng nhập khác nếu họ muốn có dữ liệu khi mất điện thoại

Dữ liệu xác thực ẩn danh sẽ không tồn tại nếu người dùng xóa bộ nhớ cục bộ hoặc chuyển đổi thiết bị. Nếu bạn cần lưu giữ dữ liệu ngoài việc khởi động lại ứng dụng trên một thiết bị, hãy chuyển đổi người dùng thành tài khoản cố định .

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 họ

Bất cứ ai cũng có thể tạo một tài khoản ẩn danh trong dự án của bạn. Với ý nghĩ đó, hãy bảo vệ tất cả dữ liệu không công khai bằng các 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 đã được 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;

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

Thiết lập các dự án phát triển và dàn dựng

Thiết lập các dự án Firebase riêng biệt để phát triển, dàn dựng và sản xuất. Không hợp nhất mã máy khách vào sản xuất cho đến khi nó được thử nghiệm với dự án dàn dựng.

Giới hạn quyền truy cập của nhóm vào dữ liệu sản xuấ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 những sai sót và vi phạm bằng cách hạn chế quyền truy cập vào dữ liệu sản xuất bằng cách sử dụng các vai trò được xác định trước hoặc vai trò IAM tùy chỉnh.

Nếu nhóm của bạn sử dụng bộ mô phỏng để phát triển, 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

Coi chừng lỗi chính tả của thư viện hoặc người bảo trì mới

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

Đừng cập nhật thư viện mà không hiểu những thay đổi

Xem qua nhật ký thay đổi của bất kỳ thư viện nào bạn sử dụng trước khi nâng cấp. Hãy chắc chắn rằng việc nâng cấp sẽ tăng thêm giá trị và kiểm tra xem người bảo trì có còn là bên mà bạn tin tưởng hay không.

Cài đặt thư viện giám sát dưới dạng phụ thuộc dev hoặc test

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

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

Nếu sử dụng SDK ghi nhật ký Cloud Functions , bạn có thể theo dõi và được 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.

An toàn chức năng đám mây

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

Thông thường, trong ứ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ư khóa riêng tư. Đừng làm điều này trong Cloud Functions . Vì Cloud Functions tái sử dụng môi trường giữa các lần gọi hàm nên thông tin nhạy cảm sẽ không được lưu trữ trong môi trường.

  • Để lưu trữ các khóa API Firebase, không bí mật , chỉ cần nhúng chúng vào mã.
  • Nếu đang sử dụng SDK quản trị Firebase trong Chức năng đám mây thì bạn không cần cung cấp thông tin xác thực tài khoản dịch vụ một cách rõ ràng vì SDK có thể tự động lấy chúng trong quá trình khởi tạo.
  • Nếu bạn đang gọi API của Google và Google Cloud yêu cầu thông tin xác thực tài khoản dịch vụ thì thư viện Google Auth cho Node.js có thể nhận các thông tin xác thực 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 Chức năng đám mây.
  • Để cung cấp khóa riêng tư và thông tin xác thực cho các dịch vụ không phải của Google cho Chức năng đám mây của bạn, hãy sử dụng Trình quản lý bí mật đám mây .

Mã hóa thông tin nhạy cảm

Nếu không thể tránh chuyển thông tin nhạy cảm tới Chức năng đám mây của mình, bạn phải đưa ra giải pháp tùy chỉnh của riêng mình để mã hóa thông tin.

Các chức năng đơn giản sẽ an toàn hơn; nếu bạn cần sự phức tạp, hãy xem xét Cloud Run

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

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