המדריך הזה יעזור לכם להבין נקודות חולשה נפוצות בFirebase Security Rules הגדרות, לבדוק את הכללים שלכם ולשפר את האבטחה שלהם, ולבדוק את השינויים לפני שפורסים אותם.
אם קיבלתם התראה שהנתונים שלכם לא מאובטחים כמו שצריך, כדאי לבדוק את השגיאות הנפוצות האלה ולעדכן את הכללים שפגיעים לניצול.
גישה אל Firebase Security Rules
כדי לראות את Rules הקיימים, משתמשים ב-Firebase CLI או במסוף Firebase. כדי למנוע החלפה לא מכוונת של עדכונים, חשוב לערוך את הכללים באותה שיטה באופן עקבי. אם אתם לא בטוחים אם הכללים שהגדרתם באופן מקומי משקפים את העדכונים האחרונים, במסוף Firebase תמיד מוצגת הגרסה האחרונה של Firebase Security Rules שהופעלה.
כדי לגשת לכללים ממסוף Firebase, בוחרים את הפרויקט ועוברים אל Realtime Database, אל Cloud Firestore או אל Storage. אחרי שמגיעים למסד הנתונים או לדלי האחסון הנכונים, לוחצים על כללים.
כדי לגשת לכללים מ-CLI Firebase, עוברים לקובץ הכללים שצוין בקובץ firebase.json.
הסבר על Firebase Security Rules
Firebase Security Rules להגן על הנתונים מפני משתמשים זדוניים. כשיוצרים מופע של מסד נתונים או מאגר (bucket) במסוף Firebase, אפשר לבחור אם למנוע גישה מכל המשתמשים (מצב נעול) או להעניק גישה לכל המשתמשים (מצב בדיקה).Cloud Storage יכול להיות שתרצו להגדיר הגדרה פתוחה יותר במהלך הפיתוח, אבל חשוב להקדיש זמן להגדרה נכונה של הכללים ולאבטחת הנתונים לפני פריסת האפליקציה.
במהלך פיתוח האפליקציה ובדיקת הגדרות שונות של הכללים, מומלץ להשתמש באחד מהאמולטורים המקומיים של 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 using 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 FirestoreRealtime DatabaseCloud Storage |
גישה לכל משתמש מאומת
לפעמים, Rules בודק אם משתמש מחובר, אבל לא מגביל את הגישה על סמך האימות הזה. אם אחד מהכללים שלכם כולל את auth != null
, צריך לאשר שאתם רוצים שכל משתמש שמחובר לחשבון תהיה לו גישה לנתונים.
לא מומלץ: לכל משתמש שמחובר יש גישת קריאה וכתיבה לכל מסד הנתונים.
Cloud Firestoreservice 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 FirestoreRealtime DatabaseCloud 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 כבקצה העורפי (backend) רק בצד השרת, בשילוב עם Firebase Admin SDK. השיטה הזו מאובטחת, אבל כדאי לבדוק שהלקוחות של האפליקציה יכולים לאחזר נתונים בצורה תקינה.
Cloud Firestore Security Rulesמידע נוסף על Cloud Firestore Security Rules
בדיקת Cloud Firestore Security Rules
כדי לבדוק את התנהגות האפליקציה ולאמת את ההגדרות של Cloud Firestore Security Rules, אפשר להשתמש בFirebase Emulator. אפשר להשתמש בCloud Firestoreאמולטור כדי להריץ בדיקות יחידה בסביבה מקומית ולהפוך אותן לאוטומטיות לפני שמפיצים שינויים.
כדי לאמת במהירות את Firebase Security Rules במסוף Firebase, אפשר להשתמש בסימולטור הכללים של Firebase.