Firebase cung cấp cho bạn một số công cụ để quản lý Security Rules. Mỗi công cụ đều hữu ích trong các trường hợp cụ thể và mỗi công cụ đều sử dụng cùng một API quản lý Quy tắc bảo mật của Firebase ở phần phụ trợ.
Bất kể bạn dùng công cụ nào để gọi API quản lý, API này đều:
- Tiếp nhận nguồn Quy tắc: một tập hợp quy tắc, thường là một tệp mã chứa các câu lệnh Firebase Security Rules.
- Lưu trữ nguồn đã tiếp nhận dưới dạng tập hợp quy tắc bất biến.
- Theo dõi quá trình triển khai từng tập hợp quy tắc trong một bản phát hành. Các dịch vụ được bật Quy tắc bảo mật của Firebase sẽ tìm bản phát hành cho một dự án để đánh giá từng yêu cầu đối với một tài nguyên được bảo mật.
- Cung cấp khả năng chạy các bài kiểm thử cú pháp và ngữ nghĩa của một tập hợp quy tắc.
Sử dụng CLI Firebase
Với Firebase CLI, bạn có thể tải nguồn cục bộ lên và triển khai bản phát hành. Bộ mô phỏng cục bộ của Firebase trong CLI cho phép bạn thực hiện toàn bộ quá trình kiểm thử cục bộ đối với nguồn.Firebase Local Emulator Suite
Khi sử dụng CLI, bạn có thể kiểm soát phiên bản của các quy tắc bằng mã ứng dụng và triển khai quy tắc trong quy trình triển khai hiện có.
Tạo tệp cấu hình
Khi bạn định cấu hình dự án Firebase bằng CLI Firebase, bạn sẽ tạo
tệp cấu hình .rules trong thư mục dự án. Hãy sử dụng lệnh sau để bắt đầu định cấu hình dự án Firebase:
Cloud Firestore
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
Realtime Database
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
Cloud Storage
// Set up Storage in your project directory, creates a .rules file firebase init storage
Chỉnh sửa và cập nhật quy tắc
Chỉnh sửa trực tiếp nguồn quy tắc trong tệp cấu hình .rules.
Đảm bảo rằng mọi nội dung chỉnh sửa bạn thực hiện trong CLI Firebase đều được phản ánh trong bảng điều khiển của Firebase hoặc bạn cập nhật nhất quán bằng bảng điều khiển của Firebase hoặc CLI Firebase. Nếu không, bạn có thể ghi đè mọi nội dung cập nhật được thực hiện trong bảng điều khiển Firebase.
Kiểm thử nội dung cập nhật
Local Emulator Suite cung cấp trình mô phỏng cho tất cả các sản phẩm được bật Quy tắc bảo mật. Công cụ Quy tắc bảo mật cho mỗi trình mô phỏng sẽ thực hiện cả việc đánh giá cú pháp và ngữ nghĩa của các quy tắc, do đó vượt quá khả năng kiểm thử cú pháp mà API quản lý Quy tắc bảo mật cung cấp.
Nếu bạn đang làm việc với CLI, thì Bộ mô phỏng cục bộ là một công cụ tuyệt vời để Firebase Security Rules kiểm thử. Hãy sử dụng Local Emulator Suite để kiểm thử nội dung cập nhật cục bộ và xác nhận rằng Security Rules của ứng dụng có hành vi mà bạn muốn.
Triển khai nội dung cập nhật
Sau khi bạn cập nhật và kiểm thử Security Rules, hãy triển khai nguồn vào môi trường chính thức.
Đối với Cloud Firestore Security Rules, hãy liên kết các tệp .rules với cơ sở dữ liệu có tên mặc định và
bổ sung bằng cách xem xét và cập nhật tệp
firebase.json.
Hãy sử dụng các lệnh sau để chỉ triển khai Security Rules hoặc triển khai các lệnh này trong quy trình triển khai thông thường.
Cloud Firestore
// Deploy rules for all databases configured in your firebase.json firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>
Realtime Database
// Deploy your .rules file firebase deploy --only database
Cloud Storage
// Deploy your .rules file firebase deploy --only storage
Sử dụng bảng điều khiểnFirebase
Bạn cũng có thể chỉnh sửa Security Rules nguồn và triển khai các quy tắc này dưới dạng bản phát hành từ bảng điều khiển Firebase. Quá trình kiểm thử cú pháp sẽ được thực hiện khi bạn chỉnh sửa trong giao diện người dùng của Firebase bảng điều khiển và bạn có thể kiểm thử ngữ nghĩa bằng Sân chơi Security Rules.
Chỉnh sửa và cập nhật quy tắc
- Mở bảng điều khiển của Firebase rồi chọn dự án của bạn.
- Sau đó, hãy chọn Realtime Database, Cloud Firestore hoặc Storage trong phần điều hướng sản phẩm, rồi nhấp vào Rules để chuyển đến trình chỉnh sửa Security Rules.
- Chỉnh sửa trực tiếp quy tắc trong trình chỉnh sửa.
Kiểm thử nội dung cập nhật
Ngoài việc kiểm thử cú pháp trong giao diện người dùng của trình chỉnh sửa, bạn có thể kiểm thử hành vi của ngữ nghĩa Security Rules bằng cách sử dụng tài nguyên bộ nhớ và cơ sở dữ liệu của dự án, ngay trong bảng điều khiển Firebase bằng Sân chơi Security Rules. Mở màn hình Rules Playground trong trình chỉnh sửa Security Rules, sửa đổi chế độ cài đặt rồi nhấp vào Run. Hãy tìm thông báo xác nhận ở đầu trình chỉnh sửa.
Triển khai nội dung cập nhật
Sau khi bạn hài lòng với nội dung cập nhật, hãy nhấp vào Publish (Xuất bản).
Sử dụng SDK quản trị
Bạn có thể sử dụng Admin SDK cho Node.js tập hợp quy tắc. Với quyền truy cập theo phương thức lập trình này, bạn có thể:
- Triển khai các công cụ, tập lệnh, trang tổng quan và quy trình CI/CD tuỳ chỉnh để quản lý quy tắc.
- Quản lý quy tắc dễ dàng hơn trên nhiều dự án Firebase.
Khi cập nhật quy tắc theo phương thức lập trình, bạn cần tránh thực hiện các thay đổi không mong muốn đối với quyền kiểm soát quyền truy cập của ứng dụng. Hãy viết mã Admin SDK với tiêu chí bảo mật hàng đầu, đặc biệt là khi cập nhật hoặc triển khai quy tắc.
Một điều quan trọng khác cần lưu ý là các bản phát hành Firebase Security Rules sẽ mất vài phút để lan truyền hoàn toàn. Khi sử dụng Admin SDK để triển khai quy tắc, hãy tránh tình huống tương tranh (race condition) trong đó ứng dụng của bạn ngay lập tức dựa vào các quy tắc chưa được triển khai hoàn tất. Nếu trường hợp sử dụng của bạn yêu cầu cập nhật thường xuyên các quy tắc kiểm soát quyền truy cập, hãy cân nhắc các giải pháp sử dụng Cloud Firestore, được thiết kế để giảm tình huống tương tranh (race condition) mặc dù cập nhật thường xuyên.
Ngoài ra, hãy lưu ý các giới hạn sau:
- Các quy tắc phải nhỏ hơn 256 KiB văn bản được mã hoá UTF-8 khi được tuần tự hoá.
- Một dự án có thể có tối đa 2500 tập hợp quy tắc đã triển khai. Khi đạt đến giới hạn này, bạn phải xoá một số tập hợp quy tắc cũ trước khi tạo tập hợp quy tắc mới.
Tạo và triển khai Cloud Storage hoặc Cloud Firestore tập hợp quy tắc
Quy trình làm việc thông thường để quản lý quy tắc bảo mật bằng Admin SDK có thể bao gồm 3 bước riêng biệt:
- Tạo nguồn tệp quy tắc (không bắt buộc)
- Tạo tập hợp quy tắc
- Phát hành hoặc triển khai tập hợp quy tắc mới
SDK cung cấp một phương thức để kết hợp các bước này thành một lệnh gọi API duy nhất cho Cloud Storage và Cloud Firestore quy tắc bảo mật. Ví dụ:
const source = `service cloud.firestore {
match /databases/{database}/documents {
match /carts/{cartID} {
allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
}
}
}`;
// Alternatively, load rules from a file
// const fs = require('fs');
// const source = fs.readFileSync('path/to/firestore.rules', 'utf8');
await admin.securityRules().releaseFirestoreRulesetFromSource(source);
Mẫu tương tự này cũng áp dụng cho các quy tắc của Cloud Storage với releaseFirestoreRulesetFromSource().
Ngoài ra, bạn có thể tạo tệp quy tắc dưới dạng đối tượng trong bộ nhớ, tạo tập hợp quy tắc và triển khai tập hợp quy tắc riêng biệt để kiểm soát chặt chẽ hơn các sự kiện này. Ví dụ:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Cập nhật tập hợp quy tắc Realtime Database
Để cập nhật tập hợp quy tắc Realtime Database bằng Admin SDK, hãy sử dụng các phương thức getRules() và
setRules() của admin.database. Bạn có thể truy xuất tập hợp quy tắc ở định dạng JSON hoặc dưới dạng chuỗi có kèm theo nhận xét.
Cách cập nhật tập hợp quy tắc:
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
Quản lý tập hợp quy tắc
Để giúp quản lý các tập hợp quy tắc lớn, Admin SDK cho phép bạn liệt kê tất cả các quy tắc hiện có
bằng admin.securityRules().listRulesetMetadata. Ví dụ:
const allRulesets = [];
let pageToken = null;
while (true) {
const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
allRulesets.push(...result.rulesets);
pageToken = result.nextPageToken;
if (!pageToken) {
break;
}
}
Đối với các quá trình triển khai rất lớn đạt đến giới hạn 2500 tập hợp quy tắc theo thời gian, bạn có thể tạo logic để xoá các quy tắc cũ nhất theo chu kỳ thời gian cố định. Ví dụ: để xoá tất cả tập hợp quy tắc đã triển khai trong hơn 30 ngày:
const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
const promises = [];
allRulesets.forEach((rs) => {
if (new Date(rs.createTime) < thirtyDays) {
promises.push(admin.securityRules().deleteRuleset(rs.name));
}
});
await Promise.all(promises);
console.log(`Deleted ${promises.length} rulesets.`);
Sử dụng API REST
Các công cụ được mô tả ở trên phù hợp với nhiều quy trình làm việc, bao gồm cả việc quản lý Firebase Security Rules cho nhiều Cloud Firestore cơ sở dữ liệu trong dự án của bạn, nhưng bạn có thể muốn quản lý và triển khai Firebase Security Rules bằng chính API quản lý. API quản lý mang lại cho bạn sự linh hoạt cao nhất.
Ngoài ra, hãy lưu ý các giới hạn sau:
- Các quy tắc phải nhỏ hơn 256 KiB văn bản được mã hoá UTF-8 khi được tuần tự hoá.
- Một dự án có thể có tối đa 2500 tập hợp quy tắc đã triển khai. Khi đạt đến giới hạn này, bạn phải xoá một số tập hợp quy tắc cũ trước khi tạo tập hợp quy tắc mới.
Tạo và triển khai Cloud Firestore hoặc Cloud Storage tập hợp quy tắc bằng REST
Các ví dụ trong phần này sử dụng Firestore Security Rules, mặc dù các quy tắc này cũng áp dụng cho Cloud Storage Security Rules nữa.
Các ví dụ cũng sử dụng cURL để thực hiện lệnh gọi API. Các bước thiết lập và chuyển mã thông báo xác thực sẽ bị bỏ qua. Bạn có thể thử nghiệm với API này bằng Trình khám phá API được tích hợp với tài liệu tham khảo.
Các bước thông thường để tạo và triển khai tập hợp quy tắc bằng API quản lý là:
- Tạo nguồn tệp quy tắc
- Tạo tập hợp quy tắc
- Phát hành (triển khai) tập hợp quy tắc mới.
Tạo nguồn
Giả sử bạn đang làm việc trên dự án Firebase secure_commerce và muốn
triển khai Cloud Firestore bị khoá Security Rules vào một cơ sở dữ liệu trong
dự án có tên là east_store.
Bạn có thể triển khai các quy tắc này trong tệp firestore.rules.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Tạo tập hợp quy tắc
Bây giờ, hãy tạo dấu vân tay được mã hoá base64 cho tệp này. Sau đó, bạn có thể sử dụng nguồn trong tệp này để điền tải trọng cần thiết nhằm tạo tập hợp quy tắc bằng lệnh gọi REST projects.rulesets.create. Tại đây, hãy sử dụng lệnh cat để chèn nội dung của firestore.rules vào tải trọng REST.
Để theo dõi, hãy liên kết tập hợp quy tắc này với cơ sở dữ liệu east_store, đặt attachment_point thành east_store.
curl -X POST -d '{
"source": {
"files": [
{
"content": "' $(cat storage.rules) '",
"name": "firestore.rules",
"fingerprint": <sha fingerprint>
},
"attachment_point": "firestore.googleapis.com/databases/east_store"
]
}
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'API này trả về phản hồi xác thực và tên tập hợp quy tắc, ví dụ: projects/secure_commerce/rulesets/uuid123.
Phát hành (triển khai) tập hợp quy tắc
Nếu tập hợp quy tắc hợp lệ, bước cuối cùng là triển khai tập hợp quy tắc mới trong một bản phát hành có tên.
curl -X POST -d '{
"name": "projects/secure_commerce/releases/cloud.firestore/east_store" ,
"rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'Xin lưu ý rằng các bản phát hành Firebase Security Rules sẽ mất vài phút để lan truyền hoàn toàn. Khi sử dụng API REST quản lý để triển khai, hãy tránh tình huống tương tranh (race condition) trong đó ứng dụng của bạn ngay lập tức dựa vào các quy tắc chưa được triển khai hoàn tất.
Cập nhật tập hợp quy tắc Realtime Database bằng REST
Realtime Database cung cấp giao diện REST riêng để quản lý Security Rules. Hãy xem bài viết Quản lý Firebase Realtime Database Security Rules thông qua REST.
Quản lý tập hợp quy tắc bằng REST
Để giúp quản lý các quá trình triển khai quy tắc lớn, ngoài phương thức REST để tạo tập hợp quy tắc và bản phát hành, API quản lý còn cung cấp các phương thức để:
- liệt kê, nhận và xoá tập hợp quy tắc
- liệt kê, nhận và xoá bản phát hành quy tắc
Đối với các quá trình triển khai rất lớn đạt đến giới hạn 2500 tập hợp quy tắc theo thời gian, bạn có thể tạo logic để xoá các quy tắc cũ nhất theo chu kỳ thời gian cố định. Ví dụ: để xoá tất cả tập hợp quy tắc đã triển khai trong hơn 30 ngày, bạn có thể gọi phương thức projects.rulesets.list, phân tích cú pháp danh sách JSON của các đối tượng Ruleset trên các khoá createTime, sau đó gọi project.rulesets.delete trên các tập hợp quy tắc tương ứng theo ruleset_id.
Kiểm thử nội dung cập nhật bằng REST
Cuối cùng, API quản lý cho phép bạn chạy các bài kiểm thử cú pháp và ngữ nghĩa trên Cloud Firestore và Cloud Storage tài nguyên trong các dự án chính thức.
Việc kiểm thử bằng thành phần này của API bao gồm:
- Xác định đối tượng JSON
TestSuiteđể biểu thị một tập hợp đối tượngTestCase - Gửi
TestSuite - Phân tích cú pháp các đối tượng
TestResultđược trả về
Hãy xác định đối tượng TestSuite có một TestCase trong tệp testcase.json. Trong ví dụ này, chúng tôi chuyển nguồn ngôn ngữ Security Rules
cùng với tải trọng REST, bên cạnh bộ kiểm thử để chạy
trên các quy tắc đó. Chúng tôi chỉ định kỳ vọng đánh giá Quy tắc và yêu cầu của máy khách mà tập hợp quy tắc sẽ được kiểm thử. Bạn cũng có thể chỉ định mức độ hoàn chỉnh của báo cáo kiểm thử bằng cách sử dụng giá trị "FULL" để cho biết kết quả của tất cả các biểu thức ngôn ngữ sẽ được đưa vào báo cáo, bao gồm cả các biểu thức không khớp với yêu cầu.Security Rules
{ "source": { "files": [ { "name": "firestore.rules", "content": "service cloud.firestore { match /databases/{database}/documents { match /users/{userId}{ allow read: if (request.auth.uid == userId); } function doc(subpath) { return get(/databases/$(database)/documents/$(subpath)).data; } function isAccountOwner(accountId) { return request.auth.uid == accountId || doc(/users/$(request.auth.uid)).accountId == accountId; } match /licenses/{accountId} { allow read: if isAccountOwner(accountId); } } }" } ] }, "testSuite": { "testCases": [ { "expectation": "ALLOW", "request": { "auth": {"uid": "123"}, "path": "/databases/(default)/documents/licenses/abcd", "method": "get"}, "functionMocks": [ { "function": "get", "args": [{"exact_value": "/databases/(default)/documents/users/123"}], "result": {"value": {"data": {"accountId": "abcd"}}} } ] } ] } }
Sau đó, chúng ta có thể gửi TestSuite này để đánh giá bằng phương thức projects.test.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'TestReport được trả về (chứa trạng thái THÀNH CÔNG/THẤT BẠI của bài kiểm thử, danh sách thông báo gỡ lỗi, danh sách các biểu thức Quy tắc đã truy cập và báo cáo đánh giá của các biểu thức đó) sẽ xác nhận với trạng thái THÀNH CÔNG rằng quyền truy cập được cho phép đúng cách.
Quản lý quyền đối với trên nhiều dịch vụCloud Storage Security Rules
Nếu bạn tạo Cloud Storage Security Rules sử dụng nội dung tài liệu Cloud Firestore để đánh giá các điều kiện bảo mật, bạn sẽ được nhắc trong bảng điều khiển Firebase hoặc CLI Firebase để bật quyền kết nối hai sản phẩm.
Nếu bạn quyết định tắt tính năng bảo mật trên nhiều dịch vụ như vậy:
Trước tiên, trước khi tắt tính năng này, hãy chỉnh sửa quy tắc, xoá tất cả các câu lệnh sử dụng các hàm Security Rules để truy cập vào Cloud Firestore. Nếu không, sau khi tính năng này bị tắt, quá trình đánh giá Security Rules sẽ khiến các yêu cầu về Bộ nhớ của bạn không thành công.
Sử dụng trang IAM trong Bảng điều khiển Google Cloud để xoá vai trò "Tác nhân dịch vụ Firestore của Quy tắc Firebase" bằng cách làm theo hướng dẫn về việc thu hồi vai trò trên Cloud.
Bạn sẽ được nhắc bật lại tính năng này vào lần tiếp theo bạn lưu Quy tắc trên nhiều dịch vụ từ Firebase CLI hoặc bảng điều khiển của Firebase.