Untuk menjaga keamanan resource Firebase dan data pengguna Anda, ikuti panduan ini. Tidak semua item relevan dengan kebutuhan Anda, tetapi pertimbangkan setiap item saat mengembangkan aplikasi.
Menghindari traffic yang menyesatkan
Siapkan pemantauan dan pemberitahuan untuk layanan backend
Untuk mendeteksi traffic yang menyesatkan, seperti serangan denial-of-service (DOS), siapkan pemantauan dan pemberitahuan untuk Cloud Firestore, Realtime Database, Cloud Storage, dan Hosting.
Jika Anda mencurigai adanya serangan pada aplikasi Anda, hubungi Dukungan sesegera mungkin untuk memberi tahu mereka apa yang terjadi.
Aktifkan App Check
Guna membantu memastikan hanya aplikasi Anda yang dapat mengakses layanan backend, aktifkan App Check untuk setiap layanan yang mendukungnya.
Konfigurasikan Cloud Functions agar diskalakan untuk traffic normal
Cloud Functions otomatis melakukan penskalaan untuk memenuhi permintaan aplikasi Anda, tetapi jika terjadi serangan, hal ini dapat menimbulkan tagihan yang besar. Untuk mencegah hal ini, Anda dapat membatasi jumlah instance serentak pada fungsi berdasarkan traffic normal untuk aplikasi Anda.
Siapkan pemberitahuan yang akan dikirimkan saat batas hampir tercapai
Jika layanan Anda mengalami lonjakan permintaan, sering kali kuota akan berjalan, dan otomatis membatasi traffic ke aplikasi. Pastikan untuk memantau dasbor Usage and billing Anda. Selain itu, Anda juga dapat menetapkan pemberitahuan anggaran untuk project agar mendapatkan pemberitahuan saat penggunaan resource melampaui ekspektasi.
Cegah DOS pada diri sendiri: uji fungsi secara lokal dengan emulator
Rawan terjadi DOS pada diri sendiri secara tidak sengaja saat mengembangkan Cloud Functions, misalnya dengan membuat loop picu dan tulis tanpa henti. Anda dapat mencegah kesalahan ini agar tidak memengaruhi layanan yang aktif dengan melakukan pengembangan pada Firebase emulator suite.
(Jika Anda tidak sengaja melakukan DOS pada diri sendiri, batalkan deployment fungsi dengan menghapusnya dari index.js
, lalu jalankan
.)
Jika responsivitas secara real-time tidak terlalu diperlukan, struktur akan berfungsi secara defensif
Jika tidak perlu menampilkan hasil suatu fungsi secara real time, Anda dapat mengurangi traffic yang menyesatkan dengan memproses hasil secara bergelombang: publikasikan hasil ke topik Pub/Sub, lalu proses hasilnya secara berkala dengan fungsi terjadwal.
Memahami kunci API
Kunci API untuk layanan Firebase tidak bersifat rahasia
Firebase hanya menggunakan kunci API untuk mengidentifikasi project Firebase di aplikasi Anda ke layanan Firebase, dan bukan untuk mengontrol akses ke data Cloud Storage atau database, yang dilakukan menggunakan Aturan Keamanan Firebase. Oleh karena itu, Anda tidak perlu memperlakukan kunci API untuk layanan Firebase sebagai rahasia, dan Anda dapat menyematkannya dengan aman di kode klien. Pelajari kunci API untuk Firebase lebih lanjut.
Siapkan cakupan kunci API
Sebagai pencegahan tambahan terhadap penyerang yang mencoba menggunakan kunci API untuk memalsukan permintaan, Anda dapat membuat kunci API yang mencakup klien aplikasi.
Jaga kerahasiaan kunci server FCM
Tidak seperti kunci API untuk layanan Firebase, kunci server FCM (digunakan oleh HTTP API FCM lama) bersifat sensitif dan harus dirahasiakan.
Jaga kerahasiaan kunci akun layanan
Selain itu, tidak seperti kunci API untuk layanan Firebase, kunci pribadi akun layanan (yang digunakan oleh Admin SDK) bersifat sensitif dan harus dirahasiakan.
Aturan keamanan
Inisialisasi aturan dalam mode produksi atau mode terkunci
Saat menyiapkan Cloud Firestore, Realtime Database, dan Cloud Storage, lakukan inisialisasi pada aturan keamanan Anda untuk menolak semua akses secara default, dan tambahkan aturan yang memberikan akses ke resource tertentu selagi mengembangkan aplikasi.
Ini adalah salah satu setelan default untuk instance baru Cloud Firestore (mode produksi) dan Realtime Database (mode terkunci). Pilih opsi ini saat menyiapkan instance database baru.
Untuk Cloud Storage, mulai dengan konfigurasi aturan keamanan seperti berikut:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if false;
}
}
}
Aturan keamanan adalah skema; tambahkan aturan saat menambahkan dokumen
Jangan menulis aturan keamanan setelah menulis aplikasi, sebagai salah satu jenis tugas pra-peluncuran. Sebagai gantinya, tulis aturan keamanan saat menulis aplikasi, dengan memperlakukannya seperti skema database: setiap kali suatu jenis dokumen atau struktur jalur baru perlu digunakan, tulis aturan keamanannya terlebih dahulu.
Lakukan pengujian unit pada aturan keamanan dengan Emulator Suite; tambahkan ke CI
Untuk memastikan aturan keamanan tidak tertinggal sepanjang proses pengembangan aplikasi, lakukan pengujian unit pada aturan dengan emulator suite Firebase dan tambahkan pengujian ini ke pipeline CI. Lihat panduan ini untuk Cloud Firestore dan Realtime Database.
Autentikasi
Autentikasi kustom: buat JWT dari lingkungan (sisi server) tepercaya
Jika sudah memiliki sistem login yang aman, baik sistem kustom maupun layanan pihak ketiga, Anda dapat menggunakan sistem yang sudah ada untuk mengautentikasi dengan layanan Firebase. Buat JWT kustom dari lingkungan tepercaya, lalu teruskan token ke klien Anda, yang menggunakan token tersebut untuk mengautentikasi (iOS+, Android, Web, Unity, C++).
Untuk melihat contoh penggunaan autentikasi kustom dengan penyedia pihak ketiga, lihat postingan blog Mengautentikasi dengan Firebase menggunakan Okta.
Autentikasi terkelola: Penyedia OAuth 2.0 adalah yang paling aman
Jika Anda menggunakan fitur autentikasi terkelola milik Firebase, opsi penyedia OAuth 2.0/OpenID Connect (Google, Facebook, dll.) adalah yang paling aman. Anda sebaiknya mendukung setidaknya satu penyedia ini jika mungkin (bergantung pada basis pengguna).
Autentikasi dengan email dan sandi: setel kuota yang ketat untuk endpoint login guna mencegah serangan brute force
Jika Anda menggunakan layanan autentikasi dengan email dan sandi yang dikelola oleh Firebase, perketat kuota default endpoint identitytoolkit.googleapis.com
untuk mencegah serangan brute force. Anda dapat melakukannya dari halaman API di Konsol Google Cloud.
Autentikasi dengan email dan sandi: Mengaktifkan perlindungan enumerasi email
Jika Anda menggunakan layanan autentikasi dengan email dan sandi yang dikelola oleh Firebase, aktifkan perlindungan enumerasi email, yang mencegah pelaku kejahatan menyalahgunakan endpoint autentikasi project Anda untuk menebak nama akun.
Upgrade ke Cloud Identity Platform untuk autentikasi multi-faktor
Untuk keamanan ekstra saat login, Anda dapat menambahkan dukungan autentikasi multi-faktor dengan mengupgrade ke Cloud Identity Platform. Kode Firebase Authentication yang sudah ada akan tetap berfungsi setelah Anda melakukan upgrade.
Autentikasi anonim
Hanya gunakan autentikasi anonim untuk orientasi yang cukup sering terjadi
Hanya gunakan autentikasi anonim untuk menyimpan status dasar bagi pengguna sebelum mereka benar-benar login. Autentikasi anonim bukan pengganti login pengguna.
Konversi pengguna ke metode login lain jika mereka menginginkan data saat kehilangan ponselnya
Data autentikasi anonim tidak akan dipertahankan jika pengguna menghapus penyimpanan lokal atau beralih perangkat. Jika Anda perlu mempertahankan data setelah aplikasi dimulai ulang pada satu perangkat, konversikan pengguna menjadi akun permanen.
Gunakan aturan keamanan yang mewajibkan pengguna untuk beralih ke penyedia login atau memverifikasi emailnya
Siapa saja dapat membuat akun anonim di project Anda. Dengan mempertimbangkan hal itu, lindungi semua data nonpublik dengan aturan keamanan yang memerlukan metode login spesifik atau alamat email yang telah diverifikasi.
Contoh:
allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;
Pengelolaan lingkungan
Siapkan project staging dan pengembangan
Siapkan project Firebase terpisah untuk pengembangan, staging, dan produksi. Jangan gabungkan kode klien ke produksi sebelum diuji terhadap project staging.
Batasi akses tim ke data produksi
Jika bekerja dengan tim yang lebih besar, Anda dapat mengurangi konsekuensi atas kesalahan dan pelanggaran dengan membatasi akses ke data produksi menggunakan peran yang telah ditetapkan sebelumnya atau peran IAM kustom.
Jika tim Anda menggunakan emulator suite untuk pengembangan, Anda mungkin tidak perlu memberikan akses yang lebih luas ke project produksi.
Pengelolaan library
Hati-hati dengan kesalahan eja pada library atau pengelola baru
Saat menambahkan library ke project Anda, perhatikan dengan cermat nama library dan pengelolanya. Library yang bernama mirip dengan yang ingin Anda instal dapat berisi kode berbahaya.
Jangan mengupdate library tanpa memahami perubahannya
Periksa log perubahan pada library yang Anda gunakan sebelum mengupgrade. Pastikan upgrade memberikan nilai tambah, dan periksa apakah pengelola masih merupakan pihak yang Anda percayai.
Instal library watchdog sebagai dependensi pengembangan atau pengujian
Gunakan library seperti Snyk untuk memindai project Anda guna menemukan dependensi yang tidak aman.
Siapkan pemantauan untuk Functions; periksa setelah update library
Jika menggunakan SDK logger Cloud Functions, Anda dapat memantau dan menerima pemberitahuan tentang perilaku yang tidak biasa, termasuk perilaku yang disebabkan oleh update library.
Keamanan Cloud Function
Jangan pernah memasukkan informasi sensitif dalam variabel lingkungan Cloud Function
Sering kali dalam aplikasi Node.js yang dihosting sendiri, Anda menggunakan variabel lingkungan untuk memuat informasi sensitif seperti kunci pribadi. Jangan lakukan ini di Cloud Functions. Karena Cloud Functions menggunakan ulang lingkungan dari satu pemanggilan fungsi ke pemanggilan lain, informasi sensitif tidak boleh disimpan dalam lingkungan tersebut.
- Untuk menyimpan kunci API Firebase, yang tidak bersifat rahasia, cukup sematkan kunci tersebut dalam kode.
- Jika menggunakan Firebase Admin SDK di Cloud Function, Anda tidak perlu memberikan kredensial akun layanan secara eksplisit, karena SDK dapat otomatis memperolehnya selama inisialisasi.
- Jika Anda memanggil Google dan Google Cloud API yang memerlukan kredensial akun layanan, library Google Auth untuk Node.js bisa mendapatkan kredensial ini dari kredensial default aplikasi, yang otomatis diisi di Cloud Functions.
- Agar kunci pribadi dan kredensial untuk layanan non-Google tersedia untuk Cloud Functions Anda, gunakan Cloud Secret Manager.
Enkripsi informasi sensitif
Jika tidak dapat mencegah penerusan informasi sensitif ke Cloud Function, Anda harus mencari solusi sendiri untuk mengenkripsi informasi tersebut.
Fungsi sederhana lebih aman; jika Anda memerlukan kompleksitas, pertimbangkan Cloud Run
Cobalah untuk membuat Cloud Functions Anda sesederhana mungkin dan dapat dipahami dengan mudah. Kompleksitas dalam fungsi Anda sering kali dapat menyebabkan bug yang sulit dikenali atau perilaku yang tidak terduga.
Jika Anda memerlukan konfigurasi logika atau lingkungan yang kompleks, pertimbangkan untuk menggunakan Cloud Run, sebagai pengganti Cloud Functions.