จัดการและทำให้กฎการรักษาความปลอดภัยของ Firebase ใช้งานได้

Firebase มีเครื่องมือมากมายให้คุณใช้จัดการ Rules โดยแต่ละเครื่องมือ มีประโยชน์ในบางกรณี และแต่ละรายการใช้ Firebase แบ็กเอนด์เดียวกัน API การจัดการกฎการรักษาความปลอดภัย

ไม่ว่าจะใช้เครื่องมือใดเพื่อเรียกใช้ API การจัดการจะทำสิ่งต่อไปนี้

  • นำเข้าแหล่งที่มาของกฎ: ชุดของกฎที่โดยปกติจะเป็นไฟล์โค้ดที่มี ใบแจ้งยอด Firebase Security Rules รายการ
  • จัดเก็บแหล่งที่มาที่นำเข้าเป็น ruleset ที่เปลี่ยนแปลงไม่ได้
  • ติดตามการติดตั้งใช้งานของชุดกฎแต่ละชุดในรุ่น การรักษาความปลอดภัยของ Firebase บริการที่เปิดใช้กฎจะค้นหารุ่นสำหรับโปรเจ็กต์เพื่อประเมินคำขอแต่ละรายการ สำหรับทรัพยากรที่ปลอดภัย
  • ให้ความสามารถในการเรียกใช้การทดสอบไวยากรณ์และความหมายของชุดกฎ

ใช้ Firebase CLI

เมื่อใช้ Firebase CLI คุณจะทำสิ่งต่อไปนี้ได้ อัปโหลดแหล่งที่มาในเครื่องและทำให้รุ่นใช้งานได้ ของ CLI Firebase Local Emulator Suite ให้คุณทำการทดสอบแหล่งที่มาภายในเครื่องได้อย่างเต็มรูปแบบ

การใช้ CLI จะทําให้กฎของคุณอยู่ภายใต้การควบคุมเวอร์ชัน โค้ดของแอปพลิเคชันและใช้กฎเพื่อเป็นส่วนหนึ่งของกระบวนการติดตั้งใช้งานที่มีอยู่

สร้างไฟล์การกำหนดค่า

เมื่อคุณกำหนดค่าโปรเจ็กต์ Firebase โดยใช้ Firebase CLI จะเป็นการสร้าง ไฟล์การกำหนดค่า .rules ในไดเรกทอรีโปรเจ็กต์ ใช้รายการต่อไปนี้ เพื่อเริ่มการกำหนดค่าโปรเจ็กต์ 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

แก้ไขและอัปเดตกฎ

แก้ไขแหล่งที่มาของกฎในไฟล์การกำหนดค่า .rules โดยตรง

โปรดตรวจสอบว่าการแก้ไขใดๆ ที่คุณทําใน CLI ของ Firebase แสดงใน Firebase หรือหากคุณทำการอัปเดตอย่างสม่ำเสมอโดยใช้ คอนโซล Firebase หรือ Firebase CLI มิฉะนั้น คุณอาจเขียนทับ การอัปเดตที่ดำเนินการในคอนโซล Firebase

ทดสอบการอัปเดต

Local Emulator Suite มีโปรแกรมจำลองสำหรับเปิดใช้กฎความปลอดภัยทั้งหมด Google อีกด้วย เครื่องมือกฎความปลอดภัยสำหรับโปรแกรมจำลองแต่ละตัวจะทำทั้งไวยากรณ์ และการประเมินทางอรรถศาสตร์ของกฎ ซึ่งเกินกว่าการทดสอบไวยากรณ์ ข้อเสนอจาก API การจัดการกฎการรักษาความปลอดภัย

หากคุณทำงานกับ CLI Suite จะเป็นเครื่องมือที่ยอดเยี่ยมสำหรับ Firebase Security Rules การทดสอบ ใช้ Local Emulator Suite เพื่อทดสอบการอัปเดต ในเครื่อง และยืนยันว่า Rules ของแอปแสดงลักษณะการทำงานที่คุณ ต้องการ

นำอัปเดตไปใช้

เมื่ออัปเดตและทดสอบ Rules แล้ว ให้ทำให้แหล่งที่มาใช้งานได้เพื่อ เวอร์ชันที่ใช้งานจริง

สำหรับ Cloud Firestore Security Rules ให้เชื่อมโยงไฟล์ .rules กับค่าเริ่มต้นและ ฐานข้อมูลที่มีชื่อเพิ่มเติมโดยการตรวจสอบและอัปเดต firebase.json ไฟล์

ใช้คำสั่งต่อไปนี้เพื่อเลือกทำให้ Rules ใช้งานได้เพียงอย่างเดียว หรือ ทำให้ใช้งานได้โดยเป็นส่วนหนึ่งของกระบวนการทำให้ใช้งานได้ตามปกติ

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

ใช้คอนโซล Firebase

นอกจากนี้คุณยังแก้ไขแหล่งที่มา Rules และทำให้ใช้งานได้เป็นรุ่นจาก คอนโซล Firebase การทดสอบเชิงโครงสร้างในขณะที่คุณแก้ไขใน UI คอนโซล Firebase และการทดสอบความหมายพร้อมให้ใช้งานโดยใช้ Rules Playground

แก้ไขและอัปเดตกฎ

  1. เปิดคอนโซล Firebase แล้วเลือกโปรเจ็กต์
  2. จากนั้นเลือก Realtime Database, Cloud Firestore หรือพื้นที่เก็บข้อมูลจาก การนำทางของผลิตภัณฑ์ จากนั้นคลิกกฎเพื่อไปยัง เครื่องมือแก้ไข Rules
  3. แก้ไขกฎโดยตรงในเครื่องมือแก้ไข

ทดสอบการอัปเดต

นอกจากการทดสอบไวยากรณ์ใน UI ของตัวแก้ไขแล้ว คุณยังสามารถทดสอบความหมาย Rules โดยใช้ฐานข้อมูลและทรัพยากรพื้นที่เก็บข้อมูลของโปรเจ็กต์ ในคอนโซล Firebase โดยตรง โดยใช้ Rules Playground เปิด Rules Playground ในเครื่องมือแก้ไข Rules ให้แก้ไขการตั้งค่าแล้วคลิกเรียกใช้ มองหาข้อความยืนยันที่ด้านบนของเครื่องมือแก้ไข

นำอัปเดตไปใช้

เมื่อแน่ใจแล้วว่าการอัปเดตเป็นไปตามที่คุณคาดหวัง ให้คลิกเผยแพร่

ใช้ Admin SDK

คุณสามารถใช้ Admin SDK สำหรับ Node.js ได้ rulesets ด้วยการเข้าถึงแบบเป็นโปรแกรมนี้ คุณสามารถ

  • ใช้เครื่องมือที่กำหนดเอง สคริปต์ แดชบอร์ด และไปป์ไลน์ CI/CD สำหรับการจัดการกฎ
  • จัดการกฎในโปรเจ็กต์ Firebase หลายโปรเจ็กต์ได้ง่ายขึ้น

เมื่ออัปเดตกฎโดยใช้โปรแกรม คุณไม่ควรปิด การเปลี่ยนแปลงการควบคุมการเข้าถึงของแอปโดยไม่ได้ตั้งใจ เขียน Admin SDK รหัส โดยคำนึงถึงความปลอดภัยเป็นอันดับแรก โดยเฉพาะเมื่ออัปเดตหรือใช้กฎ

สิ่งสำคัญอีกอย่างที่ควรคำนึงถึงคือการเผยแพร่ Firebase Security Rules ใช้เวลา หลายนาทีเพื่อให้เผยแพร่ได้อย่างสมบูรณ์ เมื่อใช้ Admin SDK เพื่อทำให้ใช้งานได้ โปรดหลีกเลี่ยงเงื่อนไขการแข่งขันที่แอปของคุณพึ่งพาทันที เกี่ยวกับกฎที่การติดตั้งใช้งานยังไม่เสร็จสมบูรณ์ หากกรณีการใช้งานต้องใช้ อัปเดตกฎควบคุมการเข้าถึงเป็นประจำ, ลองพิจารณาโซลูชันโดยใช้ Cloud Firestore ซึ่งออกแบบมาเพื่อลดสภาวะการแข่งขันแม้จะมีการอัปเดตบ่อยครั้ง

และโปรดทราบข้อจํากัดต่อไปนี้

  • กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัสแบบ UTF-8 เมื่อเรียงอันดับ
  • โปรเจ็กต์มีชุดกฎที่ทำให้ใช้งานได้ทั้งหมดได้สูงสุด 2,500 ชุด เมื่อขีดจำกัดนี้เท่ากับ ถึงแล้ว คุณต้องลบชุดกฎเก่าบางส่วนออกก่อนที่จะสร้างชุดกฎใหม่

สร้างและทำให้ชุดกฎ Cloud Storage หรือ Cloud Firestore ใช้งานได้

เวิร์กโฟลว์ทั่วไปสำหรับการจัดการกฎความปลอดภัยด้วย Admin SDK อาจรวมถึง สามขั้นตอนที่แยกจากกันโดยสิ้นเชิง:

  1. สร้างแหล่งที่มาของไฟล์กฎ (ไม่บังคับ)
  2. สร้างชุดกฎ
  3. เผยแพร่หรือทำให้ใช้งานได้ชุดกฎใหม่

SDK มีวิธีในการรวมขั้นตอนเหล่านี้เป็นการเรียก API เดียวสำหรับ กฎความปลอดภัย Cloud Storage และ Cloud Firestore รายการ เช่น

    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);

รูปแบบเดียวกันนี้ใช้ได้สำหรับกฎ Cloud Storage ที่ใช้ releaseFirestoreRulesetFromSource()

หรือคุณจะสร้างไฟล์กฎเป็นออบเจ็กต์ในหน่วยความจำ แล้วสร้าง ชุดกฎ และปรับใช้ชุดกฎแยกกันเพื่อให้สามารถควบคุมเหตุการณ์เหล่านี้ได้อย่างใกล้ชิดยิ่งขึ้น เช่น

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

อัปเดตชุดกฎ Realtime Database รายการ

หากต้องการอัปเดตชุดกฎ Realtime Database รายการด้วย Admin SDK ให้ใช้ getRules() และ setRules() เมธอดของ admin.database คุณเรียกข้อมูลชุดกฎใน JSON ได้ หรือเป็นสตริงที่มีความคิดเห็น

วิธีอัปเดตชุดกฎ

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score",
          "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

จัดการชุดกฎ

Admin SDK ให้คุณแสดงกฎที่มีอยู่ทั้งหมดเพื่อช่วยจัดการชุดกฎขนาดใหญ่ ด้วย admin.securityRules().listRulesetMetadata เช่น

    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;
      }
    }

สำหรับการทำให้ใช้งานได้ขนาดใหญ่มากซึ่งถึงขีดจำกัด 2500 ชุดกฎเมื่อเวลาผ่านไป คุณสามารถ สร้างตรรกะเพื่อลบกฎที่เก่าที่สุดในรอบเวลาคงที่ ตัวอย่างเช่น หากต้องการ ลบชุดกฎทั้งหมดที่ใช้งานนานกว่า 30 วัน

    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.`);

ใช้ REST API

เครื่องมือที่อธิบายข้างต้นเหมาะสำหรับเวิร์กโฟลว์ที่หลากหลาย ซึ่งรวมถึง การจัดการFirebase Security Rulesสำหรับฐานข้อมูล Cloud Firestore หลายรายการในโปรเจ็กต์ของคุณ แต่คุณอาจต้องจัดการและทำให้ Firebase Security Rules ใช้งานได้โดยใช้ API การจัดการด้วยตนเอง API การจัดการช่วยให้คุณมีความยืดหยุ่นมากที่สุด

และโปรดทราบข้อจํากัดต่อไปนี้

  • กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัสแบบ UTF-8 เมื่อเรียงอันดับ
  • โปรเจ็กต์มีชุดกฎที่ทำให้ใช้งานได้ทั้งหมดได้สูงสุด 2,500 ชุด เมื่อขีดจำกัดนี้เท่ากับ ถึงแล้ว คุณต้องลบชุดกฎเก่าบางส่วนออกก่อนที่จะสร้างชุดกฎใหม่

สร้างและทำให้ชุดกฎ Cloud Firestore หรือ Cloud Storage ใช้งานได้ด้วย REST

ตัวอย่างในส่วนนี้ใช้ Firestore Rules แต่จะใช้กับ Cloud Storage Rulesด้วย

และตัวอย่างนี้ยังใช้ cURL เพื่อทำการเรียก API ด้วย ขั้นตอนในการตั้งค่าและผ่านการรับรอง ละเว้นโทเค็นการตรวจสอบสิทธิ์ คุณสามารถทดสอบกับ API นี้โดยใช้ โปรแกรมสำรวจ API ที่ผสานรวมกับ เอกสารอ้างอิง

ขั้นตอนทั่วไปในการสร้างและทำให้ชุดกฎใช้งานได้โดยใช้ API การจัดการมีดังนี้

  1. สร้างแหล่งที่มาของไฟล์กฎ
  2. สร้างชุดกฎ
  3. ปล่อย (ทำให้ใช้งาน) ชุดกฎใหม่

สร้างแหล่งที่มา

สมมติว่าคุณกำลังทำโปรเจ็กต์ Firebase secure_commerce และต้องการ เพื่อติดตั้งใช้งาน Cloud Firestore Rules ที่ล็อกแล้วกับฐานข้อมูลใน โปรเจ็กต์ชื่อ east_store

โดยคุณสามารถใช้กฎเหล่านี้ในfirestore.rules

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

สร้างชุดกฎ

ตอนนี้ ให้สร้างลายนิ้วมือที่เข้ารหัสฐาน 64 สำหรับไฟล์นี้ จากนั้นคุณสามารถใช้ ที่มาในไฟล์นี้เพื่อเติมข้อมูลเพย์โหลดที่จำเป็นต่อการสร้างชุดกฎที่มี projects.rulesets.create สาย REST ตรงนี้ ให้ใช้คำสั่ง cat เพื่อแทรก เนื้อหาของ firestore.rules ลงในเพย์โหลด REST

สำหรับการติดตาม หากต้องการเชื่อมโยงรายการนี้กับฐานข้อมูล east_store ให้ตั้งค่า attachment_point เป็น 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 จะแสดงการตอบกลับการตรวจสอบและชื่อชุดกฎ projects/secure_commerce/rulesets/uuid123

ปล่อย (ติดตั้งใช้งาน) ชุดกฎ

หากชุดกฎถูกต้อง ขั้นตอนสุดท้ายคือการทำให้ชุดกฎใหม่ใช้งานได้ใน

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'

โปรดทราบว่าการเผยแพร่ Firebase Security Rules จะใช้เวลาหลายนาทีจึงจะเสร็จสมบูรณ์ เผยแพร่ เมื่อใช้ REST API การจัดการเพื่อติดตั้งใช้งาน โปรดตรวจสอบว่าได้หลีกเลี่ยงการแข่งขัน เงื่อนไขที่แอปของคุณต้องอาศัยกฎเกณฑ์ที่การทำให้ใช้งานได้ ก็ยังเสร็จสมบูรณ์

อัปเดตชุดกฎ Realtime Database ชุดด้วย REST

Realtime Database มีอินเทอร์เฟซ REST ของตนเองสำหรับการจัดการ Rules โปรดดู การจัดการ Firebase Realtime Database Rules ผ่าน REST

จัดการชุดกฎด้วย REST

เพื่อช่วยจัดการการทำให้กฎขนาดใหญ่ใช้งานได้ นอกเหนือจากเมธอด REST สำหรับ การสร้างชุดกฎและรุ่น API การจัดการมีวิธีทำสิ่งต่อไปนี้

  • แสดงรายการ รับ และลบชุดกฎ
  • แสดงรายการ รับ และลบกฎการเผยแพร่

สำหรับการทำให้ใช้งานได้ขนาดใหญ่มากซึ่งถึงขีดจำกัด 2500 ชุดกฎเมื่อเวลาผ่านไป คุณสามารถ สร้างตรรกะเพื่อลบกฎที่เก่าที่สุดในรอบเวลาคงที่ ตัวอย่างเช่น หากต้องการ ลบชุดกฎทั้งหมดที่ทำให้ใช้งานได้นานกว่า 30 วัน เมธอด projects.rulesets.list แยกวิเคราะห์รายการ JSON ของออบเจ็กต์ Ruleset ใน createTime คีย์ แล้วเรียก project.rulesets.delete บน ชุดกฎที่เกี่ยวข้องตาม ruleset_id

ทดสอบการอัปเดตด้วย REST

และสุดท้าย API การจัดการช่วยให้คุณเรียกใช้การทดสอบไวยากรณ์และความหมายใน ทรัพยากร Cloud Firestore และ Cloud Storage รายการในเวอร์ชันที่ใช้งานจริง โปรเจ็กต์

การทดสอบด้วยคอมโพเนนต์นี้ของ API ประกอบด้วย

  1. การกำหนดออบเจ็กต์ JSON TestSuite เพื่อแสดงชุดออบเจ็กต์ TestCase
  2. กำลังส่ง TestSuite
  3. การแยกวิเคราะห์แสดงผลออบเจ็กต์ TestResult รายการ

สมมติว่ามีออบเจ็กต์ TestSuite ที่มี TestCase เดี่ยวในฟังก์ชัน testcase.json ไฟล์ ในตัวอย่างนี้ เราจะส่งต่อ Rules แหล่งที่มาของภาษาในบรรทัดที่มีเพย์โหลด REST ควบคู่ไปกับชุดทดสอบที่จะเรียกใช้ เกี่ยวกับกฎเหล่านั้น เราระบุความคาดหวังในการประเมินกฎ คำขอที่จะทดสอบชุดกฎ นอกจากนี้ คุณยังระบุวิธีการ ดำเนินการรายงานการทดสอบให้เสร็จสมบูรณ์ โดยใช้ค่า "FULL" เพื่อระบุผลลัพธ์สำหรับ ควรรวมนิพจน์ภาษา Rules รายการในรายงาน รวมถึง นิพจน์ที่ไม่ตรงกับคำขอ

 {
  "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"}}}
            }
          ]
      }
    ]
  }
}

จากนั้นเราจะส่ง TestSuite นี้ไปประเมินพร้อมกับ projects.test

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

TestReport ที่แสดงผลอยู่ (มีสถานะการทดสอบ Success/FAILURE รายการของ ข้อความแก้ไขข้อบกพร่อง รายการนิพจน์กฎที่เข้าชม และรายงานการประเมิน) จะยืนยันด้วยสถานะ "สำเร็จ" ว่าการเข้าถึงได้รับอนุญาตอย่างเหมาะสม

จัดการสิทธิ์สำหรับ Cloud Storage Security Rules แบบข้ามบริการ

หากคุณสร้าง Cloud Storage Security Rules ที่ใช้เนื้อหาเอกสาร Cloud Firestore รายการ ในการประเมินเงื่อนไขความปลอดภัย คุณจะได้รับข้อความแจ้งในคอนโซล Firebase หรือ Firebase CLI ให้เปิดใช้ ในการเชื่อมต่อทั้ง 2 ผลิตภัณฑ์

หากคุณตัดสินใจที่จะปิดใช้การรักษาความปลอดภัยแบบข้ามบริการดังกล่าว

  1. ก่อนอื่น ก่อนปิดใช้ฟีเจอร์ดังกล่าว ให้แก้ไขกฎโดยนำข้อมูลทั้งหมดออก ข้อความที่ใช้ฟังก์ชัน Rules เพื่อเข้าถึง Cloud Firestore มิฉะนั้น หลังจากที่ปิดใช้ฟีเจอร์แล้ว การประเมิน Rules รายการจะ ทำให้คำขอพื้นที่เก็บข้อมูลล้มเหลว

  2. ใช้หน้า IAM ใน Google Cloud Console เพื่อลบ Agent บริการ Firestore สำหรับกฎ" โดยทำตามคำแนะนำเกี่ยวกับระบบคลาวด์ บทบาทที่เพิกถอน

คุณจะได้รับข้อความแจ้งให้เปิดใช้ฟีเจอร์นี้อีกครั้งในครั้งถัดไปที่คุณบันทึก กฎข้ามบริการจากคอนโซล Firebase CLI หรือ Firebase