Keamanan untuk library klien server

Saat menggunakan library klien server untuk Firestore, Anda dapat mengelola akses ke resource dengan Identity and Access Management (IAM). Dengan IAM, Anda dapat memberikan akses yang lebih terperinci ke resource Google Cloud Platform tertentu dan mencegah akses yang tidak diinginkan ke resource lain. Halaman ini menjelaskan izin dan peran IAM untuk Firestore. Untuk penjelasan lengkap tentang IAM, baca dokumentasi IAM.

Dengan IAM, Anda dapat menerapkan prinsip keamanan dengan hak istimewa terendah, jadi Anda hanya memberikan akses yang diperlukan ke resource Anda.

IAM memungkinkan Anda mengontrol siapa (pengguna) yang memiliki izin apa (peran) untuk resource mana dengan menetapkan kebijakan IAM. Kebijakan IAM memberikan satu atau beberapa peran kepada pengguna, dengan memberikan izin tertentu kepada pengguna. Misalnya, Anda dapat memberikan peran datastore.indexAdmin kepada pengguna, yang memungkinkannya membuat, mengubah, menghapus, mencantumkan, atau melihat indeks.

Izin dan peran

Bagian ini merangkum izin dan peran yang didukung Firestore.

Izin yang diperlukan untuk metode API

Tabel berikut mencantumkan daftar izin yang harus dimiliki pemanggil untuk melakukan setiap tindakan:

Metode Izin yang diperlukan
projects.databases.documents
batchGet datastore.entities.get
beginTransaction datastore.databases.get
Pembaruan atau transformasi commit dengan prasyarat yang ada ditetapkan ke false datastore.entities.create
Pembaruan atau transformasi commit dengan prasyarat yang ada ditetapkan ke true datastore.entities.update
commit mengupdate atau mentransformasi tanpa prakondisi datastore.entities.create
datastore.entities.update
commit hapus datastore.entities.delete
createDocument datastore.entities.create
delete datastore.entities.delete
get datastore.entities.get
list datastore.entities.get
datastore.entities.list
listCollectionIds datastore.entities.list
patch datastore.entities.update
rollback datastore.databases.get
runQuery datastore.entities.get
datastore.entities.list
Pembaruan atau transformasi write (RPC) dengan prasyarat yang ada ditetapkan ke false datastore.entities.create
Pembaruan atau transformasi write (RPC) dengan prasyarat yang ada ditetapkan ke true datastore.entities.update
write (RPC) mengupdate atau mentransformasi tanpa prakondisi datastore.entities.create
datastore.entities.update
write (RPC) hapus datastore.entities.delete
projects.databases.indexes
create datastore.indexes.create
delete datastore.indexes.delete
get datastore.indexes.get
list datastore.indexes.list
projects.databases
create datastore.databases.create
delete datastore.databases.delete
get datastore.databases.getMetadata
list datastore.databases.list
patch datastore.databases.update
restore datastore.backups.restoreDatabase
projects.locations
get datastore.locations.get
list datastore.locations.list
projects.databases.backupschedules
get datastore.backupSchedules.get
list datastore.backupSchedules.list
buat datastore.backupSchedules.create
update datastore.backupSchedules.update
delete datastore.backupSchedules.delete
projects.locations.backups
get datastore.backups.get
list datastore.backups.list
delete datastore.backups.delete

Peran yang telah ditetapkan

Dengan IAM, setiap metode API di Firestore mengharuskan akun yang membuat permintaan API memiliki izin yang sesuai untuk menggunakan resource. Izin diberikan dengan menetapkan kebijakan yang memberikan peran kepada pengguna, grup, atau akun layanan. Selain peran primitif, pemilik, editor, dan viewer, Anda dapat memberikan peran Firestore kepada pengguna project Anda.

Tabel berikut mencantumkan peran IAM Firestore. Anda dapat memberikan beberapa peran ke akun pengguna, grup, atau layanan.

Peran Izin Deskripsi
roles/datastore.owner appengine.applications.get

datastore.*

resourcemanager.projects.get
resourcemanager.projects.list
Akses penuh ke Firestore.
roles/datastore.user appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.*
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list
Akses baca/tulis ke data di database Firestore. Ditujukan untuk developer aplikasi dan akun layanan.
roles/datastore.viewer appengine.applications.get

datastore.databases.get
datastore.databases.getMetadata
datastore.databases.list
datastore.entities.get
datastore.entities.list
datastore.indexes.get
datastore.indexes.list
datastore.namespaces.get
datastore.namespaces.list
datastore.statistics.get
datastore.statistics.list

resourcemanager.projects.get
resourcemanager.projects.list
Akses baca ke semua resource Firestore.
roles/datastore.importExportAdmin appengine.applications.get
datastore.databases.export
datastore.databases.getMetadata
datastore.databases.import
datastore.operations.cancel
datastore.operations.get
datastore.operations.list
resourcemanager.projects.get
resourcemanager.projects.list
Akses penuh untuk mengelola impor dan ekspor.
roles/datastore.indexAdmin appengine.applications.get

datastore.databases.getMetadata

datastore.indexes.*

resourcemanager.projects.get
resourcemanager.projects.list
Akses penuh untuk mengelola definisi indeks.
roles/datastore.keyVisualizerViewer datastore.databases.getMetadata
datastore.keyVisualizerScans.get
datastore.keyVisualizerScans.list
resourcemanager.projects.get
resourcemanager.projects.list
Akses penuh ke pemindaian Key Visualizer.
roles/datastore.backupSchedulesViewer datastore.backupSchedules.get
datastore.backupSchedules.list
Akses baca ke jadwal pencadangan di database Firestore.
roles/datastore.backupSchedulesAdmin datastore.backupSchedules.get
datastore.backupSchedules.list
datastore.backupSchedules.create
datastore.backupSchedules.update
datastore.backupSchedules.delete
datastore.databases.list
datastore.databases.getMetadata
Akses penuh ke jadwal pencadangan di database Firestore.
roles/datastore.backupsViewer datastore.backups.get
datastore.backups.list
Akses baca ke informasi pencadangan di lokasi Firestore.
roles/datastore.backupsAdmin datastore.backups.get
datastore.backups.list
datastore.backups.delete
Akses penuh ke cadangan di lokasi Firestore.
roles/datastore.restoreAdmin datastore.backups.get
datastore.backups.list
datastore.backups.restoreDatabase
datastore.databases.list
datastore.databases.create
datastore.databases.getMetadata
datastore.operations.list
datastore.operations.get
Kemampuan untuk memulihkan cadangan Firestore ke dalam database baru. Peran ini juga memberikan kemampuan untuk membuat database baru, tidak harus dengan memulihkan dari cadangan.

Peran khusus

Jika peran yang telah ditetapkan tidak memenuhi kebutuhan bisnis, Anda dapat menentukan peran khusus sendiri dengan izin yang Anda tentukan:

Izin

Tabel berikut mencantumkan daftar izin yang didukung Firestore.

Nama izin database Deskripsi
datastore.databases.get Memulai atau melakukan rollback transaksi.
datastore.databases.import Mengimpor entity ke dalam database.
datastore.databases.export Mengekspor entity dari database.
datastore.databases.getMetadata Membaca metadata dari database.
datastore.databases.list Mencantumkan database pada sebuah project.
datastore.databases.create Membuat database.
datastore.databases.update Memperbarui database.
datastore.databases.delete Menghapus database.
datastore.databases.createTagBinding Buat binding tag untuk database.
datastore.databases.deleteTagBinding Menghapus binding tag untuk database.
datastore.databases.listTagBindings Mencantumkan semua binding tag untuk database.
datastore.databases.listEffectiveTagBindings Mencantumkan binding tag yang efektif untuk database.
Nama izin entitas Deskripsi
datastore.entities.create Membuat dokumen.
datastore.entities.delete Menghapus dokumen
datastore.entities.get Membaca dokumen.
datastore.entities.list Membuat daftar nama dokumen pada project.
(datastore.entities.get diperlukan untuk mengakses data dokumen.)
datastore.entities.update Mengupdate dokumen
Nama izin indeks Deskripsi
datastore.indexes.create Membuat indeks.
datastore.indexes.delete Menghapus indeks.
datastore.indexes.get Membaca metadata dari indeks.
datastore.indexes.list Membuat daftar indeks pada project.
datastore.indexes.update Mengupdate indeks.
Nama izin operasi Deskripsi
datastore.operations.cancel Membatalkan operasi yang berjalan lama.
datastore.operations.delete Menghapus operasi yang berjalan lama.
datastore.operations.get Mendapatkan status terbaru dari operasi yang berjalan lama.
datastore.operations.list Mencantumkan operasi yang berjalan lama.
Nama izin project Deskripsi
resourcemanager.projects.get Menjelajahi resource di project.
resourcemanager.projects.list Membuat daftar project yang dimiliki.
Nama izin akses lokasi Deskripsi
datastore.locations.get Mendapatkan detail tentang lokasi database. Diperlukan untuk membuat database baru.
datastore.locations.list Menampilkan daftar lokasi database yang tersedia. Diperlukan untuk membuat database baru.
Nama izin Key Visualizer Deskripsi
datastore.keyVisualizerScans.get Dapatkan detail tentang pemindaian Key Visualizer.
datastore.keyVisualizerScans.list Mencantumkan pemindaian Key Visualizer yang tersedia.
Nama izin Jadwal Cadangan Deskripsi
datastore.backupSchedules.get Dapatkan detail tentang jadwal pencadangan.
datastore.backupSchedules.list Mencantumkan jadwal pencadangan yang tersedia.
datastore.backupSchedules.create Buat jadwal cadangan.
datastore.backupSchedules.update Memperbarui jadwal pencadangan.
datastore.backupSchedules.delete Menghapus jadwal pencadangan.
Nama izin pencadangan Deskripsi
datastore.backups.get Dapatkan detail tentang cadangan.
datastore.backups.list Mencantumkan cadangan yang tersedia.
datastore.backups.delete Menghapus cadangan.
datastore.backups.restoreDatabase Memulihkan database dari cadangan.

Latensi perubahan peran

Firestore menyimpan izin IAM dalam cache selama 5 menit, sehingga perubahan peran perlu waktu hingga 5 menit agar berlaku.

Mengelola IAM Firestore

Anda dapat memperoleh dan menetapkan kebijakan IAM menggunakan Konsol Google Cloud, IAM API, atau alat command line gcloud. Lihat Memberikan, Mengubah, dan Mencabut Akses ke Anggota Project untuk mengetahui detailnya.

Mengonfigurasi izin akses bersyarat

Anda dapat menggunakan IAM Conditions untuk menentukan dan menerapkan kontrol akses bersyarat.

Misalnya, kondisi berikut menetapkan peran datastore.user kepada akun utama hingga tanggal yang ditentukan:

{
  "role": "roles/datastore.user",
  "members": [
    "user:travis@example.com"
  ],
  "condition": {
    "title": "Expires_December_1_2023",
    "description": "Expires on December 1, 2023",
    "expression":
      "request.time < timestamp('2023-12-01T00:00:00.000Z')"
  }
}

Guna mempelajari cara menetapkan Kondisi IAM untuk akses sementara, lihat Mengonfigurasi akses sementara.

Guna mempelajari cara mengonfigurasi Kondisi IAM untuk akses ke satu atau beberapa database, lihat Mengonfigurasi kondisi akses database.

Dependensi aturan keamanan pada IAM

Aturan Keamanan Firestore untuk klien seluler/web bergantung pada akun layanan dan binding IAM berikut:

Akun layanan Peran IAM
service-project_number@firebase-rules.iam.gserviceaccount.com roles/firebaserules.system

Firebase menyiapkan akun layanan ini secara otomatis untuk Anda. Jika Anda menghapus peran firebaserules.system dari akun layanan ini, aturan keamanan Anda akan menolak semua permintaan. Untuk memulihkan binding IAM ini, gunakan perintah gcloud CLI berikut:

gcloud projects add-iam-policy-binding project_id \
--member=serviceAccount:service-project_number@firebase-rules.iam.gserviceaccount.com \
--role=roles/firebaserules.system

Untuk menentukan project_id dan project_number, lihat bagian Mengidentifikasi project.

Gunakan Google Cloud CLI, bukan Google Cloud Console, karena peran firebaserules.system tersembunyi di konsol secara default.

Langkah selanjutnya