Check out what’s new from Firebase at Google I/O 2022. Learn more

נהל ופריסה של כללי אבטחה של Firebase

Firebase מספקת לך מספר כלים לניהול הכללים שלך, כל אחד שימושי במקרים מסוימים, וכל אחד משתמש באותו ממשק API לניהול כללי אבטחה של Firebase.

לא משנה באיזה כלי משתמשים כדי להפעיל אותו, ממשק API לניהול:

  • קולט מקור כללים : קבוצה של כללים, בדרך כלל קובץ קוד המכיל הצהרות כללי אבטחה של Firebase.
  • מאחסן מקור שנבלע כמערכת כללים בלתי ניתנת לשינוי.
  • עוקב אחר פריסה של כל ערכת כללים במהדורה . שירותים התומכים בחוקי אבטחה של Firebase מחפשים את המהדורה עבור פרויקט כדי להעריך כל בקשה למשאב מאובטח.
  • מספק את היכולת להפעיל בדיקות תחביריות וסמנטיות של ערכת חוקים.

השתמש ב-Firebase CLI

עם Firebase CLI , אתה יכול להעלות מקורות מקומיים ולפרוס מהדורות . Firebase Local Emulator Suite של CLI מאפשר לך לבצע בדיקות מקומיות מלאות של מקורות .

השימוש ב-CLI מאפשר לך לשמור על הכללים שלך תחת בקרת גרסאות עם קוד היישום שלך ולפרוס כללים כחלק מתהליך הפריסה הקיים שלך.

צור קובץ תצורה

כאשר אתה מגדיר את פרויקט Firebase שלך ​​באמצעות Firebase CLI, אתה יוצר קובץ תצורה .rules בספריית הפרויקט שלך. השתמש בפקודה הבאה כדי להתחיל להגדיר את פרויקט Firebase שלך:

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

בדוק את העדכונים שלך

חבילת האימולטור המקומי מספקת אמולטורים עבור כל המוצרים התומכים בחוקי אבטחה. מנוע כללי האבטחה עבור כל אמולטור מבצע הן הערכה תחבירית והן סמנטית של כללים, ובכך חורג מהבדיקות התחביריות שמציע ה-API לניהול כללי האבטחה.

אם אתה עובד עם ה-CLI, הסוויטה היא כלי מצוין לבדיקת כללי אבטחה של Firebase. השתמש ב- Local Emulator Suite כדי לבדוק את העדכונים שלך באופן מקומי ולאשר שהכללים של האפליקציה שלך מציגים את ההתנהגות הרצויה.

פרוס את העדכונים שלך

לאחר שעדכנת ובדקת את הכללים שלך, פרוס את המקורות לייצור. השתמש בפקודות הבאות כדי לפרוס באופן סלקטיבי את הכללים שלך לבד או לפרוס אותם כחלק מתהליך הפריסה הרגיל שלך.

Cloud 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, ובדיקות סימנטיות זמינות באמצעות Rules Playground.

ערוך ועדכן את הכללים שלך

  1. פתח את מסוף Firebase ובחר בפרויקט שלך.
  2. לאחר מכן, בחר מסד נתונים בזמן אמת , Cloud Firestore או Storage מניווט המוצר, ולאחר מכן לחץ על כללים כדי לנווט אל עורך הכללים.
  3. ערוך את הכללים שלך ישירות בעורך.

בדוק את העדכונים שלך

בנוסף לבדיקת תחביר בממשק המשתמש של העורך, אתה יכול לבדוק את התנהגות הכללים הסמנטיים, תוך שימוש במסד הנתונים ובמשאבי האחסון של הפרויקט שלך, ישירות במסוף Firebase, באמצעות Rules Playground . פתח את מסך Rules Playground בעורך הכללים, שנה את ההגדרות ולחץ על הפעל . חפש את הודעת האישור בחלק העליון של העורך.

פרוס את העדכונים שלך

לאחר שתהיה מרוצה שהעדכונים שלך הם מה שאתה מצפה, לחץ על פרסם .

השתמש ב-Admin SDK

אתה יכול להשתמש ב-Admin SDK עבור ערכות כללים של Node.js. עם גישה פרוגרמטית זו, אתה יכול:

  • הטמע כלים מותאמים אישית, סקריפטים, לוחות מחוונים וצינורות CI/CD לניהול כללים.
  • נהל כללים ביתר קלות בפרוייקטים מרובים של Firebase.

בעת עדכון כללים באופן פרוגרמטי, חשוב מאוד להימנע מביצוע שינויים לא מכוונים בבקרת הגישה של האפליקציה שלך. כתוב את קוד ה-SDK של Admin מתוך מחשבה על אבטחה, במיוחד בעת עדכון או פריסה של כללים.

דבר נוסף שחשוב לזכור הוא שלשחרור כללי האבטחה של Firebase לוקח פרק זמן של מספר דקות להתפשט במלואו. בעת שימוש ב-Admin SDK לפריסת כללים, הקפד להימנע מתנאי מרוץ שבהם האפליקציה שלך מסתמכת באופן מיידי על כללים שהפריסה שלהם עדיין לא הושלמה. אם מקרה השימוש שלך דורש עדכונים תכופים לכללי בקרת הגישה, שקול פתרונות המשתמשים ב-Cloud Firestore, שנועד לצמצם את תנאי המירוץ למרות עדכונים תכופים.

שימו לב גם למגבלות אלו:

  • הכללים חייבים להיות קטנים מ-256 KiB של טקסט מקודד UTF-8 כאשר הם מסודרים.
  • לפרוייקט יכולים להיות לכל היותר 2,500 כללים פרוסים בסך הכל. לאחר הגבלה זו, עליך למחוק כמה ערכות כללים ישנות לפני יצירת חדשות.

צור ופריסה ערכות כללים של Cloud Storage או Cloud Firestore

זרימת עבודה טיפוסית לניהול כללי אבטחה עם ה-Admin SDK יכולה לכלול שלושה שלבים נפרדים:

  1. צור מקור לקובץ כללים (אופציונלי)
  2. צור ערכת כללים
  3. שחרר, או פרוס, את ערכת הכללים החדשה

ה-SDK מספק שיטה לשילוב שלבים אלה לכדי קריאת API אחת עבור כללי אבטחה של 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);

עדכן ערכי חוקים של מסד נתונים בזמן אמת

כדי לעדכן ערכות חוקים של מסד נתונים בזמן אמת עם ה-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 API

הכלים המתוארים לעיל מתאימים היטב לזרימות עבודה שונות, אך ייתכן שתרצה לנהל ולפרוס את כללי האבטחה של Firebase באמצעות ממשק API לניהול עצמו. ממשק API לניהול נותן לך את הגמישות הגדולה ביותר.

שים לב שלשחרור כללי האבטחה של Firebase לוקח פרק זמן של מספר דקות להתפשט במלואו. בעת שימוש ב- REST API לניהול לפריסה, הקפד להימנע מתנאי מרוץ שבהם האפליקציה שלך מסתמכת באופן מיידי על כללים שהפריסה שלהם עדיין לא הושלמה.

שימו לב גם למגבלות אלו:

  • הכללים חייבים להיות קטנים מ-256 KiB של טקסט מקודד UTF-8 כאשר הם מסודרים.
  • לפרוייקט יכולים להיות לכל היותר 2,500 כללים פרוסים בסך הכל. לאחר הגבלה זו, עליך למחוק כמה ערכות כללים ישנות לפני יצירת חדשות.

צור ופריסה ערכות כללים של Cloud Storage או Cloud Firestore עם REST

הדוגמאות בסעיף זה משתמשות בכללי אחסון, אם כי הם חלים גם על כללי Cloud Firestore.

הדוגמאות משתמשות גם ב-cURL כדי לבצע קריאות API. הושמטו שלבים להגדרה והעברת אסימוני אימות. אתה יכול להתנסות עם API זה באמצעות API Explorer המשולב בתיעוד העזר .

השלבים האופייניים ליצירה ופריסה של ערכת כללים באמצעות ממשק API לניהול הם:

  1. צור מקורות קובץ כללים
  2. צור ערכת כללים
  3. שחרר (פרוס) את ערכת הכללים החדשה

נניח שאתה עובד על פרויקט secure_commerce Firebase שלך ​​וברצונך לפרוס כללי אחסון ענן נעולים. אתה יכול ליישם כללים אלה בקובץ storage.rules .

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

כעת, צור טביעת אצבע מקודדת base64 עבור הקובץ הזה. לאחר מכן תוכל להשתמש במקור בקובץ זה כדי לאכלס את המטען הדרוש ליצירת ערכת כללים עם הקריאה REST projects.rulesets.create . כאן, אנו משתמשים בפקודה 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

מסד נתונים בזמן אמת מספק ממשק REST משלו לניהול כללים. ראה ניהול כללי מסד נתונים של Firebase בזמן אמת באמצעות REST .

נהל ערכות כללים עם REST

כדי לסייע בניהול פריסות כללים גדולות, בנוסף לשיטת REST ליצירת ערכות כללים ומהדורות, ממשק API לניהול מספק שיטות ל:

  • רשום, קבל ומחק ערכות כללים
  • רשום, קבל ומחק גרסאות כללים

עבור פריסות גדולות מאוד שמגיעות למגבלה של 2500 ערכות כללים לאורך זמן, אתה יכול ליצור היגיון למחיקת הכללים הישנים ביותר במחזור זמן קבוע. לדוגמה, כדי למחוק את כל ערכות הכללים שנפרסו במשך יותר מ-30 ימים, אתה יכול לקרוא למתודה projects.rulesets.list , לנתח את רשימת ה-JSON של אובייקטי Ruleset במפתחות createTime שלהם, ואז לקרוא ל- project.rulesets.delete בערכות הכללים המתאימות לפי ruleset_id .

בדוק את העדכונים שלך עם REST

לבסוף, ממשק API לניהול מאפשר לך להריץ בדיקות תחביריות וסמנטיות על משאבי Cloud Firestore ו-Cloud Storage בפרויקטי הייצור שלך.

בדיקה עם רכיב זה של ה-API מורכבת מ:

  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 זה להערכה בשיטת projects.test .

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

ה- TestReport שהוחזר (המכיל את סטטוס הבדיקה SUCCESS/FAILURE, רשימות של הודעות ניפוי באגים, רשימות של ביטויי כללים שבהם ביקרו ודוחות ההערכה שלהם) יאשר עם הסטטוס SUCCESS שהגישה מותרת כהלכה.