Menggunakan kunci enkripsi yang dikelola pelanggan (CMEK)


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

  1. 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.

  2. Dalam project kunci Anda, pastikan Anda telah mengaktifkan Cloud KMS API.

    Mengaktifkan Cloud KMS API

  3. 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.

  4. Dalam project cluster, pastikan Anda telah mengaktifkan Cloud KMS API.

    Mengaktifkan Cloud KMS API

  5. Pastikan Anda telah menginstal gcloud CLI.

  6. 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 region us-central1.

    • Cluster regional harus menggunakan key ring dari lokasi yang sama. Misalnya, cluster di region asia-northeast1 harus dilindungi dengan key ring dari region asia-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:

  1. Buka browser Cloud Key Management Service Keys di Konsol Google Cloud.
    Buka browser Kunci Cloud KMS
  2. Klik nama key ring yang berisi kunci yang diinginkan.

  3. Centang kotak untuk kunci yang diinginkan.

    Tab Permissions di panel jendela kanan akan tersedia.

  4. Pada dialog Add members, tentukan alamat email akun layanan Compute Engine yang Anda berikan akses.

  5. Di drop-down Select a role, pilih Cloud KMS CryptoKey Encrypter/Decrypter.

  6. 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) atau pd-ssd.

Konsol

Membuat cluster Standard

Untuk membuat cluster Standard yang boot disk-nya dienkripsi dengan kunci CMEK, lakukan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Create.

  3. Di bagian Standard, klik Configure.

  4. Konfigurasi cluster Anda sesuai keinginan.

  5. Dari panel navigasi, di bagian Node Pools, klik Nodes.

  6. Di menu drop-down Boot disk type, pilih Standard persistent disk atau SSD Persistent Disk.

  7. Centang kotak Enable customer-managed encryption for Boot Disk, lalu pilih kunci enkripsi Cloud KMS yang Anda buat sebelumnya.

  8. Klik Create.

Membuat cluster Autopilot

Untuk membuat cluster Autopilot yang boot disk-nya dienkripsi dengan kunci CMEK, lakukan langkah-langkah berikut:

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Klik Create.

  3. Di bagian Autopilot, klik Configure.

  4. Konfigurasi cluster Anda sesuai keinginan.

  5. Luaskan bagian Advanced Options dan temukan opsi Security.

  6. Centang kotak Enable customer-managed encryption for Boot Disk, lalu pilih kunci enkripsi Cloud KMS yang Anda buat sebelumnya.

  7. 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) atau pd-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

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diubah.

  3. Klik Add Node Pool.

  4. Dari panel navigasi, klik Nodes.

  5. Di bagian Machine Configuration, pastikan Boot disk type adalah Standard persistent disk atau SSD persistent disk.

  6. Centang kotak Enable customer-managed encryption for boot disk, lalu pilih kunci enkripsi Cloud KMS yang Anda buat.

  7. 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:

Membuat StorageClass yang merujuk ke kunci Cloud KMS

  1. 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 dan cryptoKeys). Menyediakan volume baru dengan nilai yang salah akan menyebabkan error invalidResourceUsage.
    • Anda tidak dapat menambahkan parameter instance-encryption-kms-key ke objek StorageClass yang ada. Namun, Anda dapat menghapus objek StorageClass 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 dan cryptoKeys). Menyediakan volume baru dengan nilai yang salah akan menyebabkan error invalidResourceUsage.
    • Anda tidak dapat menambahkan parameter disk-encryption-kms-key ke objek StorageClass yang sudah ada. Namun, Anda dapat menghapus objek StorageClass dan membuatnya ulang dengan nama yang sama, tetapi dengan kumpulan parameter yang berbeda. Pastikan penyedia class yang ada adalah pd.csi.storage.gke.io.

    Anda dapat menetapkan StorageClass sebagai default.

  2. Deploy StorageClass di cluster GKE Anda menggunakan kubectl:

    kubectl apply -f cmek-sc.yaml
    
  3. 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.

  1. Salin konten berikut ke file baru bernama pvc.yaml, dan pastikan nilai untuk storageClassName cocok dengan nama objek StorageClass 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
    
  2. Terapkan PersistentVolumeClaim (PVC) di cluster GKE Anda:

    kubectl apply -f pvc.yaml
    
  3. Jika StorageClass memiliki kolom volumeBindingMode yang ditetapkan ke WaitForFirstConsumer, Anda harus membuat Pod untuk menggunakan PVC sebelum dapat memverifikasinya. Salin konten berikut ke file baru bernama pod.yaml, dan pastikan nilai untuk claimName cocok dengan nama objek PersistentVolumeClaim 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
    
  4. Terapkan Pod di cluster GKE:

    kubectl apply -f pod.yaml
    
  5. Dapatkan status PersistentVolumeClaim cluster dan verifikasi bahwa PVC telah dibuat dan terikat dengan PersistentVolume 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