Catch up on highlights from Firebase at Google I/O 2023. Learn more

Firebase सुरक्षा नियम प्रबंधित और परिनियोजित करें

फायरबेस आपको अपने नियमों को प्रबंधित करने के लिए कई उपकरण प्रदान करता है, प्रत्येक विशेष मामलों में उपयोगी होता है, और प्रत्येक एक ही बैक-एंड फायरबेस सुरक्षा नियम प्रबंधन एपीआई का उपयोग करता है।

कोई फर्क नहीं पड़ता कि इसे लागू करने के लिए किस टूल का उपयोग किया जाता है, प्रबंधन API:

  • एक नियम स्रोत को शामिल करता है : नियमों का एक सेट, आमतौर पर एक कोड फ़ाइल जिसमें फायरबेस सुरक्षा नियम विवरण होते हैं।
  • अंतर्ग्रहण स्रोत को एक अपरिवर्तनीय नियम-सेट के रूप में संग्रहित करता है।
  • रिलीज़ में प्रत्येक नियमसेट के परिनियोजन को ट्रैक करता है. फायरबेस सुरक्षा नियम-सक्षम सेवाएं एक सुरक्षित संसाधन के लिए प्रत्येक अनुरोध का मूल्यांकन करने के लिए एक परियोजना के लिए रिलीज़ को देखती हैं।
  • एक नियम-सेट के सिंटैक्टिक और सिमेंटिक परीक्षण चलाने की क्षमता प्रदान करता है।

फायरबेस सीएलआई का प्रयोग करें

फायरबेस सीएलआई के साथ, आप स्थानीय स्रोत अपलोड कर सकते हैं और रिलीज को तैनात कर सकते हैं। CLI का Firebase स्थानीय एम्यूलेटर सूट आपको स्रोतों का पूर्ण स्थानीय परीक्षण करने देता है।

सीएलआई का उपयोग करने से आप अपने नियमों को अपने एप्लिकेशन कोड के साथ संस्करण नियंत्रण में रख सकते हैं और अपनी मौजूदा परिनियोजन प्रक्रिया के भाग के रूप में नियमों को परिनियोजित कर सकते हैं।

कॉन्फ़िगरेशन फ़ाइल जनरेट करें

जब आप Firebase CLI का उपयोग करके अपने Firebase प्रोजेक्ट को कॉन्फ़िगर करते हैं, तो आप अपनी प्रोजेक्ट निर्देशिका में एक .rules कॉन्फ़िगरेशन फ़ाइल बनाते हैं। अपने फायरबेस प्रोजेक्ट को कॉन्फ़िगर करना प्रारंभ करने के लिए निम्न कमांड का उपयोग करें:

क्लाउड फायरस्टोर

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

रीयलटाइम डेटाबेस

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

घन संग्रहण

// Set up Storage in your project directory, creates a .rules file
firebase init storage

संपादित करें और अपने नियमों को अद्यतन करें

अपने नियम स्रोत को सीधे .rules कॉन्फ़िगरेशन फ़ाइल में संपादित करें। सुनिश्चित करें कि आपके द्वारा Firebase CLI में किया गया कोई भी संपादन Firebase कंसोल में परिलक्षित होता है, या यह कि आप Firebase कंसोल या Firebase CLI का उपयोग करके लगातार अपडेट करते हैं। अन्यथा, आप फायरबेस कंसोल में किए गए किसी भी अपडेट को अधिलेखित कर सकते हैं।

अपने अपडेट का परीक्षण करें

स्थानीय एमुलेटर सूट सभी सुरक्षा नियम-सक्षम उत्पादों के लिए एमुलेटर प्रदान करता है। प्रत्येक एमुलेटर के लिए सुरक्षा नियम इंजन नियमों का सिंटैक्टिक और सिमेंटिक मूल्यांकन दोनों करता है, इस प्रकार सुरक्षा नियम प्रबंधन एपीआई ऑफ़र सिंटैक्टिक परीक्षण से अधिक है।

यदि आप सीएलआई के साथ काम कर रहे हैं, तो सुइट फायरबेस सुरक्षा नियम परीक्षण के लिए एक उत्कृष्ट उपकरण है। स्थानीय रूप से अपने अपडेट का परीक्षण करने के लिए स्थानीय एमुलेटर सूट का उपयोग करें और पुष्टि करें कि आपके ऐप के नियम आपके इच्छित व्यवहार को प्रदर्शित करते हैं।

अपने अद्यतन तैनात करें

एक बार जब आप अपने नियमों को अद्यतन और परीक्षण कर लेते हैं, तो स्रोतों को उत्पादन में परिनियोजित करें। केवल अपने नियमों को चुनिंदा रूप से परिनियोजित करने या उन्हें अपनी सामान्य परिनियोजन प्रक्रिया के भाग के रूप में परिनियोजित करने के लिए निम्न आदेशों का उपयोग करें।

क्लाउड फायरस्टोर

// Deploy your .rules file
firebase deploy --only firestore:rules

रीयलटाइम डेटाबेस

// Deploy your .rules file
firebase deploy --only database

घन संग्रहण

// Deploy your .rules file
firebase deploy --only storage

फायरबेस कंसोल का प्रयोग करें

आप नियम स्रोतों को संपादित भी कर सकते हैं और उन्हें Firebase कंसोल से रिलीज़ के रूप में तैनात कर सकते हैं। जैसा कि आप फायरबेस कंसोल यूआई में संपादित करते हैं, सिंटैक्टिक परीक्षण किया जाता है, और नियम प्लेग्राउंड का उपयोग करके सिमेंटिक परीक्षण उपलब्ध है।

संपादित करें और अपने नियमों को अद्यतन करें

  1. फायरबेस कंसोल खोलें और अपना प्रोजेक्ट चुनें।
  2. फिर, उत्पाद नेविगेशन से रीयलटाइम डेटाबेस , क्लाउड फायरस्टोर या स्टोरेज का चयन करें, फिर नियम संपादक पर नेविगेट करने के लिए नियमों पर क्लिक करें।
  3. अपने नियमों को सीधे संपादक में संपादित करें।

अपने अपडेट का परीक्षण करें

संपादक यूआई में सिंटैक्स का परीक्षण करने के अलावा, आप अपने प्रोजेक्ट के डेटाबेस और स्टोरेज संसाधनों का उपयोग करके सीधे फायरबेस कंसोल में, नियमों के प्लेग्राउंड का उपयोग करके सिमेंटिक नियमों के व्यवहार का परीक्षण कर सकते हैं। रूल्स एडिटर में रूल्स प्लेग्राउंड स्क्रीन खोलें, सेटिंग्स को संशोधित करें और रन पर क्लिक करें। संपादक के शीर्ष पर पुष्टिकरण संदेश देखें।

अपने अद्यतन तैनात करें

एक बार जब आप संतुष्ट हो जाते हैं कि आपके अपडेट आपकी अपेक्षा के अनुरूप हैं, तो प्रकाशित करें पर क्लिक करें।

व्यवस्थापक एसडीके का प्रयोग करें

आप Node.js नियम-सेट के लिए व्यवस्थापक SDK का उपयोग कर सकते हैं। इस प्रोग्रामेटिक एक्सेस के साथ, आप यह कर सकते हैं:

  • नियमों के प्रबंधन के लिए कस्टम टूल्स, स्क्रिप्ट्स, डैशबोर्ड्स और सीआई/सीडी पाइपलाइनों को लागू करें।
  • एकाधिक फायरबेस परियोजनाओं में नियमों को अधिक आसानी से प्रबंधित करें।

नियमों को प्रोग्रामेटिक रूप से अपडेट करते समय, अपने ऐप के एक्सेस कंट्रोल में अनपेक्षित परिवर्तन करने से बचना बहुत महत्वपूर्ण है। विशेष रूप से नियमों को अपडेट या परिनियोजित करते समय सुरक्षा को ध्यान में रखते हुए अपना व्यवस्थापक SDK कोड लिखें।

ध्यान रखने वाली एक और महत्वपूर्ण बात यह है कि फायरबेस सुरक्षा नियम जारी होने में पूरी तरह से प्रचार करने में कई मिनट लगते हैं। नियमों को परिनियोजित करने के लिए व्यवस्थापक SDK का उपयोग करते समय, सुनिश्चित करें कि आप उन दौड़ स्थितियों से बचना चाहते हैं जिनमें आपका ऐप तुरंत उन नियमों पर निर्भर करता है जिनकी तैनाती अभी पूरी नहीं हुई है। यदि आपके उपयोग के मामले में नियंत्रण नियमों तक पहुँचने के लिए बार-बार अपडेट की आवश्यकता होती है, तो क्लाउड फायरस्टोर का उपयोग करके समाधान पर विचार करें, जिसे बार-बार अपडेट के बावजूद दौड़ की स्थिति को कम करने के लिए डिज़ाइन किया गया है।

इन सीमाओं पर भी ध्यान दें:

  • क्रमबद्ध होने पर नियम UTF-8 एन्कोडेड टेक्स्ट के 256 KiB से छोटे होने चाहिए।
  • एक परियोजना में अधिकतम 2500 कुल परिनियोजित नियम सेट हो सकते हैं। एक बार जब यह सीमा समाप्त हो जाती है, तो नए नियम बनाने से पहले आपको कुछ पुराने नियमों को हटाना होगा।

क्लाउड स्टोरेज या क्लाउड फायरस्टोर नियमसेट बनाएं और परिनियोजित करें

व्यवस्थापक SDK के साथ सुरक्षा नियमों के प्रबंधन के लिए एक विशिष्ट कार्यप्रवाह में तीन असतत चरण शामिल हो सकते हैं:

  1. एक नियम फ़ाइल स्रोत बनाएँ (वैकल्पिक)
  2. एक नियम-सेट बनाएँ
  3. नया नियम-सेट जारी करें या परिनियोजित करें

SDK इन चरणों को Cloud Storage और Cloud Firestore सुरक्षा नियमों के लिए एकल API कॉल में संयोजित करने का एक तरीका प्रदान करता है। उदाहरण के लिए:

    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() के साथ काम करता है।

वैकल्पिक रूप से, आप नियम फ़ाइल को इन-मेमोरी ऑब्जेक्ट के रूप में बना सकते हैं, नियमसेट बना सकते हैं, और इन घटनाओं के निकट नियंत्रण के लिए नियमसेट को अलग से तैनात कर सकते हैं। उदाहरण के लिए:

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

रीयलटाइम डेटाबेस नियमसेट अपडेट करें

व्यवस्थापक SDK के साथ रीयलटाइम डेटाबेस नियमसेट अपडेट करने के लिए, 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);

नियमसेट प्रबंधित करें

बड़े नियमसेट प्रबंधित करने में सहायता के लिए, व्यवस्थापक 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.`);

रेस्ट एपीआई का इस्तेमाल करें

ऊपर वर्णित उपकरण विभिन्न वर्कफ़्लोज़ के लिए उपयुक्त हैं, लेकिन आप स्वयं प्रबंधन API का उपयोग करके फायरबेस सुरक्षा नियमों को प्रबंधित और परिनियोजित करना चाह सकते हैं। प्रबंधन एपीआई आपको सबसे अधिक लचीलापन देता है।

सावधान रहें कि फायरबेस सुरक्षा नियम जारी होने में पूरी तरह से लागू होने में कई मिनट लगते हैं। परिनियोजित करने के लिए प्रबंधन REST API का उपयोग करते समय, दौड़ की स्थितियों से बचना सुनिश्चित करें जिसमें आपका ऐप तुरंत उन नियमों पर निर्भर करता है जिनकी परिनियोजन अभी तक पूर्ण नहीं हुई है।

इन सीमाओं पर भी ध्यान दें:

  • क्रमबद्ध होने पर नियम UTF-8 एन्कोडेड टेक्स्ट के 256 KiB से छोटे होने चाहिए।
  • एक परियोजना में अधिकतम 2500 कुल परिनियोजित नियम सेट हो सकते हैं। एक बार जब यह सीमा समाप्त हो जाती है, तो नए नियम बनाने से पहले आपको कुछ पुराने नियमों को हटाना होगा।

REST के साथ क्लाउड स्टोरेज या क्लाउड फायरस्टोर नियमसेट बनाएं और परिनियोजित करें

इस खंड के उदाहरण संग्रहण नियमों का उपयोग करते हैं, हालांकि वे क्लाउड फायरस्टोर नियमों पर भी लागू होते हैं।

एपीआई कॉल करने के लिए उदाहरण cURL का भी उपयोग करते हैं। प्रमाणीकरण टोकन सेट अप और पास करने के चरण छोड़े गए हैं। आप संदर्भ प्रलेखन के साथ एकीकृत एपीआई एक्सप्लोरर का उपयोग करके इस एपीआई के साथ प्रयोग कर सकते हैं।

प्रबंधन API का उपयोग करके नियमसेट बनाने और परिनियोजित करने के विशिष्ट चरण हैं:

  1. एक नियम फ़ाइल स्रोत बनाएँ
  2. एक नियम-सेट बनाएँ
  3. नया नियम सेट जारी (तैनाती) करें

मान लें कि आप अपने secure_commerce फायरबेस प्रोजेक्ट पर काम कर रहे हैं और लॉक-डाउन क्लाउड स्टोरेज नियम लागू करना चाहते हैं। आप इन नियमों को एक storage.rules फ़ाइल में लागू कर सकते हैं।

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

अब, इस फाइल के लिए एक बेस64-एन्कोडेड फिंगरप्रिंट जनरेट करें। इसके बाद आप इस फ़ाइल में स्रोत का उपयोग कर सकते हैं ताकि projects.rulesets.create REST कॉल के साथ एक नियमसेट बनाने के लिए आवश्यक पेलोड को पॉप्युलेट किया जा सके। यहां, हम REST पेलोड में storage.rules की सामग्री डालने के लिए cat कमांड का उपयोग करते हैं।

curl -X POST -d '{
  "source": {
    {
      "files": [
        {
          "content": "' $(cat storage.rules) '",
          "name": "storage.rules",
          "fingerprint": <sha fingerprint>
        }
      ]
    }
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

एपीआई एक सत्यापन प्रतिक्रिया और एक नियम सेट नाम देता है, उदाहरण के लिए projects/secure_commerce/rulesets/uuid123 । अगर नियम-सेट मान्य है, तो नए नियम-सेट को नामांकित रिलीज़ में परिनियोजित करना अंतिम चरण है.

curl -X POST -d '{
  "name": "projects/secure_commerce/releases/prod/v23   "  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123",
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

रीयलटाइम डेटाबेस नियमसेट को REST के साथ अपडेट करें

रीयलटाइम डेटाबेस नियमों के प्रबंधन के लिए अपना स्वयं का REST इंटरफ़ेस प्रदान करता है। REST के माध्यम से फायरबेस रीयलटाइम डेटाबेस नियम प्रबंधित करना देखें।

REST के साथ नियमसेट प्रबंधित करें

नियम सेट और रिलीज़ बनाने के लिए REST पद्धति के अतिरिक्त, बड़े नियम परिनियोजन प्रबंधित करने में सहायता के लिए, प्रबंधन API निम्न तरीके प्रदान करता है:

  • नियमों को सूचीबद्ध करें, प्राप्त करें और हटाएं
  • नियम विज्ञप्ति को सूचीबद्ध करें, प्राप्त करें और हटाएं

समय के साथ 2500 नियमों की सीमा तक पहुँचने वाले बहुत बड़े परिनियोजनों के लिए, आप निश्चित समय चक्र पर सबसे पुराने नियमों को हटाने के लिए तर्क बना सकते हैं। उदाहरण के लिए, 30 दिनों से अधिक समय के लिए तैनात सभी नियमों को हटाने के लिए, आप projects.rulesets.list पद्धति को कॉल कर सकते हैं, JSON सूची के Ruleset सूची को उनके createTime कुंजियों पर पार्स कर सकते हैं, फिर project.rulesets.delete को ruleset_id द्वारा संबंधित नियमों पर कॉल कर सकते हैं। .

REST के साथ अपने अद्यतनों का परीक्षण करें

अंत में, प्रबंधन एपीआई आपको अपनी उत्पादन परियोजनाओं में क्लाउड फायरस्टोर और क्लाउड स्टोरेज संसाधनों पर सिंटैक्टिक और सिमेंटिक परीक्षण चलाने की अनुमति देता है।

एपीआई के इस घटक के साथ परीक्षण में निम्न शामिल हैं:

  1. TestCase ऑब्जेक्ट्स के एक सेट का प्रतिनिधित्व करने के लिए TestSuite JSON ऑब्जेक्ट को परिभाषित करना
  2. TestSuite सबमिट करना
  3. पार्सिंग ने TestResult ऑब्जेक्ट लौटाए

आइए एक testcase.json फ़ाइल में एक TestCase के साथ एक TestSuite ऑब्जेक्ट परिभाषित करें। इस उदाहरण में, हम उन नियमों पर चलने के लिए परीक्षण सूट के साथ-साथ REST पेलोड के साथ नियम भाषा स्रोत इनलाइन पास करते हैं। हम एक नियम मूल्यांकन अपेक्षा और क्लाइंट अनुरोध निर्दिष्ट करते हैं जिसके विरुद्ध नियमसेट का परीक्षण किया जाना है। आप यह भी निर्दिष्ट कर सकते हैं कि परीक्षण रिपोर्ट कितनी पूर्ण है, सभी नियमों के परिणामों को इंगित करने के लिए "FULL" मान का उपयोग करके रिपोर्ट में भाषा अभिव्यक्तियों को शामिल किया जाना चाहिए, जिसमें वे अभिव्यक्तियाँ शामिल हैं जो अनुरोध से मेल नहीं खाती थीं।

 {
  "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 (परीक्षण सफलता/विफलता की स्थिति, डिबग संदेशों की सूची, विज़िट किए गए नियमों के भावों की सूची और उनकी मूल्यांकन रिपोर्ट सहित) सफलता की स्थिति के साथ पुष्टि करेगी कि एक्सेस की अनुमति ठीक से दी गई है।

क्रॉस-सर्विस क्लाउड स्टोरेज सुरक्षा नियमों के लिए अनुमतियां प्रबंधित करें

यदि आप क्लाउड स्टोरेज सुरक्षा नियम बनाते हैं जो सुरक्षा स्थितियों का मूल्यांकन करने के लिए क्लाउड फायरस्टोर दस्तावेज़ सामग्री का उपयोग करते हैं, तो आपको फायरबेस कंसोल या फायरबेस सीएलआई में दो उत्पादों को जोड़ने के लिए अनुमतियों को सक्षम करने के लिए कहा जाएगा।

यदि आप ऐसी क्रॉस-सर्विस सुरक्षा को अक्षम करने का निर्णय लेते हैं:

  1. सबसे पहले, सुविधा को अक्षम करने से पहले, अपने नियमों को संपादित करें, उन सभी कथनों को हटा दें जो क्लाउड फायरस्टोर तक पहुँचने के लिए नियम कार्यों का उपयोग करते हैं। अन्यथा, सुविधा के अक्षम होने के बाद, नियम मूल्यांकन आपके संग्रहण अनुरोधों को विफल कर देगा।

  2. भूमिकाओं को रद्द करने के लिए क्लाउड गाइड का पालन करके "फायरबेस रूल्स फायरस्टोर सर्विस एजेंट" भूमिका को हटाने के लिए Google क्लाउड कंसोल में IAM पृष्ठ का उपयोग करें।

अगली बार जब आप फायरबेस सीएलआई या फायरबेस कंसोल से क्रॉस-सर्विस नियम सहेजेंगे तो आपको सुविधा को फिर से सक्षम करने के लिए कहा जाएगा।