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

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

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

  • ส่งผ่านแหล่งที่มาของกฎ: ชุดกฎ ซึ่งโดยปกติจะเป็นไฟล์โค้ดที่มีคำสั่ง Firebase Security Rules
  • จัดเก็บแหล่งที่มาที่ส่งผ่านข้อมูลเป็นชุดกฎที่เปลี่ยนแปลงไม่ได้
  • ติดตามการติดตั้งใช้งานกฎแต่ละชุดในรุ่น บริการที่เปิดใช้กฎความปลอดภัยของ 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 โดยตรง

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

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

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

หากคุณกำลังทำงานกับ CLI ชุดเครื่องมือนี้เป็นเครื่องมือที่ยอดเยี่ยมสำหรับ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เอดิเตอร์ แก้ไขการตั้งค่า แล้วคลิกเรียกใช้ มองหาข้อความยืนยันที่ด้านบนของเครื่องมือแก้ไข

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

เมื่อพอใจกับการอัปเดตแล้ว ให้คลิกเผยแพร่

ใช้ Admin SDK

คุณใช้ Admin SDK สำหรับ Node.js ชุดกฎได้ สิทธิ์เข้าถึงแบบเป็นโปรแกรมนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้

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

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

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

โปรดทราบขีดจำกัดต่อไปนี้ด้วย

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

สร้างและติดตั้งใช้งานชุดกฎ Cloud Storage หรือ Cloud Firestore

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

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

สำหรับการติดตั้งใช้งานขนาดใหญ่มากซึ่งมีชุดกฎถึงขีดจำกัด 2, 500 รายการเมื่อเวลาผ่านไป คุณสามารถ สร้างตรรกะเพื่อลบกฎที่เก่าที่สุดในรอบเวลาที่กำหนดได้ เช่น หากต้องการลบชุดกฎทั้งหมดที่ใช้งานมานานกว่า 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 โดยใช้ Management API เอง Management API ช่วยให้คุณมีความยืดหยุ่นมากที่สุด

โปรดทราบขีดจำกัดต่อไปนี้ด้วย

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

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

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

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

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

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

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

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

คุณใช้กฎเหล่านี้ได้ในไฟล์ firestore.rules

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

สร้างชุดกฎ

ตอนนี้ให้สร้างฟิงเกอร์ปรินต์ที่เข้ารหัส Base64 สำหรับไฟล์นี้ จากนั้นคุณจะใช้แหล่งที่มาในไฟล์นี้เพื่อสร้างเพย์โหลดที่จำเป็นในการสร้างชุดกฎด้วย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 สำหรับการสร้างชุดกฎและการเผยแพร่แล้ว Management API ยังมีเมธอดต่อไปนี้เพื่อช่วยจัดการการติดตั้งใช้งานกฎจำนวนมาก

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

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

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

สุดท้ายนี้ Management 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 ว่ามีการอนุญาตการเข้าถึงอย่างถูกต้อง

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

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

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

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

  2. ใช้หน้า IAM ในคอนโซล Google Cloud เพื่อลบบทบาท "Firebase Rules Firestore Service Agent" โดยทำตามคำแนะนำของ Cloud สำหรับ การเพิกถอนบทบาท

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