Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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

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

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

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

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

ענן Firestore

0632 edeb70

מסד נתונים בזמן אמת

// Deploy your .rules file
firebase deploy --only database

אחסון בענן

// Deploy your .rules file
firebase deploy --only storage

השתמש במסוף Firebase

אתה יכול גם לערוך ולפרוס כללים ממסוף Firebase.

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

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

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

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

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

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

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

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

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

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

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

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

  • הכללים חייבים להיות קטנים מ- 64 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);

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

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

נהל מערכי כללים

כדי לסייע בניהול מערכי כללים גדולים, ה- 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.crateTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);