Để 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 nhất thiết sẽ áp dụng cho các 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 , Cơ sở dữ liệu thời gian thực , Lưu trữ đám mây và Lưu trữ
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 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ỉ các ứ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 Kiểm tra ứng dụng cho mọi dịch vụ hỗ trợ dịch vụ đó.
Đị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 bình thường
Chức năng đám mây tự động thay đổi quy mô để đáp ứng nhu cầu của ứng dụng của bạn, nhưng trong trường hợp bị tấn công, điều này có thể có nghĩa là một hóa đơn 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 mình.
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, hạn ngạch thường sẽ được kích hoạt và tự động điều tiết lưu lượng truy cập đến ứng dụng của bạn. Đảm bảo theo dõi bảng điều khiển Sử dụng và thanh toán của bạ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 tự DOS: kiểm tra các chức năng cục bộ với trình giả lập
Bạn có thể dễ dàng vô tình tự DOS trong khi phát triển Chức năng đám mây: chẳng hạn như bằng cách tạo vòng lặp ghi kích hoạt vô hạn. Bạn có thể ngăn những lỗi này ảnh hưởng đến các dịch vụ đang hoạt động bằng cách thực hiện quá trình phát triển của mình với bộ giả lập Firebase .
(Và nếu bạn vô tình tự làm DOS, hãy hủy triển khai chức năng của bạn bằng cách xóa nó khỏi index.js
, sau đó chạy
.)
Khi khả năng phản hồi theo thời gian thực ít quan trọng hơn, cấu trúc hoạt động theo cách phòng thủ
Nếu bạn không cần trình bày kết quả của một chức năng 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 lô: xuất bản kết quả cho chủ đề Pub/Sub và xử lý kết quả theo định kỳ với chức năng đã lên lịch .
Hiểu các khóa API
Khóa API cho dịch vụ Firebase không bí mật
Firebase chỉ sử dụng các 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 và không kiểm soát quyền truy cập vào cơ sở dữ liệu hoặc dữ liệu Lưu trữ đám mây, điều 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 các khóa API cho các 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
Là một biện pháp ngăn chặn bổ sung chống lại kẻ tấn công đang cố 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 các 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ư các khóa API cho các dịch vụ Firebase, các khóa máy chủ FCM (được sử dụng bởi API HTTP FCM kế thừa ) 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ư các khóa API cho các dịch vụ Firebase, các khóa riêng tư của tài khoản dịch vụ (do 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 trong chế độ sản xuất hoặc bị 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 phiên bản cơ sở dữ liệu mới.
Đối với Lưu trữ đám mây, 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
Khô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, hãy viết quy tắc bảo mật của nó trước.
Quy tắc bảo mật kiểm tra đơn vị với Bộ giả lập; 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ộ trình giả lập 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 Firestore và Cơ sở dữ liệu thời gian thực .
xác thực
Xác thực tùy chỉnh: đúc JWT từ môi trường (phía máy chủ) đáng tin cậy
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 tại của mình để xác thực bằng 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 ứng dụng khách của bạn, ứng dụng này 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à nhà cung cấp 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ì các 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 các đ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 của API trong Google Cloud Console .
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 chặ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 để đoán tên tài khoản.
Nâng cấp lên 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 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 để giới thiệu ấm áp
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 phải là sự thay thế cho đă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 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 duy trì dữ liệu sau khi 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 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 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 đã 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 đối 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 các lỗi 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 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ộ giả lập để phát triển, bạn có thể không cần cấp quyền truy cập rộng hơn cho 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à những 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.
Khô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 làm tăng thêm giá trị và kiểm tra xem bên bảo trì có còn là bên mà bạn tin tưởng hay không.
Cài đặt các thư viện giám sát dưới dạng phần phụ thuộc của nhà phát triển hoặc thử nghiệm
Sử dụng thư viện chẳng hạ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ý Chức năng đám mây , 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ư. Không làm điều này trong Chức năng đám mây . Vì Cloud Function sử dụng lại các môi trường giữa các lần gọi hàm, nên thông tin nhạy cảm không được lưu trữ trong môi trường.
- Để lưu trữ các khóa API Firebase, không phải là khóa 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 các thông tin này trong quá trình khởi tạo.
- Nếu bạn đang gọi Google và Google Cloud API yêu cầu thông tin đăng nhập tài khoản dịch vụ, thì thư viện Google Auth dành cho Node.js có thể lấy các thông tin đăng nhập này từ thông tin đăng nhập mặc định của ứng dụng , được tự động điền trong Cloud Function.
- Để cung cấp khóa riêng tư và thông tin đăng nhập 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 của đám mây .
Mã hóa thông tin nhạy cảm
Nếu bạn không thể tránh việc chuyển thông tin nhạy cảm đến Chức năng đám mây của mình, thì 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 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 Function.