Mengenkripsi secret pada lapisan aplikasi


Pelajari cara mengenkripsi Secret Kubernetes pada lapisan aplikasi menggunakan kunci yang Anda kelola di Cloud Key Management Service (Cloud KMS). Karena fitur ini bergantung pada fungsi dari Cloud KMS, Anda harus memahami rotasi kunci dan enkripsi amplop.


Untuk mengikuti panduan langkah demi langkah tugas ini langsung di Konsol Google Cloud, klik Pandu saya:

Pandu saya


Ringkasan

Secara default, Google Kubernetes Engine (GKE) mengenkripsi konten pelanggan yang disimpan dalam penyimpanan, termasuk Secret. GKE menangani dan mengelola enkripsi default ini untuk Anda tanpa perlu tindakan tambahan.

Enkripsi secret lapisan aplikasi memberikan lapisan keamanan tambahan untuk data sensitif, seperti Secret, yang disimpan di etcd. Dengan menggunakan fungsionalitas ini, Anda dapat menggunakan kunci yang dikelola dengan Cloud KMS untuk mengenkripsi data pada lapisan aplikasi. Enkripsi ini melindungi dari penyerang yang mendapatkan akses ke salinan etcd offline.

Untuk menggunakan enkripsi secret lapisan aplikasi, Anda harus membuat kunci Cloud KMS terlebih dahulu dan memberi akun layanan GKE akses ke kunci tersebut. Anda dapat menggunakan kunci yang memiliki tingkat perlindungan yang didukung oleh Cloud KMS.

Pastikan kunci berada di lokasi yang sama dengan cluster untuk mengurangi latensi dan mencegah kasus saat resource bergantung pada layanan yang tersebar di beberapa domain kegagalan. Setelah membuat kunci, Anda dapat mengaktifkan fitur ini di cluster baru atau yang sudah ada dengan menentukan kunci yang ingin digunakan. Saat Anda mengaktifkan fitur ini, GKE akan mengenkripsi semua Secret baru dan yang sudah ada menggunakan kunci enkripsi.

Enkripsi alamat pengiriman

Kubernetes menawarkan enkripsi menyeluruh Secret dengan penyedia KMS. Artinya, kunci lokal, biasanya disebut kunci enkripsi data (DEK), digunakan untuk mengenkripsi Secret. DEK itu sendiri dienkripsi dengan kunci lain yang disebut kunci enkripsi kunci (KEK). Kubernetes tidak menyimpan KEK.

Enkripsi alamat pengiriman memiliki manfaat berikut:

  • KEK dapat dirotasi tanpa memerlukan enkripsi ulang semua Secret. Artinya, Anda dapat lebih mudah mengikuti praktik terbaik rotasi kunci reguler, tanpa dampak signifikan pada performa.

  • Secret yang disimpan di Kubernetes dapat mengandalkan root kepercayaan eksternal. Ini berarti Anda dapat menggunakan root kepercayaan terpusat, misalnya Modul Keamanan Hardware, untuk semua Secret, dan musuh yang mengakses penampung Anda secara offline tidak dapat melakukannya untuk mendapatkan Rahasia Anda.

Dengan enkripsi secret lapisan aplikasi di GKE, Secret Anda dienkripsi secara lokal, menggunakan penyedia AES-CBC, dengan DEK lokal, dan DEK dienkripsi dengan KEK yang dapat Anda kelola di Cloud KMS.

Untuk mempelajari enkripsi amplop lebih lanjut, lihat Enkripsi alamat pengiriman.

Yang terjadi saat Anda membuat Secret

Saat Anda membuat Secret baru, berikut yang akan terjadi:

  1. Server Kubernetes API menghasilkan DEK unik untuk Secret menggunakan generator angka acak.

  2. Server Kubernetes API menggunakan DEK secara lokal untuk mengenkripsi Secret.

  3. Plugin KMS mengirim DEK ke Cloud KMS untuk dienkripsi. Plugin KMS menggunakan akun layanan GKE project Anda untuk melakukan autentikasi ke Cloud KMS.

  4. Cloud KMS mengenkripsi DEK menggunakan KEK, dan mengirimkannya kembali ke plugin KMS.

  5. Server Kubernetes API menyimpan Secret terenkripsi dan DEK yang dienkripsi. DEK teks biasa tidak disimpan ke disk.

  6. Server Kubernetes API membuat entri cache yang memetakan DEK terenkripsi ke DEK teks biasa. Hal ini memungkinkan server API mendekripsi Secret tanpa menggunakan Cloud KMS.

Saat klien meminta Secret dari server Kubernetes API, inilah yang akan terjadi:

  1. Server Kubernetes API mengambil Secret dan DEK yang dienkripsi.

  2. Server Kubernetes API memeriksa cache untuk entri pemetaan yang ada dan mendekripsi Secret tanpa menggunakan Cloud KMS.

  3. Jika entri cache tidak ditemukan, plugin KMS akan mengirimkan DEK ke Cloud KMS untuk dekripsi menggunakan KEK. DEK yang didekripsi kemudian digunakan untuk mendekripsi Secret.

  4. Server Kubernetes API menampilkan Secret yang didekripsi kepada klien.

Yang terjadi jika Anda menghancurkan kunci

Saat Anda menghancurkan KEK di Cloud KMS yang digunakan untuk mengenkripsi Secret di GKE, Secret tidak lagi tersedia kecuali jika Anda mengupdate cluster agar menggunakan KEK baru terlebih dahulu.

Jika Anda berencana untuk menghancurkan versi KEK lama setelah rotasi kunci, gunakan versi KEK baru untuk mengenkripsi ulang Secret terlebih dahulu.

Kecuali Anda menggunakan Proyeksi Volume Token Akun Layanan, akun layanan yang digunakan oleh beban kerja Anda di GKE juga menggunakan Secret, dan jika kunci dihancurkan, akun tersebut menjadi tidak tersedia. Ketidakmampuan untuk mengaksesnya berarti bahwa beban kerja akan gagal.

Pengecualian berikut berlaku:

  • Pod yang memiliki akses yang ada ke Secret saat volume yang terpasang atau variabel lingkungan akan mempertahankan akses.

  • Server Kubernetes API masih dapat menggunakan entri pemetaan DEK yang di-cache untuk mendekripsiSecret setelah Anda menghancurkan KEK. Hal ini memungkinkan Pod yang dimulai ulang atau dijadwalkan ulang mengakses Secret, kecuali jika:

    • Bidang kontrol cluster dimulai ulang.
    • Pod server Kubernetes API dimulai ulang.
    • Entri pemetaan DEK untuk Secret tidak ada dalam cache server Kubernetes API.

Sebelum menghancurkan KEK, periksa apakah KEK sedang digunakan oleh cluster Anda. Anda juga dapat membuat kebijakan pemberitahuan untuk penghancuran kunci di Cloud KMS.

Sebelum memulai

  • Untuk melakukan latihan terkait topik ini, Anda memerlukan dua project Google Cloud:

    • Project utama: Di sinilah Anda membuat KEK.

    • Project cluster: Ini adalah tempat Anda membuat cluster yang mengaktifkan enkripsi secret lapisan aplikasi.

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

    Mengaktifkan Cloud KMS API

  • Dalam project kunci Anda, pengguna yang membuat key ring dan kunci memerlukan izin IAM berikut:

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    Izin ini (dan banyak lagi) diberikan ke roles/cloudkms.admin peran Identity and Access Management yang telah ditentukan. Anda dapat mempelajari lebih lanjut cara memberikan izin untuk mengelola kunci di dokumentasi Cloud KMS.

  • Dalam project cluster, pastikan Anda telah mengaktifkan Google Kubernetes Engine API.

    Mengaktifkan Google Kubernetes Engine API

  • Pastikan Anda telah menginstal Google Cloud CLI.

  • Update gcloud ke versi terbaru:

    gcloud components update

Membuat kunci Cloud KMS

Untuk membuat kunci Cloud KMS, Anda harus membuat key ring terlebih dahulu. Kunci dan key ring adalah resource regional. Saat membuat key ring, tentukan lokasi yang cocok dengan lokasi cluster GKE Anda:

  • Cluster zona harus menggunakan key ring dari region 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.

Anda dapat menggunakan gcloud CLI atau Google Cloud Console.

Konsol

Dalam project utama Anda, buat key ring:

  1. Buka halaman Key Management di konsol Google Cloud.

    Buka Key Management

  2. Klik Create key ring.

  3. Di kolom Key ring name, masukkan nama untuk key ring.

  4. Dari menu dropdown Location, pilih lokasi cluster Kubernetes Anda.

  5. Klik Create.

Selanjutnya, buat kunci:

  1. Buka halaman Key Management di konsol Google Cloud.

    Buka Key Management

  2. Klik nama key ring yang akan Anda buat kunci.

  3. Klik Create key.

  4. Di kolom Key name, masukkan nama untuk kunci Anda.

  5. Setujui nilai default untuk Rotation period dan Starting on, atau tetapkan periode rotasi kunci dan waktu mulai jika ingin untuk menggunakan nilai yang berbeda.

  6. [Opsional] Di kolom Labels, klik Add label jika ingin menambahkan label ke kunci Anda.

  7. Klik Create.

gcloud

Dalam project utama Anda, buat key ring:

gcloud kms keyrings create RING_NAME \
    --location=LOCATION \
    --project=KEY_PROJECT_ID

Ganti kode berikut:

  • RING_NAME: nama key ring baru Anda.
  • LOCATION: lokasi Anda ingin membuat key ring.
  • KEY_PROJECT_ID: project ID kunci Anda.

Buat kunci:

gcloud kms keys create KEY_NAME \
    --location=LOCATION \
    --keyring=RING_NAME \
    --purpose=encryption \
    --project=KEY_PROJECT_ID

Ganti kode berikut:

  • KEY_NAME: nama kunci baru Anda.
  • LOCATION: lokasi Cloud KMS tempat Anda membuat key ring.
  • RING_NAME: nama key ring Anda.
  • KEY_PROJECT_ID: project ID kunci Anda.

Memberikan izin untuk menggunakan kunci

Akun layanan GKE di project cluster Anda memiliki nama berikut:

service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com

Ganti CLUSTER_PROJECT_NUMBER dengan nomor project cluster Anda. Untuk menemukan nomor project Anda menggunakan gcloud CLI, jalankan perintah berikut:

gcloud projects describe CLUSTER_PROJECT_ID \
    --format="value(projectNumber)"

Untuk memberikan akses ke akun layanan, Anda dapat menggunakan Google Cloud Console atau gcloud CLI.

Konsol

Berikan peran CryptoKey Encrypter/Decrypter Cloud KMS pada akun layanan GKE 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. Dalam dialog Add members, tentukan alamat email untuk akun layanan GKE yang Anda berikan akses.

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

  6. Klik Save.

gcloud

Berikan peran CryptoKey Encrypter/Decrypter Cloud KMS pada akun layanan GKE Anda:

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location=LOCATION \
    --keyring=RING_NAME \
    --member=serviceAccount:SERVICE_ACCOUNT_NAME \
    --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project=KEY_PROJECT_ID

Ganti kode berikut:

  • KEY_NAME: nama kunci Anda.
  • LOCATION: lokasi Cloud KMS tempat Anda membuat key ring.
  • RING_NAME: nama key ring Anda.
  • SERVICE_ACCOUNT_NAME: nama akun layanan GKE Anda.
  • KEY_PROJECT_ID: project ID kunci Anda.

Memastikan kunci memiliki kuota yang cukup jika berupa kunci Cloud HSM

Jika Anda menggunakan kunci Cloud HSM, project Google Cloud yang berisi kunci tersebut dibatasi oleh kuota kunci Anda. Pastikan Anda memiliki kuota yang cukup untuk menggunakan kunci Cloud HSM dengan enkripsi secret lapisan aplikasi. Jika kuota Anda habis, node Anda mungkin kehilangan konektivitas ke bidang kontrol cluster.

Mengaktifkan enkripsi secret lapisan aplikasi

Anda dapat mengaktifkan enkripsi secret lapisan aplikasi pada cluster GKE Standard dan GKE Autopilot baru atau yang sudah ada menggunakan gcloud CLI atau Google Cloud Console.

Setelah mengaktifkan enkripsi secret lapisan aplikasi, sebaiknya Anda melakukan rotasi kunci. Anda dapat mengonfigurasi rotasi kunci otomatis di Cloud KMS. Untuk mengetahui petunjuknya, lihat Mengonfigurasi rotasi otomatis.

Di cluster baru

Anda dapat membuat cluster baru dengan enkripsi secret lapisan aplikasi yang diaktifkan menggunakan Google Cloud Console atau gcloud CLI.

Konsol - Autopilot

Untuk membuat cluster Autopilot dengan enkripsi secret lapisan aplikasi diaktifkan, 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. Konfigurasikan cluster Anda sesuai keinginan.

  5. Di panel navigasi, klik Advanced Options, lalu luaskan bagian Security.

  6. Centang kotak Enable Application-layer secrets encryption, lalu pilih kunci yang Anda buat di bagian Membuat kunci Cloud KMS.

  7. Klik Create.

Konsol - Standar

Untuk membuat cluster Standar dengan enkripsi secret lapisan aplikasi diaktifkan, 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. Konfigurasikan cluster Anda sesuai keinginan.

  5. Dari panel navigasi, pada Cluster, klik Sec urity.

  6. Centang kotak Enable Application-layer secrets encryption, lalu pilih kunci yang Anda buat di bagian Membuat kunci Cloud KMS.

  7. Klik Create.

gcloud

Untuk membuat cluster yang mendukung enkripsi secret lapisan aplikasi, tentukan nilai untuk parameter --database-encryption-key dalam perintah pembuatan Anda.

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=latest \
    --region=COMPUTE_REGION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

Ganti kode berikut:

  • CLUSTER_NAME: nama yang dipilih untuk cluster baru Anda.
  • COMPUTE_REGION: region Compute Engine tempat Anda ingin membuat cluster.
  • KEY_PROJECT_ID: project ID kunci Anda.
  • LOCATION: lokasi Cloud KMS tempat Anda membuat key ring.
  • RING_NAME: nama key ring Anda.
  • KEY_NAME: nama kunci Anda.
  • CLUSTER_PROJECT_ID: project ID cluster Anda.

Anda dapat mengaktifkan enkripsi secret lapisan aplikasi di cluster Standar baru menggunakan perintah gcloud container clusters create dengan flag yang sama.

Di cluster yang sudah ada

Anda dapat menggunakan gcloud CLI atau Google Cloud Console untuk mengupdate cluster yang ada agar dapat menggunakan enkripsi secret lapisan aplikasi. GKE mengenkripsi semua Secret yang ada dan yang baru menggunakan kunci enkripsi yang Anda tentukan.

Konsol

Untuk mengupdate cluster agar mendukung enkripsi secret lapisan aplikasi:

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

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di bagian Security, di kolom Application-layer secrets encryption, klik Edit application-layer secrets encryption.

  4. Centang kotak Enable Application-layer secret encryption, lalu pilih kunci yang Anda buat di Membuat kunci Cloud KMS.

  5. Klik Simpan Perubahan.

gcloud

Untuk mengaktifkan enkripsi secret lapisan aplikasi di cluster yang ada, jalankan perintah berikut:

gcloud container clusters update CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Anda.
  • COMPUTE_REGION: region Compute Engine cluster.
  • KEY_PROJECT_ID: project ID kunci Anda.
  • LOCATION: lokasi Cloud KMS tempat Anda membuat key ring.
  • RING_NAME: nama key ring Anda.
  • KEY_NAME: nama kunci Anda.
  • CLUSTER_PROJECT_ID: project ID cluster Anda.

Memperbarui kunci Cloud KMS

Anda dapat menggunakan gcloud CLI atau Google Cloud Console untuk mengupdate cluster yang ada agar menggunakan kunci Cloud KMS baru.

Konsol

Untuk mengupdate cluster agar menggunakan kunci Cloud KMS baru:

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

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di bagian Security, di kolom Application-layer secrets encryption, klik Edit application-layer secrets encryption.

  4. Pilih kunci enkripsi baru yang ingin Anda gunakan.

  5. Klik Save Changes.

gcloud

Perbarui cluster yang ada untuk menggunakan kunci Cloud KMS baru:

gcloud container clusters update CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster Anda.
  • COMPUTE_REGION: region Compute Engine cluster.
  • KEY_PROJECT_ID: project ID kunci Anda.
  • LOCATION: lokasi Cloud KMS tempat Anda membuat key ring.
  • RING_NAME: nama key ring Anda.
  • KEY_NAME: nama kunci Anda.
  • CLUSTER_PROJECT_ID: project ID cluster Anda.

Menonaktifkan enkripsi secret lapisan aplikasi

Untuk menonaktifkan enkripsi secret lapisan aplikasi, Anda dapat menggunakan gcloud CLI atau Google Cloud Console.

Konsol

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

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di bagian Security, di kolom Application-layers secret encryption, klik Edit application-layers encryption.

  4. Hapus centang Enable Application-layer secrets encryption.

  5. Klik Save Changes.

gcloud

Untuk menonaktifkan enkripsi secret lapisan aplikasi, jalankan perintah berikut:

gcloud container clusters update CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --disable-database-encryption \
    --project=CLUSTER_PROJECT_ID

Ganti kode berikut:

Memastikan enkripsi secret lapisan aplikasi diaktifkan

Anda dapat memeriksa apakah cluster menggunakan enkripsi secret lapisan aplikasi dengan menggunakan Google Cloud Console atau gcloud CLI.

Konsol

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

    Buka Google Kubernetes Engine

  2. Klik nama cluster yang ingin diubah.

  3. Di bagian Security, pastikan kolom Application-layers encryptions encryption menampilkan Enabled dan mencantumkan kunci yang benar.

gcloud

Periksa apakah cluster menggunakan enkripsi secret lapisan aplikasi:

gcloud container clusters describe CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --format='value(databaseEncryption)' \
    --project=CLUSTER_PROJECT_ID

Ganti kode berikut:

Jika cluster menggunakan enkripsi secret lapisan aplikasi, output-nya akan mirip dengan berikut ini:

keyName=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME;state=ENCRYPTED

Merotasi kunci Anda

Sebaiknya rotasikan kunci Anda secara rutin, termasuk setelah Anda mengaktifkan enkripsi secret lapisan aplikasi. Untuk mendapatkan petunjuk dalam mengonfigurasi rotasi kunci otomatis atau merotasi kunci secara manual, lihat Merotasi kunci.

Saat Anda melakukan rotasi kunci, rahasia Anda yang ada akan tetap dienkripsi dengan versi kunci enkripsi kunci (KEK) sebelumnya. Untuk memastikan versi KEK yang lebih baru menggabungkan Secret, enkripsi ulang Secret setelah rotasi Kunci.

Misalnya, Anda membuat dan menyimpan Secret, Secret1. Kunci ini dienkripsi dengan DEK1, yang digabungkan dengan KEKv1.

Setelah KEK diputar, Anda mengenkripsi ulang Secret1 sehingga dibungkus oleh DEK2, yang kemudian digabungkan dengan KEKv2, KEK yang dirotasi.

Mengenkripsi ulang Secret Anda

Setelah melakukan rotasi kunci, Anda harus mengenkripsi ulang Secret untuk menggabungkan Secret dengan versi baru KEK. Meskipun tidak dapat mengonfigurasi enkripsi ulang otomatis menggunakan gcloud CLI, Anda dapat menggunakan CronJob untuk menjalankan perintah enkripsi ulang secara berkala.

Untuk mengenkripsi ulang Secret secara manual setelah rotasi kunci, tunggu setidaknya tiga jam agar versi baru menjadi konsisten. Lalu, sentuh setiap Secret untuk memaksa enkripsi ulang menggunakan perintah seperti berikut:

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="TIME"

Ganti TIME dengan string yang menunjukkan kapan rotasi terjadi (misalnya, 20200909-090909).

Batasan

  • GKE mendukung hingga 30.000 secret per cluster untuk enkripsi secret lapisan aplikasi. Jika Anda menyimpan lebih dari 30.000 secret, cluster Anda mungkin akan menjadi tidak stabil pada waktu upgrade, sehingga menyebabkan potensi pemadaman pada beban kerja Anda.
  • Pastikan ukuran rata-rata metadata secret di setiap namespace lebih rendah dari 5KiB. Jika ukuran rata-rata metadata di atas 5KiB, cluster Anda mungkin memasuki kondisi buruk. Beberapa secret dienkripsi, sementara yang lainnya didekripsi setelah mengaktifkan fitur atau menonaktifkan fitur tersebut.
  • Anda harus memilih kunci di region yang sama dengan cluster. Misalnya, cluster zona di us-central1-a hanya dapat menggunakan kunci di region us-central1. Untuk cluster regional, kunci harus berada di lokasi yang sama untuk mengurangi latensi dan mencegah kasus saat resource bergantung pada layanan yang tersebar di beberapa domain gagal.

  • GKE hanya mendukung kunci dari Cloud KMS. Anda tidak dapat menggunakan penyedia KMS Kubernetes lain atau penyedia enkripsi lainnya.

Pemecahan masalah

Kunci Cloud KMS dinonaktifkan.

Akun layanan default GKE tidak dapat menggunakan kunci Cloud KMS yang dinonaktifkan untuk enkripsi secret lapisan aplikasi.

Untuk mengaktifkan kembali kunci yang dinonaktifkan, lihat Mengaktifkan versi kunci yang dinonaktifkan.

Langkah selanjutnya