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
แก้ไขและอัปเดตกฎ
- เปิดคอนโซล Firebase แล้วเลือกโปรเจ็กต์
- จากนั้นเลือก Realtime Database, Cloud Firestore หรือพื้นที่เก็บข้อมูลจาก การนำทางของผลิตภัณฑ์ จากนั้นคลิกกฎเพื่อไปยัง เครื่องมือแก้ไข Rules
- แก้ไขกฎโดยตรงในเครื่องมือแก้ไข
ทดสอบการอัปเดต
นอกจากการทดสอบไวยากรณ์ใน 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 อาจรวมถึง สามขั้นตอนที่แยกจากกันโดยสิ้นเชิง:
- สร้างแหล่งที่มาของไฟล์กฎ (ไม่บังคับ)
- สร้างชุดกฎ
- เผยแพร่หรือทำให้ใช้งานได้ชุดกฎใหม่
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 การจัดการมีดังนี้
- สร้างแหล่งที่มาของไฟล์กฎ
- สร้างชุดกฎ
- ปล่อย (ทำให้ใช้งาน) ชุดกฎใหม่
สร้างแหล่งที่มา
สมมติว่าคุณกำลังทำโปรเจ็กต์ 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 ประกอบด้วย
- การกำหนดออบเจ็กต์ JSON
TestSuite
เพื่อแสดงชุดออบเจ็กต์TestCase
- กำลังส่ง
TestSuite
- การแยกวิเคราะห์แสดงผลออบเจ็กต์
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 ผลิตภัณฑ์
หากคุณตัดสินใจที่จะปิดใช้การรักษาความปลอดภัยแบบข้ามบริการดังกล่าว
ก่อนอื่น ก่อนปิดใช้ฟีเจอร์ดังกล่าว ให้แก้ไขกฎโดยนำข้อมูลทั้งหมดออก ข้อความที่ใช้ฟังก์ชัน Rules เพื่อเข้าถึง Cloud Firestore มิฉะนั้น หลังจากที่ปิดใช้ฟีเจอร์แล้ว การประเมิน Rules รายการจะ ทำให้คำขอพื้นที่เก็บข้อมูลล้มเหลว
ใช้หน้า IAM ใน Google Cloud Console เพื่อลบ Agent บริการ Firestore สำหรับกฎ" โดยทำตามคำแนะนำเกี่ยวกับระบบคลาวด์ บทบาทที่เพิกถอน
คุณจะได้รับข้อความแจ้งให้เปิดใช้ฟีเจอร์นี้อีกครั้งในครั้งถัดไปที่คุณบันทึก กฎข้ามบริการจากคอนโซล Firebase CLI หรือ Firebase