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

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

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

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

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

השתמש ב- Firebase CLI

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

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

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

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

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

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

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

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

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

  • הכללים חייבים להיות קטנים מ- 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 Storage בפרויקטים הייצוריים שלך.

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

  1. הגדרת TestSuite אובייקט JSON לייצג קבוצה של TestCase עצמים
  2. הגשת TestSuite
  3. ניתוח חזר TestResult עצמים

בואו להגדיר TestSuite האובייקט עם אחת TestCase בתוך testcase.json קובץ. בדוגמה זו, אנו מעבירים את מקור השפה Rules מוטבע עם המטען 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 (המכיל הצלחה במבחן / מעמד כשל, רשימות של הודעות ניפוי, רשימות של ביטויי כללים ביקר ודוחות ההערכה שלהם) היה לאשר בהצלחה מעמד כי גישה מותרת כראוי.