Memecahkan masalah enkripsi rahasia lapisan aplikasi

Enkripsi secret lapisan aplikasi menambahkan lapisan perlindungan yang dapat dikonfigurasi untuk data sensitif di Google Kubernetes Engine (GKE), seperti kredensial dan kunci. Masalah dengan konfigurasi ini dapat mencegah lapisan keamanan tambahan ini berfungsi dengan benar.

Gunakan dokumen ini untuk memecahkan masalah enkripsi secret lapisan aplikasi dengan memeriksa kolom proses debug yang tersedia di objek Cluster GKE API. Kolom ini membantu Anda mendiagnosis penyebab utama error umum, seperti update yang gagal atau masalah dengan kunci Cloud KMS Anda.

Informasi ini penting bagi admin dan operator Platform serta Engineer keamanan yang bertanggung jawab untuk melindungi informasi sensitif yang disimpan di cluster GKE. Untuk mengetahui informasi selengkapnya tentang peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

Update gagal

Saat Anda memperbarui konfigurasi enkripsi secret lapisan aplikasi, GKE harus menulis ulang semua Secret objek di cluster Kubernetes. GKE melakukan hal ini untuk membantu memastikan bahwa semua Secret dienkripsi oleh Kunci Cloud KMS baru, atau ditulis tanpa dienkripsi jika itulah yang Anda konfigurasi.

Operasi update ini dapat gagal karena salah satu kondisi berikut:

  • Panel kontrol Kubernetes tidak tersedia untuk sementara saat update sedang berlangsung.
  • AdmissionWebhook yang ditentukan pengguna mencegah GKE dapat memperbarui objek Secret.
  • Kunci Cloud KMS yang diperbarui atau sebelumnya dinonaktifkan sebelum operasi update selesai.

Hingga operasi update berhasil, jangan berinteraksi dengan kunci Cloud KMS yang diperbarui atau sebelumnya.

Kolom proses debug

Cluster GKE baru yang menjalankan versi 1.29 dan yang lebih baru berisi kolom tambahan yang membantu Anda melacak update ke Cluster.DatabaseEncryption dan membantu Anda pulih dari kegagalan.

Langkah-langkah berikut hanya berlaku untuk cluster yang kolom DatabaseEncryption.CurrentState-nya tidak kosong. Jika kolom CurrentState kosong, fitur ini belum diaktifkan pada versi cluster ini.

Batas berikut berlaku untuk kolom ini:

  • Adalah hanya output, yang berarti Anda tidak dapat menetapkannya selama permintaan pembuatan cluster atau update.

Kolom CurrentState

Anda dapat memeriksa status operasi update DatabaseEncryption saat ini dengan memeriksa kolom CurrentState di Cluster.DatabaseEncryption.

Nilai CurrentState Deskripsi

CURRENT_STATE_ENCRYPTED

CURRENT_STATE_ALL_OBJECTS_ENCRYPTION_ENABLED

CURRENT_STATE_DECRYPTED

Operasi update terbaru berhasil. Tidak ada tindakan lebih lanjut yang diperlukan. Anda dapat menghapus kunci yang sebelumnya digunakan.

CURRENT_STATE_ENCRYPTION_PENDING

CURRENT_STATE_ALL_OBJECTS_ENCRYPTION_PENDING

CURRENT_STATE_DECRYPTION_PENDING

Update sedang berlangsung.

CURRENT_STATE_ENCRYPTION_ERROR

CURRENT_STATE_ALL_OBJECTS_ENCRYPTION_ERROR

CURRENT_STATE_DECRYPTION_ERROR

Terjadi error pada update terbaru. Jangan nonaktifkan atau hapus kunci Cloud KMS yang sebelumnya digunakan, karena kunci tersebut mungkin masih digunakan oleh GKE.

Lihat kolom LastOperationErrors untuk mengetahui informasi selengkapnya.

Kolom LastOperationErrors

Jika operasi update gagal, error yang mendasarinya dari panel kontrol GKE akan ditampilkan dalam output gcloud container clusters update.

Pesan error dari dua operasi update terbaru yang gagal juga tersedia di Cluster.DatabaseEncryption.LastOperationErrors.

Kolom DecryptionKeys

Kunci Cloud KMS yang digunakan untuk operasi enkripsi baru ditampilkan di DatabaseEncryption.KeyName. Biasanya, kunci ini adalah satu-satunya kunci yang digunakan oleh cluster.

Namun, DatabaseEncryption.DecryptionKeys berisi kunci tambahan yang juga digunakan oleh cluster jika update sedang berlangsung atau setelah kegagalan.

Memulihkan dari update yang gagal

Untuk memulihkan dari update yang gagal, lakukan hal berikut:

  1. Periksa pesan error dan atasi masalah yang ditunjukkan.
  2. Coba lagi permintaan update dengan menjalankan perintah yang gagal, seperti gcloud container clusters update ... --database-encryption-key. Sebaiknya coba lagi dengan permintaan update yang sama yang Anda keluarkan awalnya, atau update cluster kembali ke status sebelumnya. GKE mungkin tidak dapat bertransisi ke kunci atau status enkripsi yang berbeda jika tidak dapat membaca satu atau beberapa Secret.

Bagian berikut mencantumkan alasan umum terjadinya error.

Error kunci Cloud KMS

Jika pesan error berisi referensi ke satu atau beberapa kunci Cloud KMS, periksa konfigurasi kunci Cloud KMS Anda untuk memastikan versi kunci yang relevan dapat digunakan.

Jika error menunjukkan bahwa kunci Cloud KMS telah dinonaktifkan atau dihapus, aktifkan kembali kunci atau versi kunci.

Error: Tidak dapat menggunakan kunci CloudKMS yang dikonfigurasi untuk enkripsi Tingkat Aplikasi

Pesan error berikut terjadi jika akun layanan default GKE tidak dapat mengakses kunci Cloud KMS:

Cluster problem detected (Kubernetes Engine Service Agent account unable to use CloudKMS key configured for Application Level encryption).

Untuk menyelesaikan masalah ini, aktifkan kembali kunci yang dinonaktifkan.

Tidak dapat memperbarui Secret

Error berikut mungkin terjadi jika Kubernetes API menolak permintaan update karena webhook penerimaan:

error admission webhook WEBHOOK_NAME denied the request

Untuk mengatasi error ini, hapus webhook atau ubah sehingga GKE dapat memperbarui Secret di semua namespace selama update kunci.

Error: namespace dikelola

Error berikut terjadi saat Anda mencoba mengenkripsi ulang Secret yang berada di namespace yang dikelola GKE, seperti kube-system, di cluster Autopilot. Pesan errornya mirip dengan yang berikut ini:

Error from server (Forbidden): secrets "alertmanager" is
forbidden: User cannot patch resource "secrets" in API group "" in the namespace "gke-gmp-system":
GKE Warden authz [denied by managed-namespaces-limitation]: the namespace "gke-gmp-system"
is managed and the request's verb "patch" is denied'

Cluster GKE Autopilot tidak memungkinkan Anda mengubah resource Kubernetes, termasuk Secret, di namespace terkelola.

Untuk mengatasi error ini, lakukan hal berikut:

  • Jika Anda menggunakan perintah kubectl untuk mengenkripsi ulang Secret, gunakan flag --namespace untuk mencakup perintah ke namespace yang Anda kelola.
  • Jika Anda menggunakan CronJob untuk mengenkripsi ulang Secret, deploy hanya di namespace yang Anda kelola.

Panel kontrol tidak responsif setelah menonaktifkan enkripsi

Menonaktifkan enkripsi secret lapisan aplikasi terlalu cepat setelah Anda mengaktifkannya dapat mengganggu tugas enkripsi awal, yang dapat menyebabkan panel kontrol kube-apiserver cluster Anda menjadi tidak responsif.

Berikut adalah gejala masalah ini:

  • Operasi cluster seperti list node, list pods, dan get apiserver readiness gagal dengan kode error 13 dan pesan Internal Server Error.
  • Pengontrol Kube tidak berfungsi, dan Pod yang dihapus dari StatefulSet atau ReplicaSet tidak dibuat ulang.
  • Panggilan webhook gagal karena koneksi ditolak.

Untuk mengurangi masalah ini, lakukan hal berikut:

  • Aktifkan kembali enkripsi secret lapisan aplikasi menggunakan kunci Cloud KMS yang sama yang sebelumnya Anda gunakan untuk mengaktifkan enkripsi.

Untuk mencegah masalah ini, pastikan hal berikut:

  • Setelah Anda mengaktifkan enkripsi secret lapisan aplikasi, pastikan cluster telah stabil selama beberapa jam sebelum Anda menonaktifkan enkripsi.

Langkah berikutnya