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

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

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

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

השתמש ב- CLI של Firebase

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

השימוש ב- 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 או ה- CLI של Firebase. אחרת, אתה עלול להחליף את כל העדכונים שבוצעו במסוף Firebase.

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

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

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

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

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

ענן 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, ובדיקת symantic נגישה באמצעות הכללים המגרשים.

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

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

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

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

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

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

השתמש ב- SDK של מנהל המערכת

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

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

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

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

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

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

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

זרימת עבודה טיפוסית לניהול כללי אבטחה באמצעות מנהל ה- 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);

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

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

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

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

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

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

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

נהל מערכי חוקים עם REST

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

  • רשימה, לקבל, ועל rulesets המחיק
  • רשימה, לקבל, ומשחרר כללים מחיקים

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

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

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

בדיקה עם רכיב זה של ה- 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 עבור evalution עם projects.test השיטה.

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

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