Firebase cung cấp cho bạn một số công cụ để quản lý 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 Firebase phụ trợ.
Bất kể công cụ nào được dùng để gọi API quản lý, API này đều:
- Nhập 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 được nhập dưới dạng bộ quy tắc không thể thay đổi.
- Theo dõi quá trình triển khai từng bộ quy tắc trong một bản phát hành. Các dịch vụ hỗ trợ Quy tắc bảo mật Firebase sẽ tra cứu bản phát hành cho một dự án để đánh giá từng yêu cầu về tài nguyên được bảo mật.
- Cung cấp khả năng chạy kiểm thử cú pháp và ngữ nghĩa của một quy tắc.
Sử dụng CLI Firebase
Với CLI Firebase, bạn có thể tải nguồn cục bộ lên và triển khai bản phát hành. Firebase Local Emulator Suite của CLI cho phép bạn kiểm thử đầy đủ các nguồn trên máy.
Việc sử dụng CLI cho phép bạn duy trì các quy tắc trong chế độ kiểm soát phiên bản bằng mã ứng dụng và triển khai các quy tắc trong quy trình triển khai hiện có.
Tạo tệp cấu hình
Khi đị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. 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 nguồn quy tắc ngay 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 Firebase hoặc bạn luôn cập nhật bằng bảng điều khiển Firebase hoặc CLI Firebase. Nếu không, bạn có thể ghi đè mọi bản cập nhật đã thực hiện trong bảng điều khiển Firebase.
Kiểm thử bản cập nhật
Local Emulator Suite cung cấp trình mô phỏng cho tất cả sản phẩm có hỗ trợ 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 thực hiện cả việc đánh giá ngữ pháp và ngữ nghĩa của các quy tắc, do đó vượt quá phạm vi kiểm thử ngữ 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ì Suite là một công cụ tuyệt vời để kiểm thử Firebase Security Rules. Hãy dùng Local Emulator Suite để kiểm thử cục bộ các bản cập nhật và xác nhận rằng Rules của ứng dụng thể hiện hành vi mà bạn muốn.
Triển khai bản cập nhật
Sau khi bạn cập nhật và kiểm thử Rules, hãy triển khai các nguồn vào giai đoạn phát hành 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 mặc định và cơ sở dữ liệu được đặt tên bổ sung bằng cách xem xét và cập nhật tệp firebase.json
.
Sử dụng các lệnh sau để triển khai riêng Rules hoặc triển khai các lệnh đó 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ển Firebase
Bạn cũng có thể chỉnh sửa nguồn Rules và triển khai các nguồn đó dưới dạng bản phát hành từ bảng điều khiển Firebase. Kiểm thử cú pháp được thực hiện khi bạn chỉnh sửa trong giao diện người dùng của bảng điều khiển Firebase và bạn có thể kiểm thử ngữ nghĩa bằng cách sử dụng Rules Playground.
Chỉnh sửa và cập nhật quy tắc
- Mở bảng điều khiển Firebase rồi chọn dự án của bạn.
- Sau đó, hãy chọn Realtime Database, Cloud Firestore hoặc Bộ nhớ trong trình đơn điều hướng sản phẩm, rồi nhấp vào Quy tắc để chuyển đến trình chỉnh sửa Rules.
- Chỉnh sửa quy tắc ngay trong trình chỉnh sửa.
Kiểm thử bản 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 soạn thảo, bạn có thể kiểm thử hành vi Rules ngữ nghĩa bằng cách sử dụng cơ sở dữ liệu và tài nguyên bộ nhớ của dự án ngay trong bảng điều khiển Firebase bằng Rules Playground. Mở màn hình Rules Playground (Sân chơi quy tắc) trong trình chỉnh sửa Rules, sửa đổi chế độ cài đặt rồi nhấp vào Run (Chạy). Tìm thông báo xác nhận ở đầu trình chỉnh sửa.
Triển khai các bản cập nhật
Khi bạn hài lòng với nội dung cập nhật, hãy nhấp vào Xuất bản.
Sử dụng SDK dành cho quản trị viên
Bạn có thể sử dụng Admin SDK cho nhóm quy tắc của Node.js. Với quyền truy cập 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.
- Dễ dàng quản lý các quy tắc trên nhiều dự án Firebase.
Khi cập nhật quy tắc theo phương thức lập trình, điều quan trọng là bạn phải tránh thực hiện các thay đổi ngoài ý muốn đối với quyền kiểm soát truy cập cho ứng dụng. Hãy viết mã Admin SDK của bạn 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 mất khoảng vài phút để truyền tải đầy đủ. Khi sử dụng Admin SDK để triển khai quy tắc, hãy nhớ tránh các tình huống tương tranh trong đó ứng dụng của bạn ngay lập tức dựa vào các quy tắc chưa triển khai xong. 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. Giải pháp này được thiết kế để giảm tình trạng tranh chấp mặc dù thường xuyên cập nhật.
Ngoài ra, hãy lưu ý các giới hạn sau:
- Quy tắc phải nhỏ hơn 256 KiB văn bản được mã hoá UTF-8 khi chuyển đổi tuần tự.
- Một dự án có thể có tối đa 2.500 quy tắc được triển khai. Khi đạt đến giới hạn này, bạn phải xoá một số bộ quy tắc cũ trước khi tạo bộ quy tắc mới.
Tạo và triển khai tập hợp quy tắc Cloud Storage hoặc Cloud Firestore
Một quy trình công việc điển hình để quản lý các 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 bộ quy tắc
- Phát hành hoặc triển khai bộ 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 quy tắc bảo mật Cloud Storage và Cloud Firestore. 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 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 bộ quy tắc và triển khai bộ 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 bộ quy tắc Realtime Database
Để cập nhật các 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 các tập quy tắc ở định dạng JSON hoặc dưới dạng một chuỗi có kèm theo chú thích.
Cách cập nhật bộ 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ý bộ quy tắc
Để giúp quản lý các bộ 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 hoạt động triển khai rất lớn đạt đến giới hạn 2500 bộ quy tắc theo thời gian, bạn có thể tạo logic để xoá các quy tắc cũ nhất trong một chu kỳ thời gian cố định. Ví dụ: để xoá tất cả tập hợp quy tắc đượ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 rất phù hợp với nhiều quy trình công việc, bao gồm cả việc quản lý Firebase Security Rules cho nhiều cơ sở dữ liệu Cloud Firestore trong dự á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:
- Quy tắc phải nhỏ hơn 256 KiB văn bản được mã hoá UTF-8 khi chuyển đổi tuần tự.
- Một dự án có thể có tối đa 2.500 quy tắc đã triển khai. Khi đạt đến giới hạn này, bạn phải xoá một số bộ quy tắc cũ trước khi tạo bộ quy tắc mới.
Tạo và triển khai quy tắc Cloud Firestore hoặc Cloud Storage bằng REST
Các ví dụ trong phần này sử dụng Firestore Rules, mặc dù những ví dụ này cũng áp dụng cho Cloud Storage Rules.
Các ví dụ cũng sử dụng cURL để thực hiện lệnh gọi API. Bỏ qua các bước thiết lập và truyền mã thông báo xác thực. Bạn có thể thử nghiệm với API này bằng cách sử dụng Trình khám phá API được tích hợp với tài liệu tham khảo.
Dưới đây là các bước thông thường để tạo và triển khai quy tắc bằng API quản lý:
- Tạo nguồn tệp quy tắc
- Tạo bộ quy tắc
- Phát hành (triển khai) bộ 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 Rules đã khoá vào 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 bộ quy tắc
Bây giờ, hãy tạo một vân tay số đượ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 để tạo 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, liên kết dữ liệu này với cơ sở dữ liệu east_store
, hãy đặ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 trả về phản hồi xác thực và tên bộ quy tắc, ví dụ: projects/secure_commerce/rulesets/uuid123
.
Phát hành (triển khai) một bộ quy tắc
Nếu bộ quy tắc hợp lệ, bước cuối cùng là triển khai bộ quy tắc mới trong bản phát hành đã đặt 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 mất vài phút để truyền tải đầy đủ. Khi sử dụng API REST quản lý để triển khai, hãy nhớ tránh những điều kiện thực hiện mà trong đó ứng dụng của bạn phải lập tức dựa vào các quy tắc mà quá trình triển khai chưa hoàn tất.
Cập nhật các bộ quy tắc Realtime Database bằng REST
Realtime Database cung cấp giao diện REST riêng để quản lý Rules. Xem phần Quản lý Firebase Realtime Database Rules thông qua REST.
Quản lý bộ quy tắc bằng REST
Để giúp quản lý việc triển khai các 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ê, lấy và xoá quy tắc
- liệt kê, tải và xoá bản phát hành quy tắc
Đối với các hoạt động triển khai rất lớn đạt đến giới hạn 2500 bộ quy tắc theo thời gian, bạn có thể tạo logic để xoá các quy tắc cũ nhất trong một chu kỳ thời gian cố định. Ví dụ: để xoá tất cả các bộ quy tắc đượ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 khoá createTime
, sau đó gọi project.rulesets.delete
trên các bộ quy tắc tương ứng bằng ruleset_id
.
Kiểm thử bản cập nhật bằng REST
Cuối cùng, API quản lý cho phép bạn chạy kiểm thử cú pháp và ngữ nghĩa trên các tài nguyên Cloud Firestore và Cloud Storage trong các dự án sản xuất.
Quy trình kiểm thử với 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 các đố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
bằng một TestCase
trong tệp testcase.json
. Trong ví dụ này, chúng ta truyền nguồn ngôn ngữ Rules cùng dòng với tải trọng REST, cùng với bộ kiểm thử để chạy trên các quy tắc đó. Chúng ta chỉ định một kỳ vọng đánh giá Quy tắc và yêu cầu của ứng dụng mà theo đó 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" (ĐẦY ĐỦ) để cho biết kết quả của tất cả biểu thức ngôn ngữ Rules phải đượ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.
{ "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 kiểm thử SUCCESS/FAILURE, danh sách thông báo gỡ lỗi, danh sách 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 bằng trạng thái SUCCESS rằng quyền truy cập được cho phép đúng cách.
Quản lý quyền cho Cloud Storage Security Rules trên nhiều dịch vụ
Nếu tạo Cloud Storage Security Rules sử dụng Cloud Firestore nội dung tài liệu để đánh giá các điều kiện bảo mật, thì bạn sẽ được nhắc trong bảng điều khiển Firebase hoặc Firebase CLI để cấp quyền kết nối 2 sản phẩm này.
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 của bạn, xoá tất cả các câu lệnh sử dụng hàm Rules để truy cập vào Cloud Firestore. Nếu không, sau khi tính năng này bị tắt, các hoạt động đánh giá Rules sẽ khiến yêu cầu của bạn về Bộ nhớ không thành công.
Hãy dùng trang IAM trong Google Cloud Console để xoá vai trò "Firebase Rules Firestore Service Agent" bằng cách làm theo hướng dẫn của Cloud về cách thu hồi vai trò.
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ừ CLI Firebase hoặc bảng điều khiển Firebase.