Keamanan untuk library klien server

Saat menggunakan library klien server untuk Firestore, Anda dapat mengelola akses ke resource dengan Identity and Access Management (IAM). IAM memungkinkan Anda 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 mengetahui deskripsi mendetail 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.

Dengan IAM, Anda dapat mengontrol siapa (pengguna) yang memiliki izin apa (peran) untuk resource mana dengan menetapkan kebijakan IAM. Kebijakan IAM memberikan satu atau beberapa peran kepada pengguna, sehingga pengguna memiliki izin tertentu. Misalnya, Anda dapat memberikan peran datastore.indexAdmin kepada pengguna, yang memungkinkan pengguna 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
Pembaruan atau transformasi batchWrite dengan prasyarat ada ditetapkan ke false datastore.entities.create
Pembaruan atau transformasi batchWrite dengan prasyarat ada ditetapkan ke true datastore.entities.create
Update atau transformasi batchWrite tanpa prasyarat datastore.entities.create
datastore.entities.update
beginTransaction datastore.databases.get
Pembaruan atau transformasi commit dengan prasyarat ada ditetapkan ke false datastore.entities.create
Pembaruan atau transformasi commit dengan prasyarat ada ditetapkan ke true datastore.entities.update
Update atau transformasi commit tanpa prasyarat 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
partitionQuery datastore.entities.get
datastore.entities.list
patch datastore.entities.update
rollback datastore.databases.get
runAggregationQuery datastore.entities.get
datastore.entities.list
runQuery datastore.entities.get
datastore.entities.list
Pembaruan atau transformasi write (RPC) dengan prasyarat ada ditetapkan ke false datastore.entities.create
Pembaruan atau transformasi write (RPC) dengan prasyarat ada ditetapkan ke true datastore.entities.update
Update atau transformasi write (RPC) tanpa prasyarat 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
pulihkan 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 dasar, pemilik, editor, dan pelihat, Anda dapat memberikan peran Firestore kepada pengguna project Anda.

Tabel berikut mencantumkan peran IAM Firestore. Anda dapat memberikan beberapa peran kepada pengguna, grup, atau akun 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 cadangan 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 database baru. Peran ini juga memberikan kemampuan untuk membuat database baru, tidak harus dengan memulihkan dari cadangan.

Peran khusus

Jika peran bawaan tidak memenuhi persyaratan bisnis Anda, Anda dapat menentukan peran khusus sendiri dengan izin yang Anda tentukan:

Izin

Tabel berikut mencantumkan 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 dalam project.
datastore.databases.create Membuat database.
datastore.databases.update Memperbarui database.
datastore.databases.delete Menghapus database.
datastore.databases.createTagBinding Membuat 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 Mengambil 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 Mencantumkan lokasi database yang tersedia. Diperlukan untuk membuat database baru.
Nama izin Key Visualizer Deskripsi
datastore.keyVisualizerScans.get Mendapatkan detail tentang pemindaian Key Visualizer.
datastore.keyVisualizerScans.list Mencantumkan pemindaian Key Visualizer yang tersedia.
Nama izin Jadwal Pencadangan Deskripsi
datastore.backupSchedules.get Mendapatkan detail tentang jadwal pencadangan.
datastore.backupSchedules.list Mencantumkan jadwal pencadangan yang tersedia.
datastore.backupSchedules.create Buat jadwal pencadangan.
datastore.backupSchedules.update Memperbarui jadwal pencadangan.
datastore.backupSchedules.delete Menghapus jadwal pencadangan.
Nama izin cadangan Deskripsi
datastore.backups.get Mendapatkan detail tentang pencadangan.
datastore.backups.list Mencantumkan cadangan yang tersedia.
datastore.backups.delete Menghapus cadangan.
datastore.backups.restoreDatabase Memulihkan database dari cadangan.

Latensi perubahan peran

Firestore meng-cache izin IAM selama 5 menit, sehingga perlu waktu hingga 5 menit agar perubahan peran diterapkan.

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')"
  }
}

Untuk mempelajari cara menentukan IAM Conditions untuk akses sementara, lihat Mengonfigurasi akses sementara.

Untuk mempelajari cara mengonfigurasi IAM Conditions 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 akan otomatis menyiapkan akun layanan ini 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 Mengidentifikasi project.

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

Langkah selanjutnya