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ý các Quy tắc, mỗi công cụ sẽ hữu ích trong một số trường hợp cụ thể và mỗi công cụ sử dụng cùng một phần phụ trợ API quản lý Quy tắc bảo mật của Firebase.

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

  • Nhập nguồn quy tắc: một tập hợp các quy tắc, thường là một tệp mã chứa các câu lệnh Quy tắc bảo mật Firebase.
  • Lưu trữ nguồn được nhập dưới dạng tập quy tắc không thể thay đổi.
  • Theo dõi hoạt động triển khai từng bộ 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 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 kiểm thử cú pháp và ngữ nghĩa của một bộ quy tắc.

Sử dụng Giao diện dòng lệnh (CLI) của Firebase

Với Firebase CLI, bạn có thể tải các nguồn cục bộ lên và triển khai các bản phát hành. Bộ công cụ mô phỏng cục bộ Firebase của CLI cho phép bạn thực hiện kiểm thử cục bộ đầy đủ các nguồn.

Việc sử dụng CLI cho phép bạn duy trì các quy tắc trong phạm vi quản lý phiên bản bằng mã xử lý ứng dụng và triển khai các 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 Giao diện dòng lệnh (CLI) của Firebase, bạn sẽ tạo một 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 của bạn:

Cloud Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Cơ sở dữ liệu theo thời gian thực

// 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 các quy tắc

Chỉnh sửa nguồn quy tắc ngay trong tệp cấu hình .rules.

Hãy đảm bảo rằng mọi nội dung chỉnh sửa bạn thực hiện trong Giao diện dòng lệnh (CLI) của Firebase đều được phản ánh trong bảng điều khiển của Firebase hoặc bạn luôn cập nhật bằng cách sử dụng bảng điều khiển của Firebase hoặc CLI của 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 của Firebase.

Kiểm thử bản cập nhật

Bộ trình mô phỏng cục bộ 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 thực hiện cả việc đánh giá về 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ì Suite là một công cụ tuyệt vời để kiểm tra Quy tắc bảo mật của Firebase. Sử dụng Bộ công cụ mô phỏng cục bộ để kiểm thử bản cập nhật cục bộ và xác nhận rằng các Quy tắc của ứng dụng thể hiện 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ử các Quy tắc, hãy triển khai các nguồn cho quá trình sản xuất.

Đối với Quy tắc bảo mật của Cloud Firestore, 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ên bổ sung bằng cách xem xét và cập nhật tệp firebase.json của bạn.

Hãy sử dụng các lệnh sau để triển khai một mình các Quy tắc một cách có chọn lọc hoặc triển khai các Quy tắc này trong quá 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>

Cơ sở dữ liệu theo thời gian thực

// 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 của Firebase

Bạn cũng có thể chỉnh sửa nguồn Quy tắc và triển khai chúng dưới dạng bản phát hành từ bảng điều khiển của Firebase. Bạn có thể thực hiện kiểm thử cú pháp khi chỉnh sửa trong giao diện người dùng của bảng điều khiển Firebase và việc kiểm thử ngữ nghĩa có sẵn bằng Rules Playground.

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

  1. Mở bảng điều khiển của Firebase rồi chọn dự án của bạn.
  2. Sau đó, chọn Cơ sở dữ liệu theo thời gian thực, Cloud Firestore hoặc Bộ nhớ trong bảng đ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 quy tắc.
  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ử hành vi của Quy tắc ngữ nghĩa bằng cách sử dụng cơ sở dữ liệu và tài nguyên lưu trữ của dự án ngay trong bảng điều khiển của Firebase, bằng cách sử dụng Rules Playground. Mở màn hình Rules Playground trong Trình chỉnh sửa quy tắc, 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 nội dung cập nhật

Khi bạn đã hài lòng rằng nội dung cập nhật đúng như mong đợi, 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 SDK dành cho quản trị viên cho quy tắc 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 tuỳ chỉnh và quy trình CI/CD để 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 các 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 chế độ kiểm soát quyền truy cập của ứng dụng. Hãy lưu ý đến tính bảo mật khi viết mã của SDK dành cho quản trị viên, đặ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 Quy tắc bảo mật Firebase sẽ mất vài phút để có hiệu lực hoàn toàn. Khi sử dụng SDK dành cho quản trị viên để triển khai quy tắc, hãy đảm bảo tránh tình huống tương tranh, trong đó ứng dụng của bạn phải dựa vào ngay các quy tắc mà quá trình triển khai chưa hoàn tất. 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 quy tắc kiểm soát quyền truy cập, hãy cân nhắc sử dụng các giải pháp sử dụng Cloud Firestore, được thiết kế để giảm tình trạng tương tranh dù thường xuyên cập 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 chuyển đổi tuần tự.
  • Một dự án có thể có tổng cộng tối đa 2.500 bộ quy tắc được triển khai. Sau 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 bộ quy tắc trong Cloud Storage hoặc Cloud Firestore

Một quy trình thông thường để quản lý các quy tắc bảo mật bằng SDK dành cho quản trị viên có thể bao gồm 3 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 các quy tắc bảo mật của 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 này cũng áp dụng cho các quy tắc Cloud Storage có 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 riêng bộ quy tắc để kiểm soát các sự kiện này chặt chẽ hơn. 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 Cơ sở dữ liệu theo thời gian thực

Để cập nhật bộ quy tắc Cơ sở dữ liệu theo thời gian thực bằng SDK dành cho quản trị viên, hãy sử dụng phương thức getRules()setRules() của admin.database. Bạn có thể truy xuất các tập hợp quy tắc ở định dạng JSON hoặc dưới dạng chuỗi có nhận xét.

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 quy tắc lớn, SDK dành cho quản trị viên cho phép bạn liệt kê mọi 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 lần 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 theo chu kỳ thời gian cố định. Ví dụ: để xoá tất cả các 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.`);

Dùng API REST

Các công cụ được mô tả ở trên phù hợp với nhiều quy trình công việc, bao gồm cả việc quản lý Quy tắc bảo mật Firebase cho nhiều cơ sở dữ liệu Cloud Firestore trong dự án, nhưng bạn nên quản lý và triển khai Quy tắc bảo mật Firebase bằng chính API quản lý. API quản lý mang đến cho bạn tính linh hoạt tối đa.

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 chuyển đổi tuần tự.
  • Một dự án có thể có tổng cộng tối đa 2.500 bộ quy tắc được triển khai. Sau 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 bộ quy tắc trong Cloud Firestore hoặc Cloud Storage bằng REST

Các ví dụ trong phần này sử dụng Quy tắc Firestore, mặc dù các quy tắc này cũng áp dụng cho các Quy tắc của Cloud Storage.

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à chuyển mã thông báo xác thực đều bị bỏ qua. Bạn có thể thử nghiệm 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.

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 nguồn

Giả sử bạn đang thực hiện dự án Firebase secure_commerce và muốn triển khai các Quy tắc Cloud Firestore bị khoá cho 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 bộ quy tắc

Bây giờ, hãy tạo một vân tay số được mã hoá dưới dạng base64 cho tệp này. Sau đó, bạn có thể sử dụng nguồn trong tệp này để điền sẵn tải trọng cần thiết nhằm tạo bộ quy tắc bằng 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 mã 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ề một 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) 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 được đặ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 Quy tắc bảo mật của Firebase mất vài phút để có hiệu lực đầy đủ. Khi sử dụng API REST quản lý để triển khai, hãy nhớ tránh các điều kiện tranh đấu, trong đó ứng dụng của bạn sẽ dựa vào ngay các quy tắc mà quá trình triển khai chưa hoàn tất.

Cập nhật bộ quy tắc Cơ sở dữ liệu theo thời gian thực bằng REST

Cơ sở dữ liệu theo thời gian thực cung cấp giao diện REST riêng để quản lý các Quy tắc. Hãy xem bài viết Quản lý quy tắc cơ sở dữ liệu theo thời gian thực của Firebase thông qua REST.

Quản lý tập hợ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 để 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á các quy tắc
  • liệt kê, nhận và xoá quy tắc bản phát hành

Đối với các lần 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 theo chu kỳ thời gian cố định. Ví dụ: để xoá tất cả các tập hợp 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 phát hành chính thức.

Việc 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 có một TestCase duy nhất trong tệp testcase.json. Trong ví dụ này, chúng tôi truyền nguồn ngôn ngữ Quy tắc 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 tôi chỉ định kỳ vọng đánh giá Quy tắc và yêu cầu của ứng dụng về việc bộ 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 thử nghiệm, sử dụng giá trị "FULL" để cho biết kết quả cho tất cả biểu thức ngôn ngữ của Quy tắc cần có trong 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 THÀNH CÔNG/KHÔNG ĐẠT của 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á của các biểu thức đó) sẽ xác nhận 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 các Quy tắc bảo mật của Cloud Storage trên nhiều dịch vụ

Nếu tạo Quy tắc bảo mật của Cloud Storage sử dụng nội dung tài liệu trong 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 của Firebase hoặc CLI của Firebase cấp quyền để kết nối hai sản phẩm này.

Nếu bạn quyết định tắt các biện pháp bảo mật trên nhiều dịch vụ như vậy:

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

  2. Sử 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 dành cho Google 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ừ Firebase CLI hoặc bảng điều khiển của Firebase.