إدارة ونشر قواعد أمان Firebase

يوفر لك Firebase العديد من الأدوات لإدارة القواعد ، كل واحدة منها مفيدة في حالات معينة ، وكل واحدة تستخدم نفس واجهة برمجة تطبيقات إدارة قواعد أمان Firebase الخلفية.

بغض النظر عن الأداة المستخدمة لاستدعائها ، فإن واجهة برمجة تطبيقات الإدارة:

  • يبتلع مصدر القواعد: مجموعة من القواعد، عادة ما يكون ملف التعليمات البرمجية التي تحتوي على بيانات قواعد الأمن Firebase.
  • بلعها مخازن مصدر باعتباره مجموعة قواعد غير قابل للتغيير.
  • يتابع نشر كل مجموعة الأوامر في بيان. تبحث الخدمات الممكّنة لقواعد أمان Firebase عن إصدار مشروع لتقييم كل طلب لمورد مؤمن.
  • يوفر القدرة على تشغيل الاختبارات النحوية والدلالية لمجموعة الأوامر.

استخدم Firebase CLI

مع Firebase CLI ، يمكنك تحميل مصادر محلية والنشرات نشر. Firebase المحلية المحاكي جناح المبادرة القطرية لتمكنك من أداء الاختبار المحلي الكامل من المصادر.

يتيح لك استخدام CLI إبقاء القواعد الخاصة بك تحت التحكم في الإصدار باستخدام كود التطبيق الخاص بك ونشر القواعد كجزء من عملية النشر الحالية.

قم بإنشاء ملف التكوين

عند تكوين مشروع Firebase باستخدام Firebase CLI، يمكنك إنشاء .rules ملف التكوين في دليل المشروع الخاص بك. استخدم الأمر التالي لبدء تكوين مشروع Firebase:

سحابة Firestore

// 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.

اختبر تحديثاتك

يوفر Local Emulator Suite برامج محاكاة لجميع المنتجات التي تدعم قواعد الأمان. يقوم محرك قواعد الأمان لكل محاكي بإجراء تقييم نحوي ودلالي للقواعد ، وبالتالي يتجاوز الاختبار النحوي الذي توفره واجهة برمجة تطبيقات إدارة قواعد الأمان.

إذا كنت تعمل مع CLI ، فإن Suite هي أداة ممتازة لاختبار قواعد أمان Firebase. استخدام المحاكي جناح المحلية لاختبار التحديثات محليا وتؤكد أن قواعد التطبيق الخاص بك يحمل السلوك الذي تريده.

انشر تحديثاتك

بمجرد تحديث القواعد واختبارها ، انشر المصادر في الإنتاج. استخدم الأوامر التالية لنشر القواعد بشكل انتقائي بمفردها أو نشرها كجزء من عملية النشر العادية.

سحابة Firestore

// 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. يتم إجراء اختبار نحوي كما كنت التحرير في Firebase حدة UI، واختبار symantic متاح باستخدام ملعب القواعد.

تحرير وتحديث القواعد الخاصة بك

  1. فتح وحدة التحكم Firebase وحدد المشروع الخاص بك.
  2. ثم، حدد قاعدة البيانات في الوقت الحقيقي، سحابة Firestore أو التخزين من التنقل المنتج، ثم انقر فوق قواعد للانتقال إلى محرر القواعد.
  3. قم بتحرير القواعد الخاصة بك مباشرة في المحرر.

اختبر تحديثاتك

بالإضافة إلى اختبار بناء الجملة في UI محرر، يمكنك اختبار سلوك النظام الدلالي، وذلك باستخدام قاعدة البيانات وتخزين موارد المشروع الخاص بك، مباشرة في وحدة تحكم Firebase، وذلك باستخدام ملعب قوانين . فتح شاشة قواعد ملعب في محرر القواعد، تعديل إعدادات ثم انقر فوق تشغيل. ابحث عن رسالة التأكيد أعلى المحرر.

انشر تحديثاتك

ذات مرة كنت راضيا أن التحديثات الخاصة بك ما كنت تتوقع، انقر فوق نشر.

استخدم Admin SDK

يمكنك استخدام SDK الادارية لrulesets نود.جي إس. باستخدام هذا الوصول الآلي ، يمكنك:

  • تنفيذ أدوات مخصصة ونصوص ولوحات معلومات وخطوط أنابيب CI / CD لإدارة القواعد.
  • إدارة القواعد بسهولة أكبر عبر مشاريع Firebase المتعددة.

عند تحديث القواعد برمجيًا ، من المهم جدًا تجنب إجراء تغييرات غير مقصودة على التحكم في الوصول لتطبيقك. اكتب رمز Admin SDK الخاص بك مع وضع الأمان في الاعتبار في المقام الأول ، خاصة عند تحديث القواعد أو نشرها.

شيء آخر مهم يجب مراعاته هو أن إصدارات قواعد أمان Firebase تستغرق عدة دقائق لنشرها بالكامل. عند استخدام Admin SDK لنشر القواعد ، تأكد من تجنب ظروف السباق التي يعتمد فيها تطبيقك فورًا على القواعد التي لم يكتمل نشرها بعد. إذا كانت حالة الاستخدام الخاصة بك تتطلب تحديثات متكررة للوصول إلى قواعد التحكم ، ففكر في الحلول باستخدام Cloud Firestore ، المصمم لتقليل ظروف السباق على الرغم من التحديثات المتكررة.

لاحظ أيضًا هذه الحدود:

  • يجب أن تكون القواعد أصغر من 256 كيلوبايت من النص المشفر UTF-8 عند إجراء تسلسل.
  • يمكن أن يحتوي المشروع على 2500 مجموعة قواعد تم نشرها على الأكثر. بمجرد الوصول إلى هذا الحد ، يجب عليك حذف بعض مجموعات القواعد القديمة قبل إنشاء مجموعات جديدة.

قم بإنشاء ونشر مجموعات قواعد Cloud Storage أو Cloud Firestore

يمكن أن يتضمن سير العمل النموذجي لإدارة قواعد الأمان باستخدام Admin SDK ثلاث خطوات منفصلة:

  1. إنشاء مصدر ملف قواعد (اختياري)
  2. أنشئ مجموعة قواعد
  3. حرر أو انشر مجموعة القواعد الجديدة

توفر 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() .

بدلاً من ذلك ، يمكنك إنشاء ملف القواعد ككائن في الذاكرة ، وإنشاء مجموعة القواعد ، ونشر مجموعة القواعد بشكل منفصل للتحكم بشكل أكبر في هذه الأحداث. على سبيل المثال:

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

تحديث مجموعات قواعد قاعدة بيانات الوقت الفعلي

لتحديث قاعدة البيانات في الوقت الحقيقي rulesets مع 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);

إدارة القواعد

للمساعدة في إدارة 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 مجموعة قواعد بمرور الوقت ، يمكنك إنشاء منطق لحذف أقدم القواعد في دورة زمنية محددة. على سبيل المثال، لحذف جميع rulesets نشرها لمدة أطول من 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

الأدوات الموضحة أعلاه مناسبة تمامًا لعمليات سير العمل المختلفة ، ولكن قد ترغب في إدارة ونشر قواعد أمان Firebase باستخدام واجهة برمجة تطبيقات الإدارة نفسها. تمنحك واجهة برمجة تطبيقات الإدارة أكبر قدر من المرونة.

اعلم أن إصدارات قواعد أمان Firebase تستغرق عدة دقائق لنشرها بالكامل. عند استخدام واجهة برمجة تطبيقات الإدارة REST للنشر ، تأكد من تجنب ظروف السباق التي يعتمد فيها تطبيقك فورًا على القواعد التي لم يكتمل نشرها بعد.

لاحظ أيضًا هذه الحدود:

  • يجب أن تكون القواعد أصغر من 256 كيلوبايت من النص المشفر UTF-8 عند إجراء تسلسل.
  • يمكن أن يحتوي المشروع على 2500 مجموعة قواعد تم نشرها على الأكثر. بمجرد الوصول إلى هذا الحد ، يجب عليك حذف بعض مجموعات القواعد القديمة قبل إنشاء مجموعات جديدة.

قم بإنشاء ونشر مجموعات قواعد التخزين السحابي أو Cloud Firestore باستخدام REST

تستخدم الأمثلة الواردة في هذا القسم قواعد التخزين ، على الرغم من أنها تنطبق أيضًا على قواعد Cloud Firestore.

تستخدم الأمثلة أيضًا cURL لإجراء استدعاءات API. تم حذف خطوات إعداد الرموز المميزة للمصادقة وتمريرها. يمكنك تجربة مع هذا API باستخدام API متكاملة Explorer مع الوثائق المرجعية .

الخطوات النموذجية لإنشاء ونشر مجموعة قواعد باستخدام واجهة برمجة تطبيقات الإدارة هي:

  1. إنشاء مصادر ملف القواعد
  2. أنشئ مجموعة قواعد
  3. حرر (نشر) مجموعة القواعد الجديدة

لنفترض أنك تعمل على جهاز secure_commerce مشروع Firebase وترغب في نشر لأسفل تأمين قواعد التخزين السحابية. يمكنك تطبيق هذه القواعد في storage.rules الملف.

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

الآن ، قم بإنشاء بصمة base64 المشفرة لهذا الملف. ثم يمكنك استخدام المصدر في هذا الملف لتجميع حمولة اللازمة لإنشاء مجموعة الأوامر مع projects.rulesets.create دعوة REST. هنا، ونحن نستخدم cat الأمر لإدراج محتويات storage.rules في حمولة REST.

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'

وAPI بإرجاع استجابة التحقق من صحة واسم مجموعة الأوامر، على سبيل المثال 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

توفر Realtime Database واجهة REST الخاصة بها لإدارة القواعد. ترى إدارة قواعد بيانات Firebase الحقيقي عبر REST .

إدارة القواعد باستخدام REST

للمساعدة في إدارة عمليات نشر القواعد الكبيرة ، بالإضافة إلى طريقة REST لإنشاء مجموعات القواعد والإصدارات ، توفر واجهة برمجة تطبيقات الإدارة طرقًا من أجل:

  • قائمة، والحصول على وrulesets الحذف
  • قائمة، والحصول، والنشرات قواعد الحذف

لعمليات النشر الكبيرة جدًا التي تصل إلى 2500 مجموعة قواعد بمرور الوقت ، يمكنك إنشاء منطق لحذف أقدم القواعد في دورة زمنية محددة. على سبيل المثال، لحذف جميع rulesets نشرها لمدة أطول من 30 يوما، يمكنك الاتصال projects.rulesets.list طريقة، تحليل قائمة JSON من Ruleset تعترض على هم createTime المفاتيح، ثم استدعاء project.rulesets.delete على rulesets المقابلة التي ruleset_id .

اختبر تحديثاتك مع REST

أخيرًا ، تتيح لك واجهة برمجة تطبيقات الإدارة إجراء اختبارات نحوية ودلالية على موارد Cloud Firestore و Cloud Storage في مشاريع الإنتاج الخاصة بك.

يتكون الاختبار باستخدام هذا المكون من واجهة برمجة التطبيقات من:

  1. تحديد TestSuite كائن JSON لتمثيل مجموعة من TestCase الأجسام
  2. تقديم TestSuite
  3. تحليل عاد TestResult الأجسام

دعونا تعرف على TestSuite الكائن مع واحد TestCase في testcase.json الملف. في هذا المثال ، نقوم بتمرير مصدر لغة القواعد بالتوافق مع حمولة 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 لevalution مع projects.test الأسلوب.

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

عاد TestReport أن (التي تحتوي على اختبار النجاح / حالة فشل، وقوائم من رسائل التصحيح، وقوائم تعبيرات قوانين زار وتقارير التقييم الخاصة بهم) مع تأكيد حالة نجاح الذي يسمح الوصول بشكل صحيح.