Firebase มีเครื่องมือหลายอย่างให้คุณใช้จัดการ Security 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 เพื่อทดสอบการอัปเดตในเครื่องและยืนยันว่า Security Rules ของแอปแสดงลักษณะการทำงานที่คุณต้องการ
นำการอัปเดตไปใช้
เมื่ออัปเดตและทดสอบ Security Rules แล้ว ให้ติดตั้งใช้งานแหล่งที่มาใน การผลิต
สำหรับ Cloud Firestore Security Rules ให้เชื่อมโยงไฟล์ .rules กับฐานข้อมูลเริ่มต้นและฐานข้อมูลที่มีชื่อเพิ่มเติมโดยตรวจสอบและอัปเดตไฟล์ firebase.json
ใช้คำสั่งต่อไปนี้เพื่อติดตั้งใช้งาน Security 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
นอกจากนี้ คุณยังแก้ไขSecurity Rules แหล่งข้อมูลและทำให้ใช้งานได้เป็นรุ่นจาก คอนโซล Firebase ได้ด้วย ระบบจะดำเนินการทดสอบไวยากรณ์ขณะที่คุณแก้ไขใน UI ของคอนโซล Firebase และการทดสอบเชิงความหมายจะพร้อมใช้งานโดยใช้ Security RulesPlayground
แก้ไขและอัปเดตกฎ
- เปิดFirebase คอนโซล แล้วเลือกโปรเจ็กต์
- จากนั้นเลือก Realtime Database, Cloud Firestore หรือพื้นที่เก็บข้อมูลจาก การนำทางของผลิตภัณฑ์ แล้วคลิกกฎเพื่อไปยัง เครื่องมือแก้ไข Security Rules
- แก้ไขกฎในตัวแก้ไขโดยตรง
ทดสอบการอัปเดต
นอกเหนือจากการทดสอบไวยากรณ์ใน UI ของโปรแกรมแก้ไขแล้ว คุณยังทดสอบลักษณะการทำงานของ Semantic Security Rules โดยใช้ทรัพยากรฐานข้อมูลและพื้นที่เก็บข้อมูลของโปรเจ็กต์ ได้โดยตรงในFirebaseคอนโซลโดยใช้Security Rules Playground เปิดหน้าจอสนามเด็กเล่นของกฎ ในSecurity Rulesเอดิเตอร์ แก้ไขการตั้งค่า แล้วคลิกเรียกใช้ มองหาข้อความยืนยันที่ด้านบนของเครื่องมือแก้ไข
นำการอัปเดตไปใช้
เมื่อพอใจกับการอัปเดตแล้ว ให้คลิกเผยแพร่
ใช้ Admin SDK
คุณใช้Admin SDKสำหรับ Node.js ชุดกฎได้ การเข้าถึงแบบเป็นโปรแกรมนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ใช้เครื่องมือ สคริปต์ แดชบอร์ด และไปป์ไลน์ CI/CD ที่กำหนดเองเพื่อจัดการกฎ
- จัดการกฎได้ง่ายขึ้นในโปรเจ็กต์ Firebase หลายโปรเจ็กต์
เมื่ออัปเดตกฎแบบเป็นโปรแกรม สิ่งสำคัญคือต้องหลีกเลี่ยงการเปลี่ยนแปลงการควบคุมการเข้าถึงแอปโดยไม่ตั้งใจ เขียนAdmin SDKโค้ด โดยคำนึงถึงความปลอดภัยเป็นอันดับแรก โดยเฉพาะเมื่ออัปเดตหรือใช้กฎ
อีกสิ่งสำคัญที่ควรทราบคือFirebase Security Rulesการเผยแพร่จะใช้เวลาหลายนาทีจึงจะเผยแพร่ได้อย่างสมบูรณ์ เมื่อใช้ Admin SDK เพื่อติดตั้งใช้งาน กฎ โปรดหลีกเลี่ยงการแข่งขันที่แอปของคุณต้องพึ่งพากฎ ที่ยังติดตั้งใช้งานไม่เสร็จสมบูรณ์ในทันที หาก Use Case ของคุณต้องมีการอัปเดตกฎการควบคุมการเข้าถึงบ่อยๆ ให้พิจารณาโซลูชันที่ใช้ Cloud Firestore ซึ่งออกแบบมาเพื่อลดสภาวะการแข่งขันแม้จะมีการอัปเดตบ่อยก็ตาม
โปรดทราบขีดจำกัดต่อไปนี้ด้วย
- กฎต้องมีขนาดเล็กกว่า 256 KiB ของข้อความที่เข้ารหัส UTF-8 เมื่อทำการซีเรียลไลซ์
- โปรเจ็กต์มีชุดกฎที่ใช้งานได้ทั้งหมดสูงสุด 2,500 ชุด เมื่อถึงขีดจำกัดนี้แล้ว คุณต้องลบชุดกฎเก่าบางส่วนก่อนจึงจะสร้างชุดกฎใหม่ได้
สร้างและติดตั้งใช้งานชุดกฎ Cloud Storage หรือ Cloud Firestore
เวิร์กโฟลว์ทั่วไปสำหรับการจัดการกฎความปลอดภัยด้วย Admin SDK อาจมีขั้นตอนที่แยกกัน 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 Security Rules แต่ก็ใช้ได้กับ Cloud Storage Security Rules ด้วยเช่นกัน
นอกจากนี้ ตัวอย่างยังใช้ cURL เพื่อทำการเรียก API ด้วย เราจะข้ามขั้นตอนการตั้งค่าและส่งโทเค็นการตรวจสอบสิทธิ์ คุณสามารถทดลองใช้ API นี้ได้โดยใช้ โปรแกรมสำรวจ API ที่ผสานรวมกับ เอกสารอ้างอิง
ขั้นตอนทั่วไปในการสร้างและติดตั้งใช้งานชุดกฎโดยใช้ Management API มีดังนี้
- สร้างแหล่งที่มาของไฟล์กฎ
- สร้างชุดกฎ
- เผยแพร่ (ติดตั้งใช้งาน) ชุดกฎใหม่
สร้างแหล่งข้อมูล
สมมติว่าคุณกำลังทำงานในโปรเจ็กต์ secure_commerce Firebase และต้องการ
ติดตั้งใช้งาน Cloud Firestore Security 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 ของตัวเองสำหรับการจัดการ Security Rules ดูการจัดการ Firebase Realtime Database Security 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 ประกอบด้วย
- การกำหนดออบเจ็กต์ JSON
TestSuiteเพื่อแสดงชุดออบเจ็กต์TestCase - การส่ง
TestSuite - การแยกวิเคราะห์ออบเจ็กต์
TestResultที่ส่งคืน
มากำหนดออบเจ็กต์ TestSuite ที่มี TestCase รายการเดียวในไฟล์ testcase.json กัน ในตัวอย่างนี้ เราส่งSecurity Rules แหล่งที่มาของภาษาแบบอินไลน์พร้อมกับเพย์โหลด REST ควบคู่ไปกับชุดโปรแกรมทดสอบที่จะเรียกใช้ ในกฎเหล่านั้น เราระบุความคาดหวังในการประเมินกฎ และคำขอของไคลเอ็นต์
ที่จะใช้ทดสอบชุดกฎ นอกจากนี้ คุณยังระบุระดับความสมบูรณ์ของรายงานการทดสอบได้โดยใช้ค่า "FULL" เพื่อระบุว่าควรใส่ผลลัพธ์สำหรับSecurity 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ที่ส่งคืน (มีสถานะการทดสอบสำเร็จ/ไม่สำเร็จ รายการ
ข้อความแก้ไขข้อบกพร่อง รายการนิพจน์กฎที่เข้าชม และรายงานการประเมิน)
จะยืนยันสถานะสำเร็จว่ามีการอนุญาตการเข้าถึงอย่างถูกต้อง
จัดการสิทธิ์สำหรับ Cloud Storage Security Rules ข้ามบริการ
หากคุณสร้าง Cloud Storage Security Rules ที่ใช้เนื้อหาเอกสาร Cloud Firestore เพื่อประเมินเงื่อนไขด้านความปลอดภัย ระบบจะแจ้งให้คุณเปิดใช้สิทธิ์ เพื่อเชื่อมต่อผลิตภัณฑ์ทั้ง 2 รายการในคอนโซล Firebase หรือ Firebase CLI
หากตัดสินใจที่จะปิดใช้การรักษาความปลอดภัยข้ามบริการดังกล่าว ให้ทำดังนี้
ก่อนปิดใช้ฟีเจอร์นี้ ให้แก้ไขกฎโดยนำคำสั่งทั้งหมดที่ใช้ฟังก์ชัน Security Rules เพื่อเข้าถึง Cloud Firestore ออก ไม่เช่นนั้น หลังจากปิดใช้ฟีเจอร์แล้ว การประเมิน Security Rules จะทำให้คำขอพื้นที่เก็บข้อมูลของคุณไม่สำเร็จ
ใช้หน้า IAM ใน คอนโซล Google Cloud เพื่อลบบทบาท "Firebase Rules Firestore Service Agent" โดยทำตามคำแนะนำใน Cloud สำหรับ การเพิกถอนบทบาท
ระบบจะแจ้งให้คุณเปิดใช้ฟีเจอร์นี้อีกครั้งในครั้งถัดไปที่คุณบันทึกกฎข้ามบริการจาก Firebase CLI หรือคอนโซล Firebase