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

Firebase cung cấp cho bạn một số công cụ để quản lý Quy tắc của bạn, mỗi công cụ hữu ích trong các 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 Firebase phụ trợ.

Bất kể công cụ nào được sử dụng để gọi nó, 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ác câu lệnh Quy tắc bảo mật Firebase.
  • Lưu trữ nguồn đã nhập dưới dạng bộ quy tắc bất biến .
  • Theo dõi việc 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 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 thử nghiệm 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 lên các nguồn cục bộ và triển khai các bản phát hành . Bộ mô phỏng cục bộ Firebase của CLI cho phép bạn thực hiện thử nghiệm toàn bộ nguồn cục bộ .

Việc sử dụng CLI cho phép bạn duy trì các quy tắc của mình dưới sự kiểm soát phiên bản bằng mã ứng dụng của bạn và các quy tắc triển khai như một phần của quy trình triển khai hiện tại của bạn.

Tạo một tập tin cấu hình

Khi định cấu hình dự án Firebase bằng Firebase CLI, bạn tạo tệp cấu hình .rules trong thư mục dự án của mình. Sử dụng lệnh sau để bắt đầu định cấu hình dự án Firebase của bạn:

Cửa hàng đám mây

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

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

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Lưu trữ đám mây

// 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 của bạn

Chỉnh sửa nguồn quy tắc của bạn trực tiếp trong tệp cấu hình .rules .

Đảm bảo rằng mọi chỉnh sửa bạn thực hiện trong Firebase CLI đều được phản ánh trong bảng điều khiển Firebase hoặc bạn luôn thực hiện cập nhật bằng bảng điều khiển Firebase hoặc Firebase CLI. Nếu không, bạn có thể ghi đè mọi bản cập nhật được thực hiện trong bảng điều khiển Firebase.

Kiểm tra cập nhật của bạn

Bộ mô phỏng cục bộ 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 đánh giá cả cú pháp và ngữ nghĩa của các quy tắc, do đó vượt quá thử nghiệm 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 Firebase. Sử dụng Bộ mô phỏng cục bộ để kiểm tra cục bộ các bản cập nhật của bạn và xác nhận rằng Quy tắc của ứng dụng của bạn thể hiện hành vi mà bạn muốn.

Triển khai các bản cập nhật của bạn

Sau khi bạn đã cập nhật và kiểm tra Quy tắc của mình, hãy triển khai các nguồn vào 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 được đặt tên mặc định và bổ sung của bạn bằng cách xem xét và cập nhật tệp firebase.json của bạn.

Sử dụng các lệnh sau để triển khai có chọn lọc Quy tắc của bạn hoặc triển khai chúng như một phần của quy trình triển khai thông thường.

Cửa hàng đám mây

// 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 thời gian thực

// Deploy your .rules file
firebase deploy --only database

Lưu trữ đám mây

// 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 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 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à kiểm tra ngữ nghĩa có sẵn bằng cách sử dụng Rules Playground.

Chỉnh sửa và cập nhật quy tắc của bạn

  1. Mở bảng điều khiển Firebase và chọn dự án của bạn.
  2. Sau đó, chọn Cơ sở dữ liệu thời gian thực , Cloud Firestore hoặc Storage từ điều hướng sản phẩm, sau đó nhấp vào Quy tắc để điều hướng đến trình chỉnh sửa Quy tắc.
  3. Chỉnh sửa quy tắc của bạn trực tiếp trong trình chỉnh sửa.

Kiểm tra cập nhật của bạn

Ngoài việc kiểm tra cú pháp trong giao diện người dùng trình soạn thảo, bạn có thể kiểm tra hành vi 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, trực tiếp trong bảng điều khiển Firebase bằng cách sử dụng Rules Playground . Mở màn hình Rules Playground trong trình chỉnh sửa Rules, sửa đổi cài đặt và 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 các bản cập nhật của bạn

Sau khi bạn hài lòng rằng nội dung cập nhật của mình đúng như những gì bạn mong đợi, hãy nhấp vào Xuất bản .

Sử dụng SDK quản trị

Bạn có thể sử dụng SDK quản trị cho bộ quy tắc Node.js. Với quyền truy cập theo chương trình này, bạn có thể:

  • Triển khai các công cụ, tập lệnh, bảng thông tin và quy trình CI/CD tùy 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 các quy tắc theo chương trình, điều quan trọng là tránh thực hiện các thay đổi ngoài ý muốn đối với kiểm soát quyền truy cập cho ứng dụng của bạn. Viết mã SDK quản trị của bạn với ưu tiên hàng đầu là 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 Quy tắc bảo mật Firebase sẽ mất khoảng vài phút để phổ biến đầy đủ. Khi sử dụng SDK quản trị để triển khai các quy tắc, hãy đảm bảo tránh các điều kiện chạy đua trong đó ứng dụng của bạn ngay lập tức dựa vào các quy tắc mà việc 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 cập nhật thường xuyên để truy cập các quy tắc kiểm soát, hãy xem xét các giải pháp sử dụng Cloud Firestore, được thiết kế để giảm các điều kiện chạy đua mặc dù có cập nhật thường xuyên.

Cũng lưu ý những giới hạn này:

  • Quy tắc phải nhỏ hơn 256 KiB của văn bản được mã hóa UTF-8 khi được tuần tự hóa.
  • Một dự án có thể có tối đa 2500 bộ quy tắc được triển khai. Khi đạt đến giới hạn này, bạn phải xóa 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 các bộ quy tắc Cloud Storage hoặc Cloud Firestore

Quy trình làm việc điển hình để quản lý các quy tắc bảo mật với SDK quản trị có thể bao gồm ba bước riêng biệt:

  1. Tạo nguồn tệp quy tắc (tùy chọn)
  2. Tạo một 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 pháp 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 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 hoạt động với 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 cơ sở dữ liệu thời gian thực

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

Để cập nhật mộ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, SDK quản trị cho phép bạn liệt kê tất cả các quy tắc hiện có 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 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 để xóa các quy tắc cũ nhất trong một chu kỳ thời gian cố định. Ví dụ: để xóa tất cả các bộ quy tắc được triển khai lâu 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 khác nhau, bao gồm quản lý Quy tắc bảo mật Firebase cho nhiều cơ sở dữ liệu Cloud Firestore trong dự án của bạn, nhưng bạn có thể muố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 sự linh hoạt cao nhất.

Cũng lưu ý những giới hạn này:

  • Quy tắc phải nhỏ hơn 256 KiB của văn bản được mã hóa UTF-8 khi được tuần tự hóa.
  • Một dự án có thể có tối đa 2500 bộ quy tắc được triển khai. Khi đạt đến giới hạn này, bạn phải xóa 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 các bộ quy tắc 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ù chúng cũng áp dụng cho Quy tắc lưu trữ đám mây.

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 bị bỏ qua. Bạn có thể thử nghiệm API này bằ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 một 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 làm việc trên dự án Firebase secure_commerce của mình và muốn triển khai các Quy tắc Cloud Firestore đã khóa cho cơ sở dữ liệu trong dự án của bạn có tên 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 một bộ quy tắc

Bây giờ, hãy tạo dấu vân tay được mã hóa 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 . 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 điều này với cơ sở dữ liệu east_store của bạn, 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 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 Quy tắc bảo mật Firebase sẽ mất khoảng vài phút để được phổ biến đầy đủ. Khi sử dụng API REST quản lý để triển khai, hãy đảm bảo tránh các điều kiện chạy đua trong đó ứng dụng của bạn ngay lập tức dựa vào các quy tắc mà việc triển khai chưa hoàn tất.

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

Cơ sở dữ liệu thời gian thực cung cấp giao diện REST riêng để quản lý Quy tắc. Xem Quản lý quy tắc cơ sở dữ liệu thời gian thực Firebase qua REST .

Quản lý bộ quy tắc với REST

Để giúp quản lý việc triển khai quy tắc lớn, ngoài phương thức REST để tạo bộ 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à xóa các quy tắc
  • liệt kê, nhận và xóa các bản phát hành quy tắc

Đối với các 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 để xóa các quy tắc cũ nhất trong một chu kỳ thời gian cố định. Ví dụ: để xóa 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 danh sách JSON của các đối tượng Ruleset trên các khóa createTime của chúng, sau đó gọi project.rulesets.delete trên các bộ quy tắc tương ứng bằng ruleset_id .

Kiểm tra cập nhật của bạn với REST

Cuối cùng, API quản lý cho phép bạn chạy thử nghiệm cú pháp và ngữ nghĩa trên tài nguyên Cloud Firestore và Cloud Storage trong các dự án sản xuất của bạn.

Thử nghiệm với thành phần API này bao gồm:

  1. Xác định đối tượng JSON TestSuite để thể hiện 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 một đối tượng TestSuite bằng một TestCase duy nhất trong tệp testcase.json . Trong ví dụ này, chúng tôi chuyể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ộ thử nghiệm để chạy theo 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 khách hàng mà bộ quy tắc sẽ được kiểm tra. Bạn cũng có thể chỉ định mức độ hoàn chỉnh của báo cáo thử nghiệm bằng cách sử dụng giá trị "FULL" để biểu thị kết quả cho tất cả các biểu thức ngôn ngữ Quy tắc 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 tôi 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 thử nghiệm, danh sách các 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 với trạng thái THÀNH CÔNG rằng quyền truy cập được cho phép hợp lệ.

Quản lý quyền đối với Quy tắc bảo mật lưu trữ đám mây đa dịch vụ

Nếu bạn tạo Quy tắc bảo mật lưu trữ đám mây 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 Firebase CLI để cấp quyền kết nối hai sản phẩm.

Nếu bạn quyết định tắt bảo mật dịch vụ chéo như vậy:

  1. Đầu 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, xóa tất cả các câu lệnh sử dụng chức năng Quy tắc để truy cập Cloud Firestore. Nếu không, sau khi tắt tính năng này, việc đánh giá Quy tắc sẽ khiến yêu cầu Bộ nhớ của bạn không thành công.

  2. Sử dụng trang IAM trong Google Cloud Console để xóa vai trò "Đại lý dịch vụ Firestore Rules của 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 bạn lưu Quy tắc dịch vụ chéo từ Firebase CLI hoặc bảng điều khiển Firebase.