Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

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

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

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

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

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

एक कॉन्फ़िगरेशन फ़ाइल उत्पन्न करें

जब आप 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 का उपयोग करके लगातार अपडेट करते रहते हैं। अन्यथा, आप Firebase कंसोल में किए गए किसी भी अपडेट को अधिलेखित कर सकते हैं।

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

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

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

अपने अपडेट तैनात करें

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

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

// 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 कंसोल से रिलीज़ के रूप में परिनियोजित कर सकते हैं। जैसे ही आप Firebase कंसोल UI में संपादित करते हैं, सिंटैक्स परीक्षण किया जाता है, और नियम खेल के मैदान का उपयोग करके सिमेंटिक परीक्षण उपलब्ध होता है।

अपने नियम संपादित करें और अपडेट करें

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

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

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

अपने अपडेट तैनात करें

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

व्यवस्थापक SDK का उपयोग करें

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

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

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

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

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

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

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

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

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

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

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

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

व्यवस्थापक एसडीके के साथ रीयलटाइम डेटाबेस नियमों को अपडेट करने के लिए, admin.database के getRules() और admin.database 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 का उपयोग करके Firebase सुरक्षा नियमों को प्रबंधित और परिनियोजित करना चाहें। प्रबंधन एपीआई आपको सबसे बड़ा लचीलापन देता है।

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

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

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

आरईएसटी के साथ क्लाउड स्टोरेज या क्लाउड फायरस्टोर नियम बनाएं और तैनात करें

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

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

प्रबंधन 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 विधि के अलावा, प्रबंधन API निम्न तरीके प्रदान करता है:

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

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

REST . के साथ अपने अपडेट का परीक्षण करें

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

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

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

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

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