Buka konsol

Memperbaiki aturan yang tidak aman

Gunakan panduan ini untuk memahami kerentanan umum dalam konfigurasi Aturan Keamanan Cloud Firestore, meninjau dan mengamankan aturan Anda sendiri dengan lebih baik, dan menguji perubahan yang Anda buat sebelum diterapkan.

Jika Anda menerima peringatan bahwa database Cloud Firestore Anda tidak diamankan dengan baik, Anda dapat mengatasi kerentanan ini dengan memodifikasi dan menguji Aturan Keamanan Cloud Firestore Anda.

Untuk melihat Aturan Keamanan yang ada, buka tab Aturan di Firebase console.

Memahami Aturan Keamanan Cloud Firestore

Aturan Keamanan Cloud Firestore melindungi data Anda dari pengguna jahat. Aturan default untuk setiap instance Cloud Firestore yang dibuat di Firebase console menolak akses ke semua pengguna. Untuk mengembangkan aplikasi dan mengakses database, Anda harus memodifikasi aturan-aturan tersebut dan mungkin mempertimbangkan untuk memberikan akses menyeluruh ke semua pengguna di lingkungan pengembangan. Namun, sebelum menerapkan aplikasi Anda ke lingkungan produksi, luangkan waktu untuk mengonfigurasi aturan dan mengamankan data dengan benar.

Saat mengembangkan aplikasi dan menguji berbagai konfigurasi untuk aturan Anda, gunakan emulator Cloud Firestore untuk menjalankan aplikasi Anda di lingkungan pengembangan lokal.

Skenario umum dengan aturan yang tidak aman

Aturan Keamanan Cloud Firestore yang mungkin telah Anda siapkan secara default, atau yang pertama kali Anda kerjakan saat mengembangkan aplikasi dengan Cloud Firestore, harus ditinjau dan diperbarui sebelum aplikasi Anda diterapkan. Pastikan Anda mengamankan data pengguna dengan benar, dengan menghindari masalah umum berikut.

Akses terbuka

Ketika menyiapkan Cloud Firestore, Anda mungkin telah menetapkan aturan untuk mengizinkan akses terbuka selama pengembangan. Anda mungkin berpikir bahwa Anda adalah satu-satunya orang yang menggunakan aplikasi Anda, tetapi jika Anda telah menerapkannya, aplikasi tersebut akan tersedia di internet. Jika Anda tidak mengautentikasi pengguna dan mengonfigurasi aturan keamanan, maka siapa saja yang menebak project ID Anda dapat mencuri, memodifikasi, atau menghapus data.

Tidak direkomendasikan: Akses baca dan tulis ke semua pengguna
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Solusi: Aturan yang membatasi akses baca dan tulis.

Buat aturan yang logis untuk hierarki data Anda. Salah satu solusi yang umum untuk ketidakamanan ini adalah keamanan berbasis pengguna dengan Firebase Authentication. Pelajari lebih lanjut cara mengautentikasi pengguna dengan aturan.

Khusus pemilik konten

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Akses publik dan pribadi campuran

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Akses untuk setiap pengguna yang diautentikasi

Terkadang, Aturan Keamanan Cloud Firestore memverifikasi apakah pengguna sudah login, tetapi tidak membatasi akses lebih lanjut berdasarkan autentikasi tersebut. Jika salah satu aturan Anda berisi auth != null, pastikan bahwa Anda ingin semua pengguna yang login memiliki akses ke data.

Tidak direkomendasikan: Setiap pengguna yang login memiliki akses baca dan tulis ke seluruh database Anda.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}
Solusi: Persempit akses menggunakan kondisi keamanan.

Saat memeriksa autentikasi, Anda juga dapat menggunakan salah satu properti autentikasi untuk membatasi akses lebih lanjut bagi pengguna tertentu ke kumpulan data tertentu. Pelajari lebih lanjut cara menambahkan kondisi keamanan dan akses berbasis peran.

Akses berbasis peran

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

Akses berbasis atribut

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

Akses publik dan pribadi campuran

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Akses tertutup

Saat Anda mengembangkan aplikasi, pendekatan umum lainnya adalah menjaga data Anda tetap terkunci. Biasanya, ini berarti Anda menutup akses baca dan tulis untuk semua pengguna, seperti berikut ini:

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

Firebase Admin SDK dan Cloud Functions masih dapat mengakses database Anda. Gunakan aturan-aturan ini saat Anda ingin menggunakan Cloud Firestore sebagai backend khusus server bersama dengan Firebase Admin SDK. Meskipun aman, Anda harus menguji apakah klien aplikasi Anda dapat mengambil data dengan benar.

Pelajari lebih lanjut Aturan Keamanan Cloud Firestore dan cara kerjanya di bagian Memulai Aturan Keamanan Cloud Firestore.

Menguji Aturan Keamanan Cloud Firestore

Untuk memeriksa perilaku aplikasi Anda dan memverifikasi konfigurasi Aturan Keamanan Cloud Firestore Anda, gunakan emulator Cloud Firestore. Gunakan emulator Cloud Firestore untuk menjalankan dan mengotomatiskan pengujian unit di lingkungan lokal sebelum Anda menerapkan perubahan.

Untuk menguji Aturan Keamanan Cloud Firestore yang telah diperbarui di Firebase console dengan cepat, gunakan fitur Simulator.

  1. Untuk membuka Simulator, klik Simulator dari tab Aturan.
  2. Di setelan Simulator, pilih opsi untuk pengujian Anda, termasuk:
    • Pengujian baca atau tulis
    • Lokasi tertentu dalam database Anda, berupa path
    • Jenis autentikasi — pengguna yang tidak diautentikasi, pengguna anonim yang diautentikasi, atau ID pengguna tertentu
    • Data khusus dokumen yang dirujuk secara khusus oleh aturan Anda (misalnya, jika aturan Anda mengharuskan adanya kolom tertentu sebelum mengizinkan penulisan)
  3. Klik Jalankan dan cari hasilnya di banner di atas jendela aturan.