Để bảo mật tài nguyên Firebase và dữ liệu của người dùng, hãy làm theo các hướng dẫn sau. Không phải mục nào cũng cần áp dụng cho các yêu cầu của bạn, nhưng hãy lưu ý đến các mục đó 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 tính năng giám sát và cảnh báo cho Cloud Firestore, Realtime Database, Cloud Storage và Hosting
Nếu bạn nghi ngờ ứng dụng của mình bị tấn công, hãy liên hệ với Nhóm hỗ trợ càng sớm càng tốt để cho họ biết điều gì đang xảy ra.
Bật App Check
Để đảm bảo chỉ các ứng dụng của bạn mới có thể truy cập vào dịch vụ phụ trợ, hãy bật Firebase App Check cho mọi dịch vụ hỗ trợ dịch vụ đó.
Định cấu hình Cloud Functions để 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 của ứng dụng, nhưng trong trường hợp bị tấn công, điều này có thể khiến bạn phải trả một khoản phí 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 thông thường cho ứng dụng của mình.
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 dịch vụ của bạn có sự gia tăng đột biến về số lượng yêu cầu, thường thì hạn mức sẽ được áp dụng và tự độ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 Mức sử dụng và thanh toán, nhưng bạn cũng có thể đặt cảnh báo về ngân sách trên dự án để được thông báo khi mức sử dụng tài nguyên vượt quá dự kiến.
Ngăn tự DOS: kiểm thử các hàm cục bộ bằng trình mô phỏng
Bạn có thể dễ dàng vô tình DOS chính mình trong khi phát triển Cloud Functions: ví dụ: bằng cách tạo một vòng lặp ghi kích hoạt vô hạn. Bạn có thể ngăn các lỗi này ảnh hưởng đến các dịch vụ trực tiếp bằng cách phát triển bằng Firebase Local Emulator Suite.
Và nếu bạn vô tình tự DOS, hãy huỷ triển khai hàm bằng cách xoá hàm đó khỏi index.js
, sau đó chạy firebase deploy --only functions
Khi khả năng phản hồi theo thời gian thực ít quan trọng hơn, hãy thiết kế các hàm có tính bảo 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 sai trái bằng cách xử lý kết quả theo lô: phát hành kết quả cho chủ đề Pub/Sub và xử lý kết quả theo chu kỳ đều đặn 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 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 cách sử dụ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á này một cách an toàn vào mã ứng dụng. 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
Để ngăn chặn thêm kẻ tấn công cố gắng sử dụng khoá API của bạn để giả mạo yêu cầu, bạn có thể thêm các quy tắc hạn chế đối với khoá API để giới hạn khoá API của bạn trong ứng dụng khách và các API mà bạn sử dụng.
Giữ bí mật khoá máy chủ FCM
Không giống như khoá API cho các dịch vụ Firebase, khoá máy chủ FCM (do API HTTP FCM cũ sử dụng) là 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ụ (do Firebase Admin SDK sử dụng) là thông tin nhạy cảm và phải được giữ bí mật.
Firebase Security Rules
Khởi chạy quy tắc ở chế độ phát hành công khai hoặc chế độ khoá
Khi bạn thiết lập Cloud Firestore, Realtime Database và Cloud Storage, hãy khởi chạy Firebase Security Rules để 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.
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ế độ phát hành chính thức) và Realtime Database (chế độ khoá). Đối với Cloud Storage, hãy bắt đầu bằng 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 giản đồ; hãy thêm quy tắc khi bạn thêm tài liệu
Đừng viết quy tắc bảo mật sau khi bạn viết ứng dụng, dưới dạng một loại tác vụ trước khi phát hành. Thay vào đó, hãy viết các quy tắc bảo mật khi bạn viết ứng dụng, coi 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 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 loại tài liệu hoặc cấu trúc đường dẫn đó.
Kiểm thử đơn vị các quy tắc bảo mật bằng Local Emulator Suite; thêm quy tắc đó vào CI
Để đảm bảo các quy tắc bảo mật của bạn luôn bắt kịp quá trình phát triển ứng dụng, hãy kiểm thử đơn vị các quy tắc của bạn bằng Firebase Local Emulator Suite và thêm các quy trình kiểm thử này vào quy trình CI. Hãy xem các hướng dẫn này về Cloud Firestore và Realtime Database.
Xác thực
Xác thực tuỳ chỉnh: tạo JWT từ một môi trường đáng tin cậy (phía máy chủ)
Nếu đã có một hệ thống đăng nhập bảo mật, cho dù đó là hệ thống tuỳ chỉnh hay dịch vụ của bên thứ ba, bạn có thể sử dụng hệ thống hiện có để xác thực bằng các dịch vụ 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 ứng dụng của bạn. Ứng dụng 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à an toàn nhất
Nếu bạn sử dụng các tính năng xác thực do Firebase quản lý, thì các tuỳ 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ể (tuỳ thuộc vào cơ sở người dùng của bạn).
Xác thực bằng email và mật khẩu: đặt hạn mức nghiêm ngặt cho điểm cuối đăng nhập để ngăn chặn các cuộc tấn công bằng phương thức brute force
Nếu bạn sử dụng dịch vụ xác thực bằng mật khẩu qua email do Firebase quản lý, hãy thắt chặt hạn mức mặc định của các điểm cuối identitytoolkit.googleapis.com
để ngăn chặn các cuộc tấn công bằng phương thức brute force. Bạn có thể thực hiện việc này trên trang API Bộ công cụ nhận dạng trong bảng điều khiển Google Cloud.
Xác thực bằng mật khẩu qua email: Bật tính năng bảo vệ tính năng liệt kê email
Nếu bạn sử dụng dịch vụ xác thực qua email và mật khẩu do Firebase quản lý, hãy bật tính năng bảo vệ liệt kê email để ngăn chặn các bên độc hại lợi dụng điểm cuối xác thực của dự án nhằm đ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 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 có 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
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ọ thực sự đăng nhập. Phương thức xác thực ẩn danh không thay thế cho quy trình đăng nhập của người dùng.
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 họ 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á 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 sau khi khởi động lại ứng dụng trên một thiết bị, hãy chuyển 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 đã chuyển đổi sang nhà cung cấp dịch vụ đăng nhập hoặc đã xác minh email của họ
Bất kỳ ai cũng có thể tạo tài khoản ẩn danh trong dự án của bạn. Do đó, 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 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 an toàn
Không bao giờ đặt thông tin nhạy cảm vào biến môi trường
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ư khoá riêng tư. Đừng làm 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, nên bạn không nên lưu trữ thông tin nhạy cảm trong môi trường.
Để lưu trữ khoá API Firebase (không bảo mật), bạn chỉ cần nhúng khoá vào mã.
Nếu đang sử dụng Firebase Admin SDK trong Cloud Functions, 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ì Admin SDK có thể tự động thu thập thông tin xác thực đó trong quá trình khởi chạy.
Nếu bạn đang gọi các 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ể lấy 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. Thông tin này được tự động điền vào Cloud Functions.
Để cung cấp khoá 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 Cloud Functions, hãy sử dụng Secret Manager.
Mã hoá thông tin nhạy cảm
Nếu không thể tránh 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 an toàn hơn; nếu bạn cần độ phức tạp, hãy cân nhắc Cloud Run
Cố gắng giữ cho các hàm của bạn càng cơ bản và dễ hiểu càng tốt. Tính phức tạp trong các hàm 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 cần logic phức tạp hoặc cấu hình môi trường, 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à dự án thử nghiệm
Thiết lập các dự án Firebase riêng biệt cho hoạt động 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 vào môi trường phát hành cho đến khi mã đó được kiểm thử trên dự án staging.
Hạn chế quyền truy cập của nhóm vào dữ liệu chính thức
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 các lỗi và 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 bằng cách sử dụng các vai trò IAM được xác định trước 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 phát hành chính thức.
Quản lý thư viện
Cảnh giác với lỗi chính tả trong thư viện hoặc người duy trì mới
Khi thêm thư viện vào dự án, hãy chú ý đến tên thư viện và người duy trì thư viện đó. Thư viện có tên tương tự như thư viện bạn định cài đặt có thể chứa mã độc.
Không cập nhật thư viện mà không hiểu rõ các thay đổi
Xem nhật ký thay đổi của mọi thư viện bạn sử dụng trước khi nâng cấp. Hãy đảm bảo rằng bản nâng cấp sẽ mang lại giá trị và kiểm tra để đảm bảo rằng trình bảo trì vẫn là bên mà bạn tin tưởng.
Cài đặt thư viện trình quan sát dưới dạng phần phụ thuộc 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 nhằm tìm 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 sử dụng SDK trình ghi nhật ký Cloud Functions, bạn có thể theo dõi và nhận cảnh báo về hành vi bất thường, bao gồm cả hành vi do bản cập nhật thư viện gây ra.