Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

साथ में Firebase CLI , आप स्थानीय स्रोतों और तैनाती रिलीज अपलोड कर सकते हैं। 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 का उपयोग करके लगातार अपडेट करते रहते हैं। अन्यथा, आप 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 कंसोल से विज्ञप्ति के रूप में तैनात। वाक्यात्मक परीक्षण symantic परीक्षण नियम खेल का मैदान का उपयोग कर के रूप में उपलब्ध है Firebase सांत्वना यूआई में आप संपादित किया जाता है, और।

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

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

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

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

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

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

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

आप Node.js rulesets के लिए नियंत्रक 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);

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

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

नियमों का प्रबंधन करें

मदद बड़े rulesets का प्रबंधन करने के लिए, नियंत्रक 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 दिनों के लिए तैनात सभी rulesets को हटाने के लिए:

    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 Firebase परियोजना और बंद-डाउन क्लाउड संग्रहण नियम को तैनात करना चाहते हैं। तुम एक में इन नियमों को लागू कर सकते storage.rules फ़ाइल।

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

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

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 इंटरफ़ेस प्रदान करता है। देखें बाकी के माध्यम से प्रबंध Firebase रीयलटाइम डाटाबेस नियम

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

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

  • सूची, मिलता है, और नष्ट rulesets
  • सूची, मिलता है, और नष्ट नियम विज्ञप्ति

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

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

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

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

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

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

 {
  "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 साथ evalution के लिए projects.test विधि।

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

लौटे TestReport (परीक्षण सफलता / असफलता की स्थिति, डिबग संदेशों की सूचियों, का दौरा किया नियम भाव और उनके मूल्यांकन रिपोर्ट की सूची से युक्त) स्थिति सफलता के साथ इस बात की पुष्टि है कि पहुँच ठीक से अनुमति दी है।