Quản lý và triển khai Quy tắc bảo mật của Firebase

Firebase cung cấp cho bạn một số công cụ để quản lý Rules, mỗi công cụ một tiện ích hữu ích trong các trường hợp cụ thể và mỗi cách sử dụng cùng một Firebase phụ trợ API Quản lý quy tắc bảo mật.

Bất kể bạn dùng công cụ nào để gọi lệnh đó, API Quản lý:

  • Nhập nguồn Quy tắc: một bộ quy tắc, thường là tệp mã chứa 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. Khả năng bảo mật của Firebase Các dịch vụ có bật quy tắc tra cứu bản phát hành cho một dự án để đánh giá từng yêu cầu cho một tài nguyên được bảo mật.
  • Cung cấp khả năng chạy các kiểm thử cú pháp và ngữ nghĩa của một bộ 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. CLI Firebase Local Emulator Suite cho phép bạn thực hiện kiểm thử cục bộ đầy đủ đối với nguồn.

Việc sử dụng CLI cho phép bạn đảm bảo các quy tắc của mình nằm trong tầm kiểm soát phiên bản bằng mã xử lý ứng dụng và triển khai quy tắc trong quy trình triển khai hiện tại.

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 của bạn. Sử dụng để bắt đầu định cấu hình dự án Firebase của bạn:

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 chỉnh sửa mà 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 thường xuyên cập nhật bằng bảng điều khiển Firebase hoặc giao diện dòng lệnh (CLI) của Firebase. Nếu không, bạn có thể ghi đè bất kỳ các bản cập nhật được 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ả những Quy tắc bảo mật đã bật của Google dành cho doanh nghiệp. Công cụ Quy tắc bảo mật của mỗi trình mô phỏng thực hiện cả cú pháp và ngữ nghĩa của các quy tắc, do đó vượt quá việc kiểm tra cú pháp, 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à công cụ tuyệt vời cho Firebase Security Rules kiểm thử. Sử dụng Local Emulator Suite để kiểm thử bản cập nhật cục bộ 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 các 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 để sản xuất.

Đối với Cloud Firestore Security Rules, hãy liên kết .rules tệp với tệp mặc định và các cơ sở dữ liệu khác đã đặt tên bằng cách xem xét và cập nhật Tệp firebase.json.

Dùng các lệnh sau để triển khai có chọn lọc Rules một mình hoặc triển khai chúng như một phần 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 Rules nguồn và triển khai chúng dưới dạng bản phát hành từ bảng điều khiển Firebase. Kiểm tra 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à có thể kiểm thử ngữ nghĩa thông qua Sân chơi Rules.

Chỉnh sửa và cập nhật quy tắc

  1. Mở bảng điều khiển Firebase rồi chọn dự án của bạn.
  2. Sau đó, hãy chọn Realtime Database, Cloud Firestore hoặc Bộ nhớ trong điều hướng sản phẩm, rồi nhấp vào Quy tắc để chuyển đến Rules.
  3. Chỉnh sửa các 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 chỉnh sửa, bạn có thể kiểm thử ngữ nghĩa Hành vi Rules, 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 cách sử dụng Rules Playground. Mở Rules Playground trong trình chỉnh sửa Rules, sửa đổi chế độ cài đặt rồi nhấp vào Run (Chạy). Hã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 đúng như mong đợi, hãy nhấp vào Xuất bản.

Dùng SDK dành cho quản trị viên

Bạn có thể sử dụng Admin SDK cho Node.js quy tắc. 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ụ tuỳ chỉnh, tập lệnh, trang tổng quan và quy trình CI/CD để quản lý quy tắc.
  • Quản lý các 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 tạo các thay đổi ngoài ý muốn đối với chế độ kiểm soát quyền truy cập vào ứng dụng của bạn. Viết Admin SDK mã ưu tiên bảo mật, đặc biệt là khi cập nhật hoặc triển khai các 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 một trong vài phút để được truyền tải hoàn toàn. Khi sử dụng Admin SDK để triển khai các quy tắc, hãy đảm bảo tránh điều kiện tranh đấu mà ứng dụng của bạn dựa vào ngay lập tức đối với các quy tắc chưa hoàn tất việc triển khai. Nếu trường hợp sử dụng của bạn yêu cầu thường xuyên cập nhật 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, nhằm giảm tình trạng tương tranh, 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 đối với văn bản được mã hoá UTF-8 khi được chuyển đổi tuần tự.
  • Một dự án có thể có tổng cộng tối đa 2.500 tập hợp quy tắc được triển khai. Sau khi đạt đến giới hạn này đã đạt đến giới hạn, bạn phải xóa một số bộ quy tắc cũ trước khi tạo 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 ba bước riêng biệt:

  1. Tạo nguồn tệp quy tắc (không bắt buộc)
  2. Tạo bộ quy tắc
  3. Phát hành hoặc triển khai bộ quy tắc mới

SDK cung cấp 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 StorageCloud 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 này cũng áp dụng cho các quy tắc Cloud StoragereleaseFirestoreRulesetFromSource().

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 riêng bộ quy tắc để 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 tập hợp Realtime Database bằng Admin SDK, hãy sử dụng getRules() và Phương thức setRules() của admin.database. Bạn có thể truy xuất tập hợp quy tắc trong JSON định dạng hoặc dưới dạng 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ý tập hợp quy tắc

Để giúp quản lý các tập quy tắc lớn, Admin SDK cho phép bạn liệt kê mọi quy tắc hiện có cùng với 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 làm việc, bao gồm Quản lý Firebase Security Rules cho nhiều cơ sở dữ liệu Cloud Firestore trong dự án của bạn, nhưng bạn nên quản lý và triển khai Firebase Security Rules bằng chính API quản lý. API quản lý mang đến cho bạn tính 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 đối với văn bản được mã hoá UTF-8 khi được chuyển đổi tuần tự.
  • Một dự án có thể có tổng cộng tối đa 2.500 tập hợp quy tắc được triển khai. Sau khi đạt đến giới hạn này đã đạt đến giới hạn, bạn phải xóa một số bộ quy tắc cũ trước khi tạo quy tắc mới.

Tạo và triển khai tập hợp 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ù các ví dụ này áp dụng cho Cloud Storage Rules.

Các ví dụ này cũng sử dụng cURL để thực hiện lệnh gọi API. Các bước để thiết lập và vượt qua mã thông báo xác thực đã bị bỏ qua. Bạn có thể thử nghiệm với API này bằng cách sử dụng API Explorer được tích hợp với tài liệu tham khảo.

Các bước điển hình để tạo và triển khai bộ quy tắc bằng API quản lý là:

  1. Tạo nguồn tệp quy tắc
  2. Tạo bộ quy tắc
  3. Phát hành (triển khai) bộ quy tắc mới.

Tạo một nguồn

Giả sử bạn đang xử lý dự án Firebase secure_commerce và muốn để triển khai Cloud Firestore Rules đã khoá cho một cơ sở dữ liệu trong dự án có tên east_store.

Bạn có thể triển khai các quy tắc này trong 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 nhằm tạo bộ quy tắc với Lệnh gọi REST projects.rulesets.create. Ở đây, hãy 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 thông tin 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'

Ví dụ: API trả về phản hồi xác thực và tên bộ quy tắc 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 một bản phát hành.

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'

Lưu ý rằng các bản phát hành Firebase Security Rules sẽ mất vài phút để hoàn tất phổ biến. Khi triển khai API REST quản lý, hãy nhớ tránh tình huống tương tranh điều kiện trong đó ứng dụng của bạn ngay lập tức dựa vào các quy tắc mà quá trình triển khai vẫn chưa 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ý Rules. Xem Quản lý Firebase Realtime Database Rules thông qua REST.

Quản lý tập 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 cho tạo tập hợp quy tắc và bản phát hành, API quản lý 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ả tập hợp quy tắc đã triển khai trong hơn 30 ngày, bạn có thể gọi lệnh gọi projects.rulesets.list, phân tích cú pháp danh sách JSON của đối tượng Ruleset trên khoá createTime của họ, sau đó gọi project.rulesets.delete trên bộ quy tắc tương ứng theo 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 FirestoreCloud Storage trong bản phát hành công khai của bạn dự án.

Quy trình kiểm thử bằng thành phần này của API bao gồm:

  1. Xác định một đối tượng JSON TestSuite để biểu thị một tập hợp các đối tượng TestCase
  2. Đang gửi TestSuite
  3. 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 một testcase.json. Trong ví dụ này, chúng ta chuyển Rules nguồn ngôn ngữ cùng dòng với tải trọng REST, cùng với bộ kiểm thử để chạy về các quy tắc đó. Chúng tôi chỉ định kỳ vọng đánh giá Quy tắc và ứng dụng để kiểm tra bộ quy tắc. Bạn cũng có thể chỉ định cách hoàn thành báo cáo thử nghiệm, sử dụng giá trị "FULL" để cho biết kết quả cho tất cả Rules biểu thức ngôn ngữ phải được đưa vào báo cáo, bao gồm biểu thức không được đối sánh 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 tôi có thể gửi TestSuite này để đánh giá cùng với 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/KHÔNG HỢP LỆ kiểm thử, 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á tương ứng) 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 cho nhiều dịch vụ Cloud Storage Security Rules

Nếu bạn 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 bạn sẽ được nhắc trong bảng điều khiển Firebase hoặc Giao diện dòng lệnh (CLI) của Firebase để bật quyền để kết nối hai 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:

  1. Đầu tiên, trước khi vô hiệu hoá tính năng này, hãy chỉnh sửa quy tắc của bạn, xoá tất cả câu lệnh sử dụng hàm Rules để truy cập Cloud Firestore. Nếu không, sau khi tính năng này bị tắt, các đánh giá của Rules sẽ khiến yêu cầu Bộ nhớ của bạn không thực hiện được.

  2. Sử dụng trang IAM trong Google Cloud Console để xoá "Firebase Rules Firestore Service Agent" (Nhân viên hỗ trợ dịch vụ của Firestore) vai trò cụ thể bằng cách làm theo hướng dẫn về Cloud 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 lưu tiếp theo Quy tắc trên nhiều dịch vụ từ CLI Firebase hoặc bảng điều khiển Firebase.