Halaman ini menjelaskan cara menggunakan Kunci Enkripsi yang Dikelola Pelanggan (CMEK) di Google Kubernetes Engine (GKE). Jika perlu mengontrol pengelolaan kunci, Anda dapat menggunakan Cloud Key Management Service dan CMEK untuk melindungi Persistent Disk yang terpasang dan boot disk kustom di cluster GKE Anda.
Ringkasan
Secara default, Google Cloud mengenkripsi konten pelanggan dalam penyimpanan, dan GKE mengelola enkripsi sehingga Anda tidak perlu melakukan tindakan apa pun.
Jika ingin mengontrol dan mengelola sendiri rotasi kunci enkripsi, Anda dapat menggunakan CMEK. Kunci ini mengenkripsi kunci enkripsi data yang mengenkripsi data Anda. Untuk informasi selengkapnya, lihat Pengelolaan kunci.
Anda juga dapat mengenkripsi secret di cluster menggunakan kunci yang Anda kelola. Untuk detailnya, lihat Enkripsi secret lapisan aplikasi.
Di GKE, CMEK dapat melindungi data di dua jenis disk penyimpanan: boot disk node dan disk yang terpasang.
- Boot disk node
- Boot disk node adalah bagian dari node pool cluster Anda. Anda dapat membuat boot disk node yang dienkripsi CMEK saat membuat cluster dan node pool.
- Disk yang terpasang
- Disk yang terpasang adalah PersistentVolume yang digunakan oleh Pod untuk penyimpanan yang tahan lama. Persistent disk terpasang yang dienkripsi CMEK tersedia di GKE sebagai PersistentVolume yang disediakan secara dinamis.
Untuk mempelajari disk penyimpanan lebih lanjut, lihat Opsi penyimpanan. Disk bidang kontrol, yang digunakan untuk bidang kontrol GKE, tidak dapat dilindungi dengan CMEK.
Sebelum memulai
Untuk melakukan latihan terkait topik ini, Anda memerlukan dua project Google Cloud:
Project kunci: Tempat Anda membuat kunci enkripsi.
Project cluster: Tempat Anda membuat cluster yang mengaktifkan CMEK.
Dalam project kunci Anda, pastikan Anda telah mengaktifkan Cloud KMS API.
Dalam project kunci, pengguna yang membuat key ring dan kunci memerlukan izin IAM berikut:
cloudkms.keyRings.getIamPolicy
cloudkms.keyRings.setIamPolicy
Izin ini diberikan ke peran Identity and Access Management
roles/cloudkms.admin
yang ditetapkan sebelumnya. Anda dapat mempelajari lebih lanjut cara memberikan izin untuk mengelola kunci di dokumentasi Cloud KMS.Dalam project cluster, pastikan Anda telah mengaktifkan Cloud KMS API.
Pastikan Anda telah menginstal gcloud CLI.
Update
gcloud
ke versi terbaru:gcloud components update
Membuat kunci Cloud KMS
Agar dapat melindungi boot disk node atau disk yang terpasang dengan CMEK, Anda memerlukan key ring dan kunci Cloud KMS.
Key ring dan kunci Anda memiliki persyaratan berikut:
Kunci Anda harus menggunakan enkripsi simetris.
Anda perlu memberikan izin akun layanan GKE untuk menggunakan kunci tersebut.
Key ring Anda harus memiliki lokasi yang cocok dengan lokasi cluster GKE:
Cluster zona harus menggunakan key ring dari lokasi superset. Misalnya, cluster di zona
us-central1-a
hanya dapat menggunakan kunci di regionus-central1
.Cluster regional harus menggunakan key ring dari lokasi yang sama. Misalnya, cluster di region
asia-northeast1
harus dilindungi dengan key ring dari regionasia-northeast1
.Region
global
Cloud KMS tidak didukung untuk digunakan dengan GKE.
Untuk cara membuat key ring dan kunci, lihat Membuat kunci simetris.
Memberikan izin untuk menggunakan kunci
Anda harus menetapkan akun layanan Compute Engine yang digunakan oleh node di cluster Anda untuk peran Pengenkripsi/Pendekripsi CryptoKey Cloud KMS. Peran ini diperlukan agar Persistent Disk GKE dapat mengakses dan menggunakan kunci enkripsi Anda.
Nama akun layanan Compute Engine memiliki format berikut:
service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
Ganti PROJECT_NUMBER
dengan nomor project cluster Anda.
Untuk memberikan akses ke akun layanan, Anda dapat menggunakan perintah gcloud
atau Konsol Google Cloud.
gcloud
Berikan peran Pengenkripsi/Pendekripsi CryptoKey Cloud KMS ke akun layanan Compute Engine Anda:
gcloud kms keys add-iam-policy-binding KEY_NAME \
--location LOCATION \
--keyring RING_NAME \
--member serviceAccount:SERVICE_ACCOUNT \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KEY_PROJECT_ID
Ganti yang berikut ini:
KEY_NAME
: nama kunci Anda.LOCATION
: region di mana Anda membuat key ring.RING_NAME
: nama key ring Anda.SERVICE_ACCOUNT
: nama akun layanan Compute Engine Anda.KEY_PROJECT_ID
: project ID kunci Anda.
Konsol
Berikan peran Pengenkripsi/Pendekripsi CryptoKey Cloud KMS ke akun layanan Compute Engine Anda:
- Buka browser Cloud Key Management Service Keys di Konsol Google Cloud.
Buka browser Kunci Cloud KMS Klik nama key ring yang berisi kunci yang diinginkan.
Centang kotak untuk kunci yang diinginkan.
Tab Permissions di panel jendela kanan akan tersedia.
Pada dialog Add members, tentukan alamat email akun layanan Compute Engine yang Anda berikan akses.
Di drop-down Select a role, pilih Cloud KMS CryptoKey Encrypter/Decrypter.
Klik Save.
Menggunakan boot disk node yang dilindungi CMEK
Di bagian ini, Anda akan membuat cluster atau node pool baru dengan boot disk yang dilindungi CMEK.
Anda tidak dapat mengaktifkan enkripsi yang dikelola pelanggan untuk boot disk node pada cluster yang sudah ada, karena Anda tidak dapat mengubah jenis boot disk dari cluster atau node pool yang sudah ada. Namun, Anda dapat membuat node pool baru untuk cluster dengan enkripsi yang dikelola pelanggan diaktifkan, dan menghapus node pool sebelumnya.
Anda juga tidak dapat menonaktifkan enkripsi yang dikelola pelanggan untuk boot disk node pada cluster yang ada atau node pool yang ada. Namun, Anda dapat membuat node pool baru untuk cluster Anda dengan enkripsi yang dikelola pelanggan dinonaktifkan, dan menghapus node pool sebelumnya.
Membuat cluster dengan boot disk node yang dilindungi CMEK
Anda dapat membuat cluster dengan boot disk node yang dilindungi CMEK menggunakan gcloud CLI atau Konsol Google Cloud.
Untuk cluster Standard, hanya persistent disk standar (pd-standard
) atau persistent disk SSD (pd-ssd
) yang dapat dienkripsi dengan kunci CMEK.
gcloud
Untuk membuat cluster yang boot disk-nya dienkripsi dengan kunci CMEK, tentukan nilai untuk parameter --boot-disk-kms-key
dalam perintah pembuatan cluster Anda.
Membuat cluster Standard
Untuk membuat cluster Standard yang boot disk-nya dienkripsi dengan kunci CMEK, gunakan perintah berikut:
gcloud container clusters create CLUSTER_NAME \
--cluster-version=latest \
--region COMPUTE_REGION \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID \
--disk-type DISK_TYPE
Membuat cluster Autopilot
Untuk membuat cluster Autopilot yang boot disk-nya dienkripsi dengan kunci CMEK, gunakan perintah berikut:
gcloud container clusters create-auto CLUSTER_NAME \
--cluster-version=latest \
--region COMPUTE_REGION \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID
Ganti yang berikut ini:
CLUSTER_NAME
: nama untuk cluster baru Anda.COMPUTE_REGION
: region komputasi untuk bidang kontrol cluster.KEY_PROJECT_ID
: project ID kunci Anda.LOCATION
: lokasi key ring Anda.RING_NAME
: nama key ring Anda.KEY_NAME
: nama kunci Anda.CLUSTER_PROJECT_ID
adalah project ID cluster Anda.DISK_TYPE
:pd-standard
(default) ataupd-ssd
.
Konsol
Membuat cluster Standard
Untuk membuat cluster Standard yang boot disk-nya dienkripsi dengan kunci CMEK, lakukan langkah-langkah berikut:
Buka halaman Google Kubernetes Engine di konsol Google Cloud.
Klik add_box Create.
Di bagian Standard, klik Configure.
Konfigurasi cluster Anda sesuai keinginan.
Dari panel navigasi, di bagian Node Pools, klik Nodes.
Di menu drop-down Boot disk type, pilih Standard persistent disk atau SSD Persistent Disk.
Centang kotak Enable customer-managed encryption for Boot Disk, lalu pilih kunci enkripsi Cloud KMS yang Anda buat sebelumnya.
Klik Create.
Membuat cluster Autopilot
Untuk membuat cluster Autopilot yang boot disk-nya dienkripsi dengan kunci CMEK, lakukan langkah-langkah berikut:
Buka halaman Google Kubernetes Engine di konsol Google Cloud.
Klik add_box Create.
Di bagian Autopilot, klik Configure.
Konfigurasi cluster Anda sesuai keinginan.
Luaskan bagian Advanced Options dan temukan opsi Security.
Centang kotak Enable customer-managed encryption for Boot Disk, lalu pilih kunci enkripsi Cloud KMS yang Anda buat sebelumnya.
Klik Create.
Membuat node pool baru dengan boot disk node yang dilindungi CMEK
Untuk membuat node pool baru dengan CMEK yang diaktifkan pada cluster standar yang ada, Anda dapat menggunakan gcloud CLI atau Konsol Google Cloud.
gcloud
Untuk membuat node pool dengan enkripsi yang dikelola pelanggan untuk boot disk node, tentukan nilai untuk parameter --boot-disk-kms-key
dalam perintah pembuatan Anda.
gcloud container node-pools create NODE_POOL_NAME \
--region COMPUTE_REGION \
--disk-type DISK_TYPE \
--boot-disk-kms-key projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
--project CLUSTER_PROJECT_ID \
--cluster CLUSTER_NAME
Ganti yang berikut ini:
NODE_POOL_NAME
: nama yang Anda pilih untuk node pool.COMPUTE_REGION
: region komputasi untuk bidang kontrol cluster.DISK_TYPE
:pd-standard
(default) ataupd-ssd
.KEY_PROJECT_ID
: project ID kunci Anda.LOCATION
: lokasi key ring Anda.RING_NAME
: nama key ring Anda.KEY_NAME
: nama kunci Anda.CLUSTER_PROJECT_ID
: project ID cluster Anda.CLUSTER_NAME
: nama cluster Standard yang Anda buat di langkah sebelumnya.
Konsol
Buka halaman Google Kubernetes Engine di konsol Google Cloud.
Di daftar cluster, klik nama cluster yang ingin diubah.
Klik add_box Add Node Pool.
Dari panel navigasi, klik Nodes.
Di bagian Machine Configuration, pastikan Boot disk type adalah Standard persistent disk atau SSD persistent disk.
Centang kotak Enable customer-managed encryption for boot disk, lalu pilih kunci enkripsi Cloud KMS yang Anda buat.
Klik Create.
Menggunakan instance Filestore atau Persistent Disk yang dilindungi CMEK
Informasi berikut membahas cara mengenkripsi instance Filestore atau Persistent Disk yang baru dibuat. Anda dapat mengaktifkan CMEK pada cluster baru atau yang ada, menggunakan kunci Cloud KMS baru atau yang ada.
Petunjuk ini perlu diselesaikan sekali per cluster GKE:
- Buat cluster GKE jika Anda belum memilikinya.
- Deploy Driver CSI Filestore atau Driver CSI Persistent Disk Compute Engine ke cluster Anda.
- Buat versi key ring dan kunci Cloud KMS, jika Anda belum memilikinya.
- Berikan izin akses kunci ke akun layanan Filestore.
- Buat StorageClass agar disk yang disediakan oleh Kubernetes dapat otomatis dienkripsi dengan kunci Cloud KMS tersebut. Untuk detail tentang cara melakukannya, lihat bagian berikut.
Membuat StorageClass yang merujuk ke kunci Cloud KMS
Salin konten di bawah ke dalam file YAML bernama
cmek-sc.yaml
. Konfigurasi ini memungkinkan penyediaan volume terenkripsi yang dinamis.Instance Filestore
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-filestore-cmek provisioner: filestore.csi.storage.gke.io allowVolumeExpansion: true parameters: tier: enterprise instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
- Kolom
instance-encryption-kms-key
harus berupa ID resource yang sepenuhnya memenuhi syarat untuk kunci yang akan digunakan untuk mengenkripsi instance Filestore baru. - Nilai dalam
instance-encryption-kms-key
peka huruf besar/kecil (misalnya:keyRings
dancryptoKeys
). Menyediakan volume baru dengan nilai yang salah akan menyebabkan errorinvalidResourceUsage
. - Anda tidak dapat menambahkan parameter
instance-encryption-kms-key
ke objekStorageClass
yang ada. Namun, Anda dapat menghapus objekStorageClass
dan membuatnya ulang dengan nama yang sama, tetapi dengan kumpulan parameter yang berbeda.
Persistent Disk
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-gce-pd-cmek provisioner: pd.csi.storage.gke.io volumeBindingMode: "WaitForFirstConsumer" allowVolumeExpansion: true parameters: type: pd-standard disk-encryption-kms-key: projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
- Kolom
disk-encryption-kms-key
harus berupa ID resource yang sepenuhnya memenuhi syarat untuk kunci yang akan digunakan untuk mengenkripsi disk baru. - Nilai dalam
disk-encryption-kms-key
peka huruf besar/kecil (misalnya:keyRings
dancryptoKeys
). Menyediakan volume baru dengan nilai yang salah akan menyebabkan errorinvalidResourceUsage
. - Anda tidak dapat menambahkan parameter
disk-encryption-kms-key
ke objekStorageClass
yang sudah ada. Namun, Anda dapat menghapus objekStorageClass
dan membuatnya ulang dengan nama yang sama, tetapi dengan kumpulan parameter yang berbeda. Pastikan penyedia class yang ada adalahpd.csi.storage.gke.io
.
Anda dapat menetapkan StorageClass sebagai default.
- Kolom
Deploy
StorageClass
di cluster GKE Anda menggunakankubectl
:kubectl apply -f cmek-sc.yaml
Pastikan
StorageClass
Anda menggunakan driver CSI Persistent Disk atau Filestore Compute Engine dan menyertakan ID kunci Anda:Instance Filestore
kubectl describe storageclass csi-filestore-cmek
Dalam output perintah, verifikasi hal berikut:
- Penyedia ditetapkan sebagai filestore.csi.storage.gke.io.
- ID kunci Anda mengikuti instance-encryption-kms-key.
Name: csi-filestore-cmek IsDefaultClass: No Annotations: None Provisioner: filestore.csi.storage.gke.io Parameters: instance-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard AllowVolumeExpansion: true MountOptions: none ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: none
Persistent Disk
kubectl describe storageclass csi-gce-pd-cmek
Dalam output perintah, verifikasi hal berikut:
- Penyedia ditetapkan sebagai
pd.csi.storage.gke.io
. - ID kunci Anda mengikuti
disk-encryption-kms-key
.
Name: csi-gce-pd-cmek IsDefaultClass: No Annotations: None Provisioner: pd.csi.storage.gke.io Parameters: disk-encryption-kms-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME,type=pd-standard AllowVolumeExpansion: unset MountOptions: none ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: none
Membuat volume penyimpanan terenkripsi di GKE
Di bagian ini, Anda akan menyediakan volume penyimpanan Kubernetes terenkripsi secara dinamis dengan kunci StorageClass
dan Cloud KMS baru.
Salin konten berikut ke file baru bernama
pvc.yaml
, dan pastikan nilai untukstorageClassName
cocok dengan nama objekStorageClass
Anda:Instance Filestore
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany storageClassName: csi-filestore-cmek resources: requests: storage: 1Ti
Persistent Disk
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteOnce storageClassName: csi-gce-pd-cmek resources: requests: storage: 6Gi
Terapkan
PersistentVolumeClaim
(PVC) di cluster GKE Anda:kubectl apply -f pvc.yaml
Jika
StorageClass
memiliki kolomvolumeBindingMode
yang ditetapkan keWaitForFirstConsumer
, Anda harus membuat Pod untuk menggunakan PVC sebelum dapat memverifikasinya. Salin konten berikut ke file baru bernamapod.yaml
, dan pastikan nilai untukclaimName
cocok dengan nama objekPersistentVolumeClaim
Anda:apiVersion: v1 kind: Pod metadata: name: web-server spec: containers: - name: web-server image: nginx volumeMounts: - mountPath: /var/lib/www/html name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: podpvc readOnly: false
Terapkan Pod di cluster GKE:
kubectl apply -f pod.yaml
Dapatkan status
PersistentVolumeClaim
cluster dan verifikasi bahwa PVC telah dibuat dan terikat denganPersistentVolume
yang baru disediakan.Instance Filestore
kubectl get pvc
Output akan mirip dengan yang berikut ini:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 1Ti RWO csi-filestore-cmek 9s
Persistent Disk
kubectl get pvc
Output akan mirip dengan yang berikut ini:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE podpvc Bound pvc-e36abf50-84f3-11e8-8538-42010a800002 6Gi RWO csi-gce-pd-cmek 9s
Dengan cluster GKE, Anda kini dapat menggunakan Persistent Disk yang dilindungi CMEK.
Menghapus perlindungan CMEK
Untuk menghapus perlindungan CMEK dari Persistent Disk, ikuti petunjuk dalam dokumentasi Compute Engine.
Enkripsi CMEK tidak dapat dihapus dari instance Filestore.
Kebijakan organisasi GKE dan CMEK
GKE mendukung kebijakan organisasi CMEK (Pratinjau) yang dapat mewajibkan perlindungan CMEK dan dapat membatasi kunci Cloud KMS yang bisa Anda gunakan untuk perlindungan CMEK.
Jika container.googleapis.com
tercantum dalam daftar kebijakan layanan Deny
untuk batasan constraints/gcp.restrictNonCmekServices
, GKE akan menolak pembuatan resource berikut jika Anda tidak mengaktifkan perlindungan CMEK:
- Cluster dan node pool baru
- Instance Filestore dan Persistent Disk baru
Jika batasan constraints/gcp.restrictNonCmekCryptoKeyProjects
dikonfigurasi dalam kebijakan organisasi, GKE hanya akan membuat resource yang dilindungi CMEK yang menggunakan kunci enkripsi dari project, folder, atau organisasi yang diizinkan.
Langkah berikutnya
- Baca FAQ Cloud Key Management Service.
- Pelajari cara melindungi resource dengan Kunci Cloud KMS.