Checklist keamanan Firebase

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 firebase deploy --only functions.)

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.