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 didesain untuk membaca secret dari objek Secret Kubernetes, daripada harus 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 setiap kali 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 rahasia:

  • Enable the Secret Manager and Google Kubernetes Engine APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • 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.34 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 memperbarui cluster yang ada. Fitur ini tersedia di cluster Standard dan Autopilot.

Mengaktifkan sinkronisasi rahasia 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.

Mengaktifkan sinkronisasi rahasia tanpa rotasi otomatis.

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

Aktifkan sinkronisasi rahasia dengan rotasi otomatis. Interval default adalah 2 menit.

gcloud beta 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 rahasia dengan interval rotasi kustom. Interval minimum adalah 1 menit.

gcloud beta 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=1m

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: Google Cloud project ID 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.

Mengaktifkan sinkronisasi rahasia tanpa rotasi otomatis.

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

Aktifkan sinkronisasi rahasia dengan rotasi otomatis. Interval default adalah 2 menit.

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

Aktifkan sinkronisasi rahasia dengan interval rotasi kustom. Interval minimum adalah 1 menit.

gcloud beta container clusters create-auto CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync \
    --enable-secret-sync-rotation \
    --secret-sync-rotation-interval=1m

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 beta container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync

Mengaktifkan rotasi dengan interval kustom

gcloud beta container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-secret-sync-rotation \
    --secret-sync-rotation-interval=5m

Menonaktifkan rotasi

gcloud beta 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 rahasia, 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 ServiceAccount Kubernetes Anda
    • NAMESPACE: namespace Kubernetes tempat Anda ingin membuat ServiceAccount
  2. Buat kebijakan izinkan IAM yang mereferensikan ServiceAccount Kubernetes baru dan berikan izin ServiceAccount 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_PROJECT_ID \
       --role=roles/secretmanager.secretAccessor \
       --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_IDsvc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME
    

    Ganti kode berikut:

    • SECRET_PROJECT_ID: ID project tempat secret disimpan. Ini bisa sama dengan PROJECT_ID jika secret disimpan dalam project yang sama dengan cluster GKE.
    • PROJECT_NUMBER: Google Cloud nomor project Anda
    • PROJECT_ID: Google Cloud project ID Anda
    • NAMESPACE: namespace Kubernetes
    • KSA_NAME: nama ServiceAccount Kubernetes Anda
  3. Buat resource kustom SecretProviderClass menggunakan manifes YAML. Resource SecretProviderClass menentukan secret tertentu yang akan diambil dari Secret Manager, termasuk nama dan jalur resource-nya. Add-on Secret Manager juga menggunakan resource SecretProviderClass untuk mencantumkan secret yang akan di-mount dan nama file untuk me-mount-nya.

    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/versions/SECRET_VERSION"
              path: "FILENAME.txt"
          -   resourceName: "projects/SECRET_PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION"
              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. Ini harus mencakup project ID, nama rahasia, dan versi yang mengikuti format: projects/SECRET_PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION.
      • SECRET_PROJECT_ID: ID project Google Cloud tempat secret disimpan. Nilai ini bisa sama dengan PROJECT_ID jika secret disimpan dalam project yang sama dengan cluster GKE.
      • SECRET_NAME: nama secret.
      • SECRET_VERSION: versi secret. Versi rahasia harus berada di region yang sama dengan cluster.
    • path: nama file atau alias lokal yang akan diekspos sebagai nilai rahasia dalam lingkungan Kubernetes. ID ini adalah ID unik yang menautkan versi Secret Manager tertentu ke representasi lokal yang digunakan oleh cluster. Saat rahasia disinkronkan ke Secret Kubernetes menggunakan resource SecretSync, jalur ini direferensikan oleh kolom sourcePath untuk menemukan nilai rahasia 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 ServiceAccount Kubernetes yang digunakan pengontrol SecretSync untuk membuat dan memperbarui Secret Kubernetes target. ServiceAccount ini harus memiliki izin yang diperlukan untuk mengakses secret eksternal dari Secret Manager.
    • SECRET_PROVIDER_CLASS_NAME: nama objek SecretProviderClass yang Anda buat di langkah sebelumnya. Resource SecretSync menggunakan ini untuk menemukan konfigurasi yang benar untuk rahasia.
    • 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 rahasia 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 rahasia yang diambil menggunakan sourcePath diberi nama dan disimpan dalam objek Secret Kubernetes akhir. Dengan menggunakan beberapa entri dalam array data, Anda dapat 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 bahwa Secret Kubernetes telah 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 seberapa sering pengontrol memeriksa update.

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

Aplikasi yang menggunakan secret ini harus mendeteksi dan memuat ulang nilai secret yang diperbarui dari Secret Kubernetes. Desain aplikasi menentukan cara penanganannya.

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 beta 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. Secret Kubernetes yang telah dibuat tidak akan dihapus. 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 Driver CSI Secrets Store yang ada

Jika Anda melakukan migrasi dari penginstalan Secrets Store CSI Driver yang ada, ikuti langkah-langkah berikut:

  1. Perbarui kolom provider di SecretProviderClass dari gcp menjadi gke. Contoh berikut menunjukkan cara memperbarui 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 konfigurasi contoh 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 saat dalam penyimpanan dan dalam transit 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 datastore utama GKE. Secara default, GKE mengenkripsi data dalam penyimpanan. Untuk meningkatkan keamanan, enkripsi secret Kubernetes pada lapisan aplikasi dengan 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 beberapa opsi untuk mengelola akses ke resource dalam project dan cluster-nya menggunakan kontrol akses berbasis peran (RBAC). Izin RBAC yang terlalu luas dapat mengekspos rahasia ke beban kerja 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 pencatatan log yang tidak disengaja atau pemaparan ke proses lain.

Langkah berikutnya