Gunakan panduan ini untuk memahami kerentanan umum dalam konfigurasi Cloud Firestore Security Rules, meninjau dan mengamankan aturan Anda sendiri dengan lebih baik, dan menguji perubahan yang Anda buat sebelum di-deploy.
Jika menerima peringatan bahwa database Cloud Firestore Anda tidak diamankan dengan benar, Anda dapat mengatasi kerentanan ini dengan memodifikasi dan menguji Cloud Firestore Security Rules.
Untuk melihat Aturan Keamanan yang ada, buka tab Rules di Firebase console.
Memahami Cloud Firestore Security Rules Anda
Cloud Firestore Security Rules melindungi data Anda dari pengguna yang berbahaya. Aturan default untuk setiap instance Cloud Firestore yang dibuat di konsol Firebase 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
Cloud Firestore Security Rules yang mungkin telah Anda siapkan secara default atau saat Anda mulai mengembangkan aplikasi dengan Cloud Firestore harus ditinjau dan diperbarui sebelum Anda men-deploy aplikasi. Pastikan Anda mengamankan data pengguna dengan benar dengan menghindari kesalahan 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, 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 reads and deletion if the current user owns the existing document allow read, delete: if request.auth.uid == resource.data.author_uid; // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == 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 public reads allow read: if true // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; // Allow deletion if the current user owns the existing document allow delete: if request.auth.uid == resource.data.author_uid; } } }
Akses untuk setiap pengguna yang diautentikasi
Terkadang, Cloud Firestore Security Rules memastikan 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 bermaksud 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 Cloud Firestore Security Rules dan cara kerjanya di bagian Memulai Cloud Firestore Security Rules.
Memeriksa Cloud Firestore Security Rules Anda
Untuk memeriksa perilaku aplikasi dan memverifikasi konfigurasi Cloud Firestore Security Rules, gunakan emulator Cloud Firestore. Gunakan emulator Cloud Firestore untuk menjalankan dan mengotomatiskan pengujian unit di lingkungan lokal sebelum Anda men-deploy perubahan.
Untuk menguji dengan cepat Cloud Firestore Security Rules yang telah diperbarui di Firebase console, gunakan alat Rules Playground.
- Untuk membuka Rules Playground, klik Rules playground dari tab Rules.
- Di setelan Simulator aturan, pilih opsi untuk pengujian, 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)
- Klik Jalankan dan cari hasilnya di banner di atas jendela aturan.