Memperbaiki aturan yang tidak aman

Gunakan panduan ini untuk memahami kerentanan umum pada konfigurasi Aturan Keamanan Firestore, meninjau dan mengamankan aturan Anda sendiri dengan lebih baik, serta menguji perubahan yang Anda buat sebelum men-deploy-nya.

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

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

Memahami Aturan Keamanan Firestore

Aturan Keamanan Firestore melindungi data Anda dari pengguna yang berniat jahat. Aturan default untuk setiap instance 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 Firestore untuk menjalankan aplikasi Anda di lingkungan pengembangan lokal.

Skenario umum dengan aturan yang tidak aman

Aturan Keamanan Firestore yang mungkin telah Anda siapkan secara default atau saat Anda mulai mengembangkan aplikasi dengan Firestore harus ditinjau dan diperbarui sebelum men-deploy aplikasi. Pastikan Anda mengamankan data pengguna dengan benar dengan menghindari kesalahan umum berikut.

Akses terbuka

Saat menyiapkan Firestore, Anda mungkin telah menetapkan aturan untuk mengizinkan akses terbuka selama pengembangan. Anda mungkin berpikir bahwa Anda adalah satu-satunya orang yang menggunakan aplikasi, tetapi jika Anda telah men-deploy-nya, 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 sesuai 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 != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Gabungan akses publik dan pribadi

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 != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Akses untuk setiap pengguna yang diautentikasi

Terkadang, Aturan Keamanan Firestore memeriksa apakah pengguna sudah login, tetapi tidak membatasi akses lebih lanjut berdasarkan autentikasi tersebut. Jika salah satu aturan Anda menyertakan auth != null, konfirmasikan bahwa Anda ingin setiap 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 != 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 set data tertentu. Pelajari cara menambahkan kondisi keamanan dan akses berbasis peran lebih lanjut.

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 request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && 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;
    }
  }
}
  

Gabungan akses publik dan pribadi

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 ini saat Anda ingin menggunakan 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 Firestore dan cara kerjanya di bagian Memulai Aturan Keamanan Firestore.

Memeriksa Aturan Keamanan Firestore

Untuk memeriksa perilaku aplikasi dan memverifikasi konfigurasi Aturan Keamanan Firestore Anda, gunakan emulator Firestore. Gunakan emulator Firestore untuk menjalankan dan mengotomatiskan pengujian unit di lingkungan lokal sebelum Anda men-deploy perubahan apa pun.

Untuk menguji Aturan Keamanan Firestore yang telah diperbarui dengan cepat di Firebase console, gunakan alat Rules Playground.

  1. Untuk membuka Simulator Aturan, klik Simulator aturan dari tab Aturan.
  2. Di setelan Rules playground, 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.