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

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

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

  • نقل بيانات مصدر القواعد: مجموعة من القواعد، وعادةً ما تكون عبارة عن ملف رمز يحتوي على كشوفات حساب Firebase Security Rules
  • تخزِّن مصدرًا تم نقله على أنّه مجموعة قواعد غير قابلة للتغيير.
  • يمكنك تتبُّع نشر كل مجموعة قواعد في الإصدار. أمان Firebase تبحث الخدمات التي يتم تفعيل القواعد فيها عن إصدار مشروع لتقييم كل طلب. للحصول على مورد آمن.
  • توفّر إمكانية إجراء اختبارات نحوية ودلالية لمجموعة قواعد.

استخدام واجهة سطر الأوامر Firebase

باستخدام Firebase واجهة سطر الأوامر، يمكنك تحميل المصادر المحلية ونشر الإصدارات واجهة سطر الأوامر يتيح لك Firebase Local Emulator Suite إجراء اختبار محلي كامل للمصادر.

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

إنشاء ملف إعداد

عند إعداد مشروعك على Firebase باستخدام واجهة سطر الأوامر 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 وإلا، يمكنك استبدال أي التحديثات التي تم إجراؤها في وحدة تحكُّم "Firebase"

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

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

إذا كنت تستخدم واجهة سطر الأوامر، تُعتبر الحزمة أداة ممتازة لـ Firebase Security Rules اختبار الفرضية. يمكنك استخدام Local Emulator Suite لاختبار التعديلات. محليًا والتأكد من أن Rules في تطبيقك يُظهر السلوك الذي نريدها.

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

بعد تحديث Rules واختباره، انشر المصادر من أجل والإنتاج.

بالنسبة إلى Cloud Firestore Security Rules، يمكنك ربط .rules ملف بملف الدفع التلقائي قواعد بيانات إضافية مُسمّاة من خلال مراجعة وتحديث ملف firebase.json

يمكنك استخدام الأوامر التالية لنشر جهاز 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

يمكنك أيضًا تعديل مصادر Rules ونشرها على أنّها إصدارات من وحدة تحكم Firebase. يتم تنفيذ الاختبار النحوي أثناء التعديل في واجهة المستخدم في وحدة التحكم Firebase، ويتوفر الاختبار الدلالي باستخدام ملعب "Rules"

تعديل القواعد وتعديلها

  1. افتح وحدة تحكُّم Firebase واختَر مشروعك.
  2. بعد ذلك، اختَر Realtime Database أو Cloud Firestore أو مساحة التخزين من التنقّل في المنتج، ثم انقر على القواعد للانتقال إلى محرِّر Rules
  3. عدِّل القواعد مباشرةً في المحرِّر.

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

بالإضافة إلى اختبار بناء الجملة في واجهة مستخدم المحرر، يمكنك اختبار دلالات Rules باستخدام قاعدة بيانات مشروعك وموارد مساحة التخزين، مباشرةً في وحدة تحكُّم Firebase، باستخدام ساحة Rules افتح ساحة القواعد في محرِّر Rules، عدِّل الإعدادات وانقر على تشغيل. ابحث عن رسالة التأكيد في أعلى المحرِّر.

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

بعد التأكّد من أنّ التعديلات هي ما تتوقّعه، انقر على نشر.

استخدام SDK للمشرف

يمكنك استخدام Admin SDK لنظام Node.js. القواعد. باستخدام هذا الوصول الآلي، يمكنك:

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

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

يُرجى العِلم أنّ إصدارات Firebase Security Rules تتطلّب فترة محددة لعدّة دقائق لنشرها بشكل كامل. عند استخدام 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);

ينطبق هذا النمط نفسه مع قواعد Cloud Storage على releaseFirestoreRulesetFromSource().

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

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

تعديل مجموعات قواعد "Realtime Database"

لتعديل مجموعات قواعد Realtime Database بـ Admin 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);

إدارة مجموعات القواعد

للمساعدة في إدارة مجموعات القواعد الكبيرة، تسمح لك 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;
      }
    }

بالنسبة إلى عمليات النشر الكبيرة للغاية التي تصل إلى 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.`);

استخدام واجهة برمجة تطبيقات REST

الأدوات الموضحة أعلاه مناسبة تمامًا لمختلف مهام سير العمل، بما في ذلك إدارة Firebase Security Rules لقواعد بيانات Cloud Firestore متعددة في مشروعك، يمكنك إدارة Firebase Security Rules ونشره باستخدام واجهة برمجة تطبيقات الإدارة نفسها. تمنحك واجهة برمجة التطبيقات management API أكبر قدر من المرونة.

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

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

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

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

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

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

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

إنشاء مصدر

لنفترض أنّك تعمل على مشروع secure_commerce في Firebase وتريد لنشر Rules الذي تم قفله Cloud Firestore إلى قاعدة بيانات في مشروع اسمه east_store.

يمكنك تنفيذ هذه القواعد في firestore.rules. الملف.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

إنشاء مجموعة قواعد

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

لأغراض التتبُّع، يجب ضبط attachment_point على east_store لربطها بقاعدة بيانات 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 للإدارة للنشر، احرص على تجنُّب السباق الحالات التي يعتمد فيها تطبيقك مباشرةً على قواعد لا يكون نشرها حتى الآن.

تعديل Realtime Database مجموعة قواعد باستخدام REST

توفّر خدمة Realtime Database واجهة REST الخاصة بها لإدارة Rules. عرض إدارة Firebase Realtime Database Rules عبر REST.

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

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

  • إدراج القواعد والحصول عليها وحذفها
  • إدراج إصدارات القواعد والحصول عليها وحذفها

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

اختبار التحديثات باستخدام REST

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

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

  1. جارٍ تحديد كائن JSON TestSuite لتمثيل مجموعة من عناصر TestCase
  2. إرسال TestSuite
  3. عرَض تحليل TestResult عناصر.

لنبدأ بتعريف كائن TestSuite باستخدام TestCase واحد في ملف testcase.json. في هذا المثال، نمرر Rules مصدر لغوي متوافق مع حمولة REST، إلى جانب مجموعة الاختبار لتشغيل وفقًا لتلك القواعد. نحدد توقعًا لتقييم القواعد، ويبدأ العميل الطلب الذي سيتم اختبار مجموعة القواعد وفقًا له. يمكنك أيضًا تحديد كيفية إكمال تقرير الاختبار هو، باستخدام القيمة "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 التي تم عرضها (تحتوي على حالة الاختبار "تم بنجاح"/"فشل"، وقوائم تصحيح الأخطاء للرسائل وقوائم تعبيرات القواعد التي تمّت زيارتها وتقارير التقييم الخاصة بها) سيؤكِّد مع الحالة "Success" بأن الوصول مسموح به بشكل صحيح.

إدارة الأذونات لـ "Cloud Storage Security Rules" على مستوى عدة خدمات

في حال إنشاء Cloud Storage Security Rules تستخدم Cloud Firestore محتوى للمستند لتقييم ظروف الأمان سيُطلب منك في وحدة التحكّم Firebase أو واجهة سطر الأوامر Firebase تفعيل الأذونات لربط المنتجين.

إذا قررت إيقاف هذا الأمان على مستوى الخدمات:

  1. أولاً، قبل إيقاف الميزة، عدِّل القواعد وإزالة جميع العبارات التي تستخدم دوال Rules للوصول إلى Cloud Firestore. وبخلاف ذلك، بعد إيقاف الميزة، ستُجري تقييمات Rules. إلى تعذُّر تنفيذ طلبات التخزين.

  2. استخدام صفحة إدارة الهوية وإمكانية الوصول في Google Cloud Console لحذف "Firebase موظف دعم خدمة Firestore من القواعد" من خلال اتّباع دليل Cloud إبطال الأدوار

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