Firebase, आपको अपने Rules को मैनेज करने के लिए कई टूल उपलब्ध कराता है. हर टूल, कुछ खास मामलों में काम आता है. साथ ही, हर टूल एक ही बैकएंड Firebase Security Rules management API का इस्तेमाल करता है.
इसे चालू करने के लिए किसी भी टूल का इस्तेमाल किया जा सकता है. मैनेजमेंट एपीआई:
- नियमों का सोर्स शामिल करता है: नियमों का एक सेट. आम तौर पर, यह एक कोड फ़ाइल होती है, जिसमें Firebase Security Rules स्टेटमेंट होते हैं.
- यह सोर्स को एक ऐसे ruleset के तौर पर सेव करता है जिसमें बदलाव नहीं किया जा सकता.
- यह release में हर नियम के सेट को डिप्लॉय करने की प्रोसेस को ट्रैक करता है. Firebase Security Rules-enabled services, किसी प्रोजेक्ट के लिए रिलीज़ की जानकारी ढूंढती हैं, ताकि सुरक्षित संसाधन के लिए किए गए हर अनुरोध का आकलन किया जा सके.
- इसकी मदद से, किसी नियम के सेट के सिंटैक्टिक और सिमैंटिक टेस्ट किए जा सकते हैं.
Firebase CLI का इस्तेमाल करना
Firebase सीएलआई की मदद से, स्थानीय सोर्स अपलोड किए जा सकते हैं और रिलीज़ डिप्लॉय की जा सकती हैं. सीएलआई का Firebase Local Emulator Suite आपको सोर्स की पूरी स्थानीय टेस्टिंग करने की सुविधा देता है.
सीएलआई का इस्तेमाल करके, अपने नियमों को वर्शन कंट्रोल में रखा जा सकता है. साथ ही, नियमों को अपनी मौजूदा डिप्लॉयमेंट प्रोसेस के हिस्से के तौर पर डिप्लॉय किया जा सकता है.
कॉन्फ़िगरेशन फ़ाइल जनरेट करना
Firebase CLI का इस्तेमाल करके Firebase प्रोजेक्ट को कॉन्फ़िगर करने पर, आपकी प्रोजेक्ट डायरेक्ट्री में .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 सीएलआई में किए गए सभी बदलाव, Firebase कंसोल में दिखें. इसके अलावा, यह भी पक्का करें कि Firebase कंसोल या Firebase CLI का इस्तेमाल करके, लगातार अपडेट किए जा रहे हों. ऐसा न करने पर, हो सकता है कि आपने Firebase कंसोल में जो भी बदलाव किए हैं वे मिट जाएं.
अपडेट की जांच करना
Local Emulator Suite, सुरक्षा के नियमों की सुविधा वाले सभी प्रॉडक्ट के लिए एम्युलेटर उपलब्ध कराता है. हर एम्युलेटर के लिए Security Rules इंजन, नियमों का सिंटैक्टिक और सिमैंटिक, दोनों तरह से आकलन करता है. इस तरह, यह Security Rules मैनेजमेंट एपीआई की ओर से दी जाने वाली सिंटैक्टिक टेस्टिंग से बेहतर है.
अगर आपको सीएलआई के साथ काम करना है, तो Suite, Firebase Security Rules टेस्टिंग के लिए एक बेहतरीन टूल है. अपने अपडेट को स्थानीय तौर पर टेस्ट करने के लिए, Local Emulator Suite का इस्तेमाल करें. साथ ही, पुष्टि करें कि आपके ऐप्लिकेशन के Rules आपकी ज़रूरत के मुताबिक काम कर रहे हैं.
अपडेट लागू करना
Rules को अपडेट करने और उसकी जांच करने के बाद, सोर्स को प्रोडक्शन में डिप्लॉय करें.
Cloud Firestore Security Rules के लिए, अपनी firebase.json
फ़ाइल की समीक्षा करके और उसे अपडेट करके, .rules
फ़ाइलों को अपने डिफ़ॉल्ट और अतिरिक्त नाम वाले डेटाबेस से जोड़ें.
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 कंसोल का इस्तेमाल करना
Firebase कंसोल से, Rules सोर्स में बदलाव किया जा सकता है. साथ ही, उन्हें रिलीज़ के तौर पर डिप्लॉय किया जा सकता है. सिंटैक्टिक टेस्टिंग, Firebase कंसोल के यूज़र इंटरफ़ेस (यूआई) में बदलाव करते समय की जाती है. वहीं, सिमैंटिक टेस्टिंग के लिए Rules Playground का इस्तेमाल किया जाता है.
नियमों में बदलाव करना और उन्हें अपडेट करना
- Firebase कंसोल खोलें और अपना प्रोजेक्ट चुनें.
- इसके बाद, प्रॉडक्ट नेविगेशन से Realtime Database, Cloud Firestore या स्टोरेज चुनें. इसके बाद, Rules एडिटर पर जाने के लिए, नियम पर क्लिक करें.
- एडिटर में जाकर, सीधे अपने नियमों में बदलाव करें.
अपडेट की जांच करना
एडिटर यूज़र इंटरफ़ेस (यूआई) में सिंटैक्स की जांच करने के अलावा, सिमैंटिक Rules व्यवहार की जांच भी की जा सकती है. इसके लिए, अपने प्रोजेक्ट के डेटाबेस और स्टोरेज संसाधनों का इस्तेमाल करके, सीधे Firebase कंसोल में Rules Playground का इस्तेमाल करें. Rules एडिटर में Rules Playground स्क्रीन खोलें. इसके बाद, सेटिंग में बदलाव करें और चलाएं पर क्लिक करें. एडिटर में सबसे ऊपर, पुष्टि करने वाला मैसेज देखें.
अपडेट लागू करना
जब आपको लगे कि अपडेट आपकी उम्मीद के मुताबिक हैं, तब पब्लिश करें पर क्लिक करें.
Admin SDK का इस्तेमाल करना
Node.js के लिए Admin SDK नियमों के सेट का इस्तेमाल किया जा सकता है. प्रोग्राम के हिसाब से, अपने-आप होने वाली प्रोसेस का ऐक्सेस मिलने पर, ये काम किए जा सकते हैं:
- नियमों को मैनेज करने के लिए, कस्टम टूल, स्क्रिप्ट, डैशबोर्ड, और सीआई/सीडी पाइपलाइन लागू करें.
- एक से ज़्यादा Firebase प्रोजेक्ट में नियमों को ज़्यादा आसानी से मैनेज करें.
प्रोग्राम के हिसाब से नियमों को अपडेट करते समय, यह बहुत ज़रूरी है कि आपके ऐप्लिकेशन के ऐक्सेस कंट्रोल में अनचाहे बदलाव न हों. सुरक्षा को ध्यान में रखते हुए अपना Admin SDK कोड लिखें. खास तौर पर, नियमों को अपडेट या डिप्लॉय करते समय.
एक और ज़रूरी बात यह है कि Firebase Security Rules रिलीज़ होने में कुछ मिनट लगते हैं. नियमों को लागू करने के लिए Admin SDK का इस्तेमाल करते समय, रेस कंडीशन से बचें. रेस कंडीशन ऐसी स्थिति होती है जिसमें आपका ऐप्लिकेशन, उन नियमों पर तुरंत निर्भर हो जाता है जिन्हें अभी तक लागू नहीं किया गया है. अगर आपको ऐक्सेस कंट्रोल के नियमों को बार-बार अपडेट करना पड़ता है, तो Cloud Firestore का इस्तेमाल करें. इसे बार-बार अपडेट होने के बावजूद रेस कंडीशन को कम करने के लिए डिज़ाइन किया गया है.
के ज़रिए नियमों को अपडेट न करें.इन सीमाओं का भी ध्यान रखें:
- सीरियल में बदलने पर, नियमों का साइज़ 256 केबी से कम होना चाहिए. साथ ही, वे UTF-8 कोड में होने चाहिए.
- किसी प्रोजेक्ट में, कुल मिलाकर ज़्यादा से ज़्यादा 2,500 डिप्लॉय किए गए नियम सेट हो सकते हैं. इस सीमा तक पहुंचने के बाद, नए नियम बनाने से पहले आपको कुछ पुराने नियम मिटाने होंगे.
Cloud Storage या Cloud Firestore नियमों के सेट बनाना और उन्हें लागू करना
Admin SDK की मदद से सुरक्षा से जुड़े नियमों को मैनेज करने के सामान्य वर्कफ़्लो में, तीन अलग-अलग चरण शामिल हो सकते हैं:
- नियमों वाली फ़ाइल का सोर्स बनाना (ज़रूरी नहीं)
- नियमों का सेट बनाना
- नए नियमों के सेट को रिलीज़ या डिप्लॉय करना
एसडीके, 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);
यह पैटर्न, releaseFirestoreRulesetFromSource()
के साथ Cloud Storage नियमों के लिए भी काम करता है.
इसके अलावा, नियमों वाली फ़ाइल को इन-मेमोरी ऑब्जेक्ट के तौर पर बनाया जा सकता है. साथ ही, नियमों का सेट बनाया जा सकता है. इसके बाद, इन इवेंट पर ज़्यादा कंट्रोल पाने के लिए, नियमों के सेट को अलग से डिप्लॉय किया जा सकता है. उदाहरण के लिए:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Realtime Database के नियमों के सेट अपडेट करना
Admin SDK की मदद से Realtime Database के नियम सेट अपडेट करने के लिए, admin.database
के getRules()
और setRules()
तरीकों का इस्तेमाल करें. नियमों के सेट को 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 का इस्तेमाल करना
ऊपर बताई गई टूलकिट, कई वर्कफ़्लो के लिए सही हैं. इनमें आपके प्रोजेक्ट में मौजूद कई Cloud Firestore डेटाबेस को मैनेज करना भी शामिल है. हालांकि, आपको मैनेजमेंट एपीआई का इस्तेमाल करके ही Firebase Security Rules को मैनेज और डिप्लॉय करना पड़ सकता है.Firebase Security Rules Management API की मदद से, आपको सबसे ज़्यादा सुविधाएं मिलती हैं.
इन सीमाओं का भी ध्यान रखें:
- सीरियल में बदलने पर, नियमों का साइज़ 256 केबी से कम होना चाहिए. साथ ही, वे UTF-8 कोड में होने चाहिए.
- किसी प्रोजेक्ट में, कुल मिलाकर ज़्यादा से ज़्यादा 2,500 डिप्लॉय किए गए नियम सेट हो सकते हैं. इस सीमा तक पहुंचने के बाद, नए नियम बनाने से पहले आपको कुछ पुराने नियम मिटाने होंगे.
REST की मदद से Cloud Firestore या Cloud Storage नियमों का सेट बनाना और उन्हें लागू करना
इस सेक्शन में दिए गए उदाहरणों में Firestore Rules का इस्तेमाल किया गया है. हालांकि, ये Cloud Storage Rules पर भी लागू होते हैं.
इन उदाहरणों में, एपीआई कॉल करने के लिए cURL का भी इस्तेमाल किया गया है. सेट अप करने और पुष्टि करने वाले टोकन पास करने का तरीका नहीं बताया गया है. रेफ़रंस दस्तावेज़ के साथ इंटिग्रेट किए गए API Explorer का इस्तेमाल करके, इस एपीआई के साथ एक्सपेरिमेंट किया जा सकता है.
Management API का इस्तेमाल करके, नियमों का सेट बनाने और उसे लागू करने के लिए, आम तौर पर यह तरीका अपनाया जाता है:
- नियमों वाली फ़ाइल के सोर्स बनाना
- नियमों का सेट बनाना
- नए नियमों के सेट को रिलीज़ (डिप्लॉय) करें.
सोर्स बनाना
मान लें कि आपको अपने 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'
एपीआई, पुष्टि करने से जुड़ा जवाब और नियमों के सेट का नाम दिखाता है. उदाहरण के लिए, 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 का इस्तेमाल करते समय, रेस कंडीशन से बचें. रेस कंडीशन ऐसी स्थिति होती है जिसमें आपका ऐप्लिकेशन, उन नियमों पर तुरंत निर्भर हो जाता है जिन्हें अभी तक पूरी तरह से डप्लॉय नहीं किया गया है.
REST का इस्तेमाल करके, Realtime Database के नियम सेट अपडेट करना
Realtime Database, Rules को मैनेज करने के लिए अपना REST इंटरफ़ेस उपलब्ध कराता है. REST के ज़रिए Firebase Realtime Database Rules को मैनेज करना लेख पढ़ें.
REST की मदद से नियमों के सेट मैनेज करना
बड़े पैमाने पर नियमों को लागू करने में मदद करने के लिए, मैनेजमेंट एपीआई ये तरीके उपलब्ध कराता है. इनके अलावा, नियमों के सेट और रिलीज़ बनाने के लिए REST तरीका भी उपलब्ध है:
- rulesets को सूची में लगाएं, पाएं, और मिटाएं
- नियमों की सूची बनाना, उन्हें पाना, और मिटाना releases
अगर बहुत बड़े डिप्लॉयमेंट में समय के साथ नियमों की संख्या 2,500 तक पहुंच जाती है, तो तय समय के हिसाब से सबसे पुराने नियमों को मिटाने के लिए लॉजिक बनाया जा सकता है. उदाहरण के लिए, 30 दिनों से ज़्यादा समय से डिप्लॉय किए गए सभी नियम सेट मिटाने के लिए, projects.rulesets.list
तरीके को कॉल करें. इसके बाद, Ruleset
ऑब्जेक्ट की JSON सूची को उनके createTime
कुंजियों पर पार्स करें. इसके बाद, ruleset_id
के हिसाब से संबंधित नियम सेट पर project.rulesets.delete
को कॉल करें.
REST की मदद से अपडेट की जांच करना
आखिर में, मैनेजमेंट एपीआई की मदद से, प्रोडक्शन प्रोजेक्ट में Cloud Firestore और Cloud Storage संसाधनों पर सिंटैक्टिक और सिमेंटिक टेस्ट किए जा सकते हैं.
एपीआई के इस कॉम्पोनेंट की मदद से जांच करने में ये शामिल हैं:
TestCase
ऑब्जेक्ट के सेट को दिखाने के लिए,TestSuite
JSON ऑब्जेक्ट को तय करनाTestSuite
सबमिट करना- वापस लाए गए
TestResult
ऑब्जेक्ट को पार्स करना
आइए, testcase.json
फ़ाइल में एक TestCase
के साथ TestSuite
ऑब्जेक्ट को तय करें. इस उदाहरण में, हमने REST पेलोड के साथ Rules
भाषा के सोर्स को इनलाइन किया है. साथ ही, उन नियमों पर लागू होने वाली टेस्ट सुइट को भी इनलाइन किया है. हम नियमों के आकलन की उम्मीद के बारे में बताते हैं. साथ ही, क्लाइंट के उस अनुरोध के बारे में बताते हैं जिसके आधार पर नियमों के सेट की जांच की जानी है. आपके पास यह तय करने का विकल्प भी होता है कि टेस्ट रिपोर्ट कितनी पूरी है. इसके लिए, "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
(इसमें टेस्ट के पास/फ़ेल होने की स्थिति, डीबग मैसेज की सूचियां, विज़िट किए गए नियमों के एक्सप्रेशन की सूचियां, और उनके आकलन की रिपोर्ट शामिल होती हैं) से, पास होने की स्थिति की पुष्टि होगी. इससे पता चलेगा कि ऐक्सेस की अनुमति सही तरीके से दी गई है.
क्रॉस-सर्विस Cloud Storage Security Rules के लिए अनुमतियां मैनेज करना
अगर आपने Cloud Storage Security Rules बनाए हैं जो सुरक्षा की शर्तों का आकलन करने के लिए, Cloud Firestore दस्तावेज़ के कॉन्टेंट का इस्तेमाल करते हैं, तो आपको Firebase कंसोल या Firebase सीएलआई में, दोनों प्रॉडक्ट को कनेक्ट करने की अनुमतियां चालू करने के लिए कहा जाएगा.
अगर आपको अलग-अलग सेवाओं के लिए सुरक्षा से जुड़ी यह सुविधा बंद करनी है, तो:
इस सुविधा को बंद करने से पहले, अपने नियमों में बदलाव करें. साथ ही, उन सभी स्टेटमेंट को हटाएं जिनमें Rules फ़ंक्शन का इस्तेमाल करके Cloud Firestore को ऐक्सेस किया जाता है. अगर ऐसा नहीं किया जाता है, तो सुविधा बंद होने के बाद, Rules आकलन की वजह से स्टोरेज के आपके अनुरोध पूरे नहीं हो पाएंगे.
Google Cloud Console में IAM पेज का इस्तेमाल करके, "Firebase Rules Firestore Service Agent" भूमिका को मिटाएं. इसके लिए, भूमिकाएं रद्द करने के लिए Cloud गाइड में दिया गया तरीका अपनाएं.
अगली बार जब Firebase CLI या Firebase कंसोल से, अलग-अलग सेवाओं के लिए नियम सेव किए जाएंगे, तब आपको इस सुविधा को फिर से चालू करने के लिए कहा जाएगा.