Menyinkronkan secret ke Secret Kubernetes

Dokumen ini menjelaskan cara menyinkronkan secret yang disimpan di Secret Manager ke Secret Kubernetes dalam cluster Google Kubernetes Engine (GKE) Anda.

Proses sinkronisasi memungkinkan aplikasi yang berjalan di GKE mengakses secret dari Secret Manager menggunakan metode Kubernetes standar, seperti variabel lingkungan atau pemasangan volume. Hal ini berguna untuk aplikasi yang sudah dirancang untuk membaca secret dari objek Secret Kubernetes, dan tidak perlu diupdate untuk mengakses Secret Manager secara langsung.

Rekomendasi: Fitur sinkronisasi secret adalah alternatif untuk add-on Secret Manager, yang memasang secret sebagai file dalam memori langsung ke Pod Anda. Gunakan add-on Secret Manager jika aplikasi Anda mendukungnya, karena ini adalah metode yang lebih aman untuk mengakses secret dari Secret Manager di GKE.

Sebelum memulai

Selesaikan prasyarat berikut sebelum Anda menyinkronkan secret:

  • Aktifkan Secret Manager dan Google Kubernetes Engine API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    Aktifkan API

  • Instal, lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update.

  • Pastikan Anda memiliki cluster GKE yang berjalan. Fitur ini memerlukan GKE versi 1.33 dan yang lebih baru.

  • Pastikan Workload Identity Federation for GKE diaktifkan di cluster GKE Anda. Hal ini diperlukan untuk autentikasi. Workload Identity Federation for GKE diaktifkan secara default di cluster Autopilot.

  • Pastikan Anda memiliki izin Identity and Access Management yang diperlukan untuk mengelola cluster GKE dan Secret Manager.

Mengaktifkan sinkronisasi secret di cluster GKE

Aktifkan fitur sinkronisasi secret saat Anda membuat cluster baru atau mengupdate cluster yang ada. Fitur ini tersedia di cluster Standar dan Autopilot.

Mengaktifkan sinkronisasi secret di cluster baru

Untuk membuat cluster baru dengan sinkronisasi secret, gunakan salah satu perintah gcloud CLI berikut:

Cluster standar

Untuk menggunakan Secret Manager di command line, pertama-tama Instal atau upgrade ke Google Cloud CLI versi 378.0.0 atau yang lebih tinggi. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Aktifkan sinkronisasi secret tanpa rotasi otomatis.

gcloud container clusters create CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --enable-secret-sync

Aktifkan sinkronisasi secret dengan rotasi otomatis. Interval defaultnya adalah 2 menit.

gcloud container clusters create CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --enable-secret-sync \
    --enable-secret-sync-rotation

Aktifkan sinkronisasi secret dengan interval rotasi kustom. Interval minimumnya adalah 1 menit.

gcloud container clusters create CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --enable-secret-sync \
    --enable-secret-sync-rotation \
    --secret-sync-rotation-interval=60s

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster GKE Anda
  • CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster Anda, seperti us-central1 atau us-east1-a
  • PROJECT_ID: ID proyek Google Cloud Anda

Cluster Autopilot

Untuk menggunakan Secret Manager di command line, pertama-tama Instal atau upgrade ke Google Cloud CLI versi 378.0.0 atau yang lebih tinggi. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Aktifkan sinkronisasi secret tanpa rotasi otomatis.

gcloud container clusters create-auto CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync

Aktifkan sinkronisasi secret dengan rotasi otomatis. Interval defaultnya adalah 2 menit.

gcloud container clusters create-auto CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync \
    --enable-secret-sync-rotation

Aktifkan sinkronisasi secret dengan interval rotasi kustom. Interval minimumnya adalah 1 menit.

gcloud container clusters create-auto CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync \
    --enable-secret-sync-rotation \
    --secret-sync-rotation-interval=60s

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster GKE Anda
  • CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster Anda, seperti us-central1 atau us-east1-a

Mengaktifkan sinkronisasi secret di cluster yang ada

Untuk mengupdate cluster yang ada dengan sinkronisasi secret, gunakan salah satu perintah gcloud CLI berikut:

gcloud

Untuk menggunakan Secret Manager di command line, pertama-tama Instal atau upgrade ke Google Cloud CLI versi 378.0.0 atau yang lebih tinggi. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

Mengaktifkan sinkronisasi secret di cluster yang ada

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync

Mengaktifkan rotasi dengan interval kustom

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync-rotation \
    --secret-sync-rotation-interval=300s

Menonaktifkan rotasi

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-secret-sync-rotation

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster GKE Anda
  • CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster Anda, seperti us-central1 atau us-east1-a

Mengonfigurasi sinkronisasi secret

Untuk menyinkronkan secret, selesaikan langkah-langkah berikut:

  1. Buat Akun Layanan Kubernetes menggunakan perintah berikut:

    kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
    

    Ganti kode berikut:

    • KSA_NAME: nama Akun Layanan Kubernetes Anda
    • NAMESPACE: namespace Kubernetes tempat Anda ingin membuat Akun Layanan
  2. Buat kebijakan izin IAM yang mereferensikan Akun Layanan Kubernetes baru dan berikan izin Akun Layanan untuk mengakses secret:

    gcloud

    Untuk menggunakan Secret Manager di command line, pertama-tama Instal atau upgrade ke Google Cloud CLI versi 378.0.0 atau yang lebih tinggi. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

    gcloud secrets add-iam-policy-binding SECRET_NAME \
       --role=roles/secretmanager.secretAccessor \
       --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
    

    Ganti kode berikut:

    • SECRET_NAME: nama secret di Secret Manager
    • PROJECT_NUMBER: nomor Google Cloud project Anda
    • PROJECT_ID: ID proyek Google Cloud Anda
    • NAMESPACE: namespace Kubernetes
    • KSA_NAME: nama Akun Layanan Kubernetes Anda
  3. Buat resource kustom SecretProviderClass menggunakan manifes YAML. Resource SecretProviderClass menentukan secret tertentu untuk mengambil Secret Manager, termasuk nama dan jalur resource-nya. Add-on Secret Manager juga menggunakan resource SecretProviderClass untuk mencantumkan secret yang akan dipasang dan nama file untuk memasangnya.

    Buat file spc.yaml dengan konten berikut:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: SECRET_PROVIDER_CLASS_NAME
      namespace: NAMESPACE
    spec:
      provider: gke
      parameters:
        secrets: |
          -   resourceName: "projects/SECRET_PROJECT_ID/secrets/SECRET_NAME_1/versions/SECRET_VERSION_1"
              path: "FILENAME.txt"
          -   resourceName: "projects/SECRET_PROJECT_ID/secrets/SECRET_NAME_2/versions/SECRET_VERSION_2"
              path: "FILENAME1.txt"
    

    Ganti kode berikut:

    • SECRET_PROVIDER_CLASS_NAME: nama untuk objek SecretProviderClass Anda.
    • NAMESPACE: namespace Kubernetes tempat Anda membuat resource ini.
    • resourceName: ID resource lengkap untuk secret di Secret Manager. ID ini harus menyertakan project ID, nama secret, dan versi yang mengikuti format: projects/SECRET_PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION.
      • SECRET_PROJECT_ID: ID Google Cloud project tempat secret disimpan. ID ini dapat sama dengan PROJECT_ID jika secret disimpan di project yang sama dengan cluster GKE.
      • SECRET_NAME: nama secret.
      • SECRET_VERSION: versi secret. Versi secret harus berada di region yang sama dengan cluster.
    • path: nama file atau alias lokal yang akan digunakan untuk mengekspos nilai secret dalam lingkungan Kubernetes. ID ini adalah ID unik yang menautkan versi Secret Manager tertentu ke representasi lokal yang digunakan oleh cluster. Saat secret disinkronkan ke Secret Kubernetes menggunakan resource SecretSync, jalur ini direferensikan oleh kolom sourcePath untuk menemukan nilai secret yang akan disinkronkan. Anda dapat memetakan beberapa secret (yang ditentukan oleh resourceName) ke nama jalur yang berbeda dalam SecretProviderClass yang sama.
  4. Untuk menerapkan manifes, jalankan perintah berikut:

    kubectl apply -f spc.yaml
    
  5. Buat resource kustom SecretSync menggunakan manifes YAML. Resource ini menginstruksikan pengontrol sinkronisasi untuk membuat atau mengupdate Secret Kubernetes berdasarkan konten yang ditentukan dalam SecretProviderClass.

    Buat file secret-sync.yaml dengan konten berikut:

    apiVersion: secret-sync.gke.io/v1
    kind: SecretSync
    metadata:
      name: KUBERNETES_SECRET_NAME
      namespace: NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      secretProviderClassName: SECRET_PROVIDER_CLASS_NAME
      secretObject:
        type: KUBERNETES_SECRET_TYPE
        data:
          -   sourcePath: "FILENAME.txt"
              targetKey: "TARGET_KEY1"
          -   sourcePath: "FILENAME1.txt"
              targetKey: "TARGET_KEY2"
    

    Ganti kode berikut:

    • KUBERNETES_SECRET_NAME: nama yang ingin Anda berikan ke Secret Kubernetes baru yang akan dibuat oleh resource SecretSync.
    • NAMESPACE: namespace Kubernetes tempat resource baru dibuat. Namespace ini harus sama dengan SecretProviderClass.
    • KSA_NAME: nama Akun Layanan Kubernetes yang digunakan pengontrol SecretSync untuk membuat dan mengupdate Secret Kubernetes target. Akun Layanan ini harus memiliki izin yang diperlukan untuk mengakses secret eksternal dari Secret Manager.
    • SECRET_PROVIDER_CLASS_NAME: nama objek SecretProviderClass yang Anda buat pada langkah sebelumnya. Resource SecretSync menggunakan nama ini untuk menemukan konfigurasi yang benar untuk secret.
    • KUBERNETES_SECRET_TYPE: jenis Secret Kubernetes yang akan dibuat, seperti Opaque, tls, atau docker-registry. Hal ini menentukan cara Kubernetes menangani data secret.
    • sourcePath: nama file atau alias lokal (nilai kolom path di SecretProviderClass) yang mengidentifikasi data secret yang akan diambil. Pengontrol SecretSync menggunakan sourcePath ini untuk meminta konten secret tertentu dan mengonversinya menjadi Secret Kubernetes baru.
    • targetKey: kunci yang akan digunakan di bagian data dari Secret Kubernetes baru yang sedang dibuat. Hal ini menentukan cara konten secret yang diambil menggunakan sourcePath diberi nama dan disimpan dalam objek Secret Kubernetes akhir. Menggunakan beberapa entri dalam array data memungkinkan Anda menentukan beberapa pasangan nilai kunci dalam Secret target yang sama.
  6. Untuk menerapkan manifes, jalankan perintah berikut:

    kubectl apply -f secret-sync.yaml
    

    Pengontrol sinkronisasi membuat Secret Kubernetes di namespace yang ditentukan. Secret ini berisi data yang dipetakan dari Secret Manager.

  7. Pastikan Secret Kubernetes dibuat:

    kubectl get secret KUBERNETES_SECRET_NAME -n NAMESPACE -o yaml
    

    Ganti kode berikut:

    • KUBERNETES_SECRET_NAME: nama Secret Kubernetes baru
    • NAMESPACE: namespace Kubernetes tempat Secret baru dibuat
  8. Untuk memecahkan masalah sinkronisasi, gunakan perintah berikut:

    kubectl describe secretSync KUBERNETES_SECRET_NAME -n NAMESPACE
    

    Ganti kode berikut:

    • KUBERNETES_SECRET_NAME: nama Secret Kubernetes baru
    • NAMESPACE: namespace Kubernetes tempat Secret baru harus ada

Mengelola rotasi secret

Jika Anda mengaktifkan flag --enable-secret-sync-rotation, di cluster, pengontrol sinkronisasi akan memeriksa Secret Manager secara berkala untuk mengetahui versi baru secret yang ditentukan dalam resource SecretProviderClass. Flag --secret-sync-rotation-interval menentukan frekuensi pengontrol memeriksa update.

Jika pengontrol mendeteksi versi secret baru di Secret Manager, pengontrol akan mengupdate Secret Kubernetes yang sesuai. Pengontrol membandingkan hash konten secret untuk mengupdate secret hanya saat terjadi perubahan.

Aplikasi yang menggunakan secret ini harus mendeteksi dan memuat ulang nilai secret yang diupdate dari Secret Kubernetes. Desain aplikasi menentukan cara penanganan hal ini.

Menonaktifkan sinkronisasi secret

Untuk menonaktifkan sinkronisasi secret, jalankan perintah gcloud CLI berikut:

gcloud

Untuk menggunakan Secret Manager di command line, pertama-tama Instal atau upgrade ke Google Cloud CLI versi 378.0.0 atau yang lebih tinggi. Di Compute Engine atau GKE, Anda harus melakukan autentikasi dengan cakupan cloud-platform.

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-secret-sync

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster GKE Anda
  • CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster Anda, seperti us-central1 atau us-east1-a

Perintah ini menghentikan pengontrol sinkronisasi. Perintah ini tidak menghapus Secret Kubernetes yang telah dibuat. Anda harus menghapus Secret Kubernetes yang disinkronkan secara manual jika tidak lagi memerlukannya.

Menghapus secret yang disinkronkan

Untuk menghapus Secret Kubernetes yang disinkronkan, hapus resource SecretSync menggunakan perintah berikut:

    kubectl delete secretsync KUBERNETES_SECRET_NAME --namespace NAMESPACE

Ganti kode berikut:

  • KUBERNETES_SECRET_NAME: nama Secret Kubernetes
  • NAMESPACE: namespace Kubernetes tempat Secret berada

Bermigrasi dari Secrets Store CSI Driver yang ada

Jika Anda bermigrasi dari instalasi Secrets Store CSI Driver yang ada, ikuti langkah-langkah berikut:

  1. Update kolom provider di SecretProviderClass dari gcp ke gke. Contoh berikut menunjukkan cara mengupdate kolom provider:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: app-secrets-gke
    spec:
      provider: gke
      parameters:
        secrets: |
          -   resourceName: "projects/87654321/secrets/api-key-secret/versions/2"
              path: "good1.txt"
    
  2. Buat resource SecretSync. Gunakan contoh konfigurasi berikut:

    apiVersion: secret-sync.gke.io/v1
    kind: SecretSync
    metadata:
      name: my-kube-secret
      namespace: NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      secretProviderClassName: my-app-secrets
      secretObject:
        type: Opaque # Or other Kubernetes Secret types
        data:
          -   sourcePath: "my-secret.txt"
              targetKey: "USERNAME"
          -   sourcePath: "another-secret.txt"
              targetKey: "PASSWORD"
    

Pertimbangan keamanan

Secret Manager menawarkan fitur keamanan seperti kontrol akses dengan IAM, kunci enkripsi yang dikelola pelanggan (CMEK), dan logging audit. Secret dienkripsi dalam penyimpanan dan dalam pengiriman di Secret Manager. Saat Anda menyinkronkan secret ke secret Kubernetes, keamanannya dalam cluster bergantung pada konfigurasi cluster GKE Anda. Pertimbangkan hal berikut:

  • Penyimpanan: Secret Kubernetes disimpan di etcd, yang merupakan penyimpanan data utama GKE. Secara default, GKE mengenkripsi data dalam penyimpanan. Untuk meningkatkan keamanan, enkripsi secret Kubernetes di lapisan aplikasi menggunakan kunci yang Anda kelola di Cloud Key Management Service(Cloud KMS). Mengenkripsi secret memberikan lapisan keamanan tambahan untuk workload sensitif.

  • Kontrol akses: GKE mendukung berbagai opsi untuk mengelola akses ke resource dalam project dan cluster-nya menggunakan kontrol akses berbasis peran (RBAC). Izin RBAC yang terlalu luas dapat mengekspos secret ke workload atau pengguna yang tidak diinginkan. Berikan akses dengan mengikuti prinsip hak istimewa terendah dan audit akses secara rutin ke Secret Manager dan secret Kubernetes.

  • Variabel lingkungan: Untuk meningkatkan keamanan, pasang secret Kubernetes sebagai volume, bukan menggunakannya sebagai variabel lingkungan. Tindakan ini mengurangi risiko logging yang tidak disengaja atau eksposur ke proses lain.

Langkah berikutnya