הימנעות מכללים לא מאובטחים

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

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

גישה אל Firebase Security Rules

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

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

כדי לגשת לכללים מ-CLI של Firebase, עוברים לקובץ הכללים שמופיע בקובץ firebase.json.

הסבר על Firebase Security Rules

Firebase Security Rules להגן על הנתונים מפני משתמשים זדוניים. כשיוצרים מכונה של מסד נתונים או קטגוריה של Cloud Storage במסוף Firebase, אפשר לבחור אם לדחות את הגישה לכל המשתמשים (מצב נעול) או להעניק גישה לכל המשתמשים (מצב בדיקה). יכול להיות שתרצו שההגדרות האישיות יהיו פתוחות יותר במהלך הפיתוח, אבל חשוב להקדיש זמן כדי להגדיר את הכללים ולאבטח את הנתונים בצורה נכונה לפני פריסת האפליקציה.

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

תרחישים נפוצים עם כללים לא מאובטחים

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

גישה פתוחה

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

לא מומלץ: גישת קריאה וכתיבה לכל המשתמשים.

Cloud Firestore

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

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

Realtime Database

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

  "rules": {
    ".read": true,
    ".write": true
  }
}
    

Cloud Storage

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded via App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
פתרון: כללים שמגבילים את הגישה לקריאה ולכתיבה.

יוצרים כללים שתואמים להיררכיית הנתונים. אחד מהפתרונות הנפוצים לבעיה הזו הוא אבטחה מבוססת-משתמשים באמצעות Firebase Authentication. מידע נוסף על אימות משתמשים באמצעות כללים

Cloud Firestore

Realtime Database

Cloud Storage

גישה לכל משתמש מאומת

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

לא מומלץ: לכל משתמש מחובר יש גישת קריאה וכתיבה לכל מסד הנתונים.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
הפתרון: צמצום הגישה באמצעות תנאי אבטחה.

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

Cloud Firestore

Realtime Database

Cloud Storage

(Realtime Database) כללים שעברו בירושה בצורה שגויה

Realtime Database Security Rules, כאשר כללים בנתיבים שטחיים יותר של הורה מבטלים כללים בצמתים עמוקים יותר של צאצאים. כשכותבים כלל בצומת צאצא, חשוב לזכור שהוא יכול להעניק רק הרשאות נוספות. אי אפשר לשפר או לבטל את הגישה לנתונים בנתיב עמוק יותר במסד הנתונים.

לא מומלץ: שינוי של כללים בנתיבים צאצאים
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
פתרון: כותבים כללים רחבים בנתיבים של ההורים ומעניקים הרשאות ספציפיות יותר בנתיבים של הצאצאים. אם נדרש רמת פירוט גבוהה יותר לגישה לנתונים, צריך להגדיר כללים מפורטים. מידע נוסף על Realtime Database Security Rules מדורג מופיע בקטע תחביר הליבה של Realtime Database Security Rules.

גישה סגורה

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

Cloud Firestore

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}
    

Cloud Storage

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

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

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

מידע נוסף על Cloud Firestore Security Rules ועל אופן הפעולה שלו זמין במאמר תחילת העבודה עם Cloud Firestore Security Rules.

בדיקת Cloud Firestore Security Rules

כדי לבדוק את התנהגות האפליקציה ולאמת את ההגדרות של Cloud Firestore Security Rules, משתמשים באמולטור של Firebase. לפני שפורסים שינויים, אפשר להשתמש באמולטור Cloud Firestore כדי להריץ בדיקות יחידה באופן אוטומטי בסביבה מקומית.

כדי לאמת במהירות את Firebase Security Rules במסוף Firebase, אפשר להשתמש בסימולטור הכללים של Firebase.