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ý Security Rules. Mỗi công cụ 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 API quản lý Quy tắc bảo mật của Firebase ở phần phụ trợ.

Bất kể bạn sử dụng công cụ nào để gọi API quản lý, API này đều:

  • Nhận một nguồn Quy tắc: một tập hợp quy tắc, thường là một tệp mã chứa Firebase Security Rules câu lệnh.
  • Lưu trữ nguồn đã nhận dưới dạng tập hợp quy tắc bất biến.
  • Theo dõi việc 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ụ hỗ trợ Quy tắc bảo mật của Firebase sẽ tra cứu 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 Firebase CLI

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 kiểm thử cục bộ đầy đủ đối với nguồn.Firebase Local Emulator Suite

Việc sử dụng CLI cho phép bạn quản lý phiên bản của các quy tắc bằng mã xử lý ứng dụng và triển khai quy tắc như một phần của 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 Firebase CLI, bạn sẽ tạo một 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 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 Firebase CLI đều được phản ánh trong Firebase console hoặc bạn cập nhật nhất quán bằng Firebase console hoặc Firebase CLI. 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 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á cú pháp và ngữ nghĩa của 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ử. 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 cập nhật và kiểm thử Security Rules, hãy triển khai nguồn vào môi trường sản xuất.

Đố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.

Sử dụng các lệnh sau để chỉ triển khai Security Rules hoặc triển khai chúng như một phần của 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 chúng dưới dạng bản phát hành từ bảng điều khiển Firebase. Việc 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 của Firebase 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

  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 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.
  3. 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 ngữ nghĩa Security Rules 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 Security Rules Playground. 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. 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 dành cho quản trị viên

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 truy cập cho ứng dụng. Hãy viết mã Admin SDK code với tiêu chí bảo mật là ưu tiên 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 vài phút để lan truyền đầy đủ. Khi sử dụng Admin SDK để triển khai quy tắc, hãy đảm bảo 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 hoàn tất quá trình triển khai. 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 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 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 hạn mức sau:

  • 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ối đa 2500 tập hợp quy tắc đã triển khai. Khi đạt đến hạn mức 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:

  1. Tạo nguồn tệp quy tắc (không bắt buộc)
  2. Tạo tập hợp quy tắc
  3. 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 StorageCloud 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);

Cùng một mẫu này hoạt động cho các Cloud Storage quy tắc 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()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ó bao gồm 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 bản triển khai rất lớn đạt đến hạn mức 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ả cá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 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 hạn mức sau:

  • 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ối đa 2500 tập hợp quy tắc đã triển khai. Khi đạt đến hạn mức 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ù chúng cũng áp dụng cho Cloud Storage Security Rules nữa.

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 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à:

  1. Tạo nguồn tệp quy tắc
  2. Tạo tập hợp quy tắc
  3. 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 được 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 nội dung này với cơ sở dữ liệu east_store bằng cách đặ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 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 mất vài phút để lan truyền đầy đủ. Khi sử dụng API REST quản lý để triển khai, hãy đảm bảo 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 hoàn tất quá trình triển khai.

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. 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 bản 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 bản triển khai rất lớn đạt đến hạn mức 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ả 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 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 FirestoreCloud Storage tài nguyên trong các dự án sản xuất.

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

  1. Xác định đối tượng JSON TestSuite để biểu thị một tập hợp các đối tượng TestCase
  2. 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 trong tệp testcase.json. Trong ví dụ này, chúng ta chuyển nguồn Security Rules ngôn ngữ nội tuyến 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 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ả cho tất cả các Security Rulesbiểu thức ngôn ngữ 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 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 chúng) 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 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, thì 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:

  1. 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 Security Rules hàm để truy cập vào Cloud Firestore. Nếu không, sau khi tắt tính năng này, việc đánh giá Security Rules sẽ khiến các yêu cầu Lưu trữ của bạn không thành công.

  2. 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 của 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 tiếp theo khi 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.