All Products
Search
Document Center

Container Service for Kubernetes:Impor kredensial Alibaba Cloud KMS menggunakan csi-secrets-store-provider-alibabacloud

Last Updated:Mar 26, 2026

csi-secrets-store-provider-alibabacloud menarik secret dari Key Management Service (KMS) langsung ke kluster ACK Anda—baik sebagai Kubernetes Secrets maupun sebagai file yang dimount melalui CSI inline volumes. Komponen ini juga mendukung rotasi rahasia otomatis, yang mengurangi jendela eksposur saat kredensial berubah.

image

Catatan keamanan

Sebelum menerapkan plugin ini, pahami risiko berikut:

  • Secret yang dimount sebagai file dapat diakses melalui sistem file. Penyerang dapat mengeksploitasi kerentanan Common Vulnerabilities and Exposures (CVE) pada aplikasi Anda untuk melakukan traversal direktori dan membaca file tersebut.

  • Breakpoint debug yang salah konfigurasi atau akses log yang terlalu permisif dapat mengekspos secret yang dimount.

  • Jangan mereferensikan secret melalui variabel lingkungan. Variabel lingkungan lebih mudah bocor dibandingkan mount berbasis file.

  • Saat Anda mengaktifkan sinkronisasi secret, terapkan prinsip hak istimewa minimal untuk membatasi izin akses.

Jika aplikasi Anda tidak perlu menyimpan secret ke sistem file atau Kubernetes Secrets, gunakan RRSA untuk mengotorisasi pod berbeda agar mengakses layanan cloud berbeda dan panggil GetSecretValue secara langsung dalam kode aplikasi Anda. Hal ini sepenuhnya menghindari eksposur secret di sistem file pod.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Kluster ACK yang dikelola, kluster khusus ACK, atau kluster terdaftar yang menjalankan Kubernetes 1.20 atau lebih baru

    Kluster ACK Serverless tidak didukung.
  • Kluster dan secret KMS Anda berada di wilayah yang sama

  • Klien kubectl yang terhubung ke kluster. Lihat Menghubungkan ke kluster ACK menggunakan kubectl

Persyaratan versi berdasarkan metode autentikasi:

Metode autentikasiVersi Kubernetes minimumJenis kluster yang didukung
RRSA1.22Kluster ACK yang dikelola dan kluster ACK Serverless
Worker RAM role1.20Kluster ACK yang dikelola, khusus, dan terdaftar
Pasangan AccessKey1.20Semua jenis kluster ACK

Langkah 1: Konfigurasikan autentikasi

csi-secrets-store-provider-alibabacloud memerlukan izin untuk membaca secret dari KMS. Pilih metode yang sesuai dengan jenis kluster dan persyaratan keamanan Anda.

Metode mana yang harus saya gunakan?

  • RRSA (direkomendasikan untuk kluster ACK yang dikelola dan kluster ACK Serverless pada Kubernetes 1.22+): Menyediakan kontrol izin tingkat pod tanpa memerlukan pasangan AccessKey. Ini adalah opsi paling aman.

  • Worker RAM role: Lebih mudah dikonfigurasi—tidak memerlukan Secret kredensial. Semua pod dalam kluster berbagi izin yang sama, yang mungkin terlalu luas untuk beberapa kasus penggunaan.

  • Pasangan AccessKey: Berfungsi dengan semua jenis kluster, termasuk kluster terdaftar dan versi Kubernetes lama. Memerlukan pengelolaan kredensial AccessKey secara manual.

Gunakan RRSA untuk memberikan izin

  1. Aktifkan RRSA untuk kluster ACK Anda di Konsol ACK. Tindakan ini membuat penyedia identitas OpenID Connect (OIDC) untuk kluster. Lihat Aktifkan RRSA.

  2. Buat peran RAM untuk OIDC IdP dengan kondisi kebijakan kepercayaan berikut. Lihat Buat peran RAM untuk OIDC IdP.

    Komponen diinstal di namespace kube-system secara default. Jika Anda menginstal csi-secrets-store-provider-alibabacloud di namespace berbeda, ganti kube-system dengan nama namespace tersebut.
    ParameterNilai
    Identity provider typeOIDC
    Identity providerack-rrsa-<cluster_id> (ganti <cluster_id> dengan ID kluster Anda)
    oidc:issGunakan nilai default
    oidc:audGunakan nilai default
    oidc:subTambahkan secara manual: key = oidc:sub, operator = StringEquals, value = system:serviceaccount:<namespace>:<serviceAccountName>. Untuk instalasi default, gunakan system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud
  3. Buat kebijakan RAM kustom dan sambungkan ke peran RAM. Lihat Buat kebijakan kustom dan Berikan izin ke peran RAM.

    {
        "Action": [
           "kms:GetSecretValue",
           "kms:Decrypt"
        ],
        "Resource": [
            "*"
        ],
        "Effect": "Allow"
    }
  4. Buat Secret bernama alibaba-credentials di namespace kube-system. Buat file bernama secretstore-rrsa.yaml dengan konten berikut, ganti nilai placeholder dengan string Base64:

    • {rolearn}: ARN dari peran RAM yang dibuat pada langkah 2

    • {oidcproviderarn}: ARN penyedia yang dihasilkan saat Anda mengaktifkan RRSA

    apiVersion: v1
    data:
      rolearn: {rolearn}
      oidcproviderarn: {oidcproviderarn}
    kind: Secret
    metadata:
      name: alibaba-credentials
      namespace: kube-system
    type: Opaque

    Terapkan Secret:

    kubectl apply -f secretstore-rrsa.yaml

Berikan izin ke worker RAM role

Metode ini berlaku untuk kluster ACK yang dikelola, kluster khusus ACK, dan kluster terdaftar.

  1. Buat kebijakan RAM kustom. Lihat Buat kebijakan kustom.

    {
      "Action": [
        "kms:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  2. Sambungkan kebijakan ke worker RAM role kluster Anda. Lihat Berikan izin ke worker RAM role.

Metode ini tidak memerlukan Secret kredensial. Lanjutkan ke Langkah 2.

Gunakan pasangan AccessKey untuk mengasumsikan peran RAM

Metode ini berfungsi dengan semua jenis kluster ACK.

  1. Buat peran RAM untuk akun Alibaba Cloud tepercaya. Saat diminta memasukkan Nama Prinsipal, pilih Current Account. Lihat Buat peran RAM untuk akun Alibaba Cloud tepercaya.

  2. Buat kebijakan RAM kustom dan sambungkan ke peran RAM. Lihat Buat kebijakan kustom dan Berikan izin ke peran RAM.

    {
      "Action": [
        "kms:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  3. Buat kebijakan yang mengizinkan pengguna RAM untuk mengasumsikan peran ini, lalu sambungkan ke pengguna RAM. Lihat Buat kebijakan kustom dan Berikan izin ke pengguna RAM. Ganti <account-id> dengan ID akun Alibaba Cloud Anda dan <role-name> dengan nama peran RAM dari langkah 1. Untuk menemukan ARN peran, lihat Bagaimana cara melihat ARN peran RAM?

    {
        "Statement": [
            {
                "Action": "sts:AssumeRole",
                "Effect": "Allow",
                "Resource": "acs:ram:*:<account-id>:role/<role-name>"
            }
        ],
        "Version": "1"
    }
  4. Buat Secret bernama alibaba-credentials di namespace kube-system. Buat file bernama alibaba-credentials.yaml dengan konten berikut, ganti semua nilai placeholder dengan string Base64:

    • {rolearn}: ARN dari peran RAM yang dibuat pada langkah 1

    • {ak}: ID AccessKey pengguna RAM

    • {sk}: Rahasia AccessKey pengguna RAM

    apiVersion: v1
    data:
      id: {ak}
      secret: {sk}
      rolearn: {rolearn}
    kind: Secret
    metadata:
      name: alibaba-credentials
      namespace: kube-system
    type: Opaque

    Terapkan Secret:

    kubectl apply -f alibaba-credentials.yaml

Langkah 2: Instal csi-secrets-store-provider-alibabacloud

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Klik nama kluster Anda. Di panel navigasi kiri, pilih Applications > Helm.

  3. Di halaman Helm, klik Deploy. Di bidang Chart, masukkan csi-secrets-store-provider-alibabacloud. Pertahankan pengaturan default untuk parameter lain, lalu klik Next. Di kotak dialog yang muncul, konfirmasi bahwa komponen diinstal di namespace default kube-system dan aplikasi dirilis dengan nama komponen tersebut. Jika Anda ingin menggunakan nama aplikasi atau namespace kustom, konfigurasikan sesuai petunjuk.

  4. Atur Chart Version ke versi terbaru. Di bagian Parameters, konfigurasikan parameter berdasarkan metode autentikasi yang Anda pilih di Langkah 1:

    • RRSA: Atur rrsa.enable ke true. Plugin membaca ALICLOUD_ROLE_ARN dan ALICLOUD_OIDC_PROVIDER_ARN dari Secret alibaba-credentials. image

      envVarsFromSecret:
      #  ACCESS_KEY_ID:
      #    secretKeyRef: alibaba-credentials
      #    key: id
      #  SECRET_ACCESS_KEY:
      #    secretKeyRef: alibaba-credentials
      #    key: secret
        ALICLOUD_ROLE_ARN:
          secretKeyRef: alibaba-credentials
          key: rolearn
      #  ALICLOUD_ROLE_SESSION_NAME:
      #    secretKeyRef: alibaba-credentials
      #    key: rolesessionname
      #  ALICLOUD_ROLE_SESSION_EXPIRATION:
      #    secretKeyRef: alibaba-credentials
      #   key: rolesessionexpiration
        ALICLOUD_OIDC_PROVIDER_ARN:
          secretKeyRef: alibaba-credentials
          key: oidcproviderarn
    • Worker RAM role: Gunakan parameter default. Tidak perlu perubahan.

    • Pasangan AccessKey: Konfigurasikan ACCESS_KEY_ID, SECRET_ACCESS_KEY, dan ALICLOUD_ROLE_ARN untuk membaca dari Secret alibaba-credentials. ``

      envVarsFromSecret:
        ACCESS_KEY_ID:
          secretKeyRef: alibaba-credentials
          key: id
        SECRET_ACCESS_KEY:
          secretKeyRef: alibaba-credentials
          key: secret
        ALICLOUD_ROLE_ARN:
          secretKeyRef: alibaba-credentials
          key: rolearn
      #  ALICLOUD_ROLE_SESSION_NAME:
      #    secretKeyRef: alibaba-credentials
      #    key: rolesessionname
      #  ALICLOUD_ROLE_SESSION_EXPIRATION:
      #    secretKeyRef: alibaba-credentials
      #    key: rolesessionexpiration
      #  ALICLOUD_OIDC_PROVIDER_ARN:
      #    secretKeyRef: alibaba-credentials
      #    key: oidcproviderarn
    • (Opsional) Aktifkan rotasi secret: Untuk menyinkronkan secret secara otomatis sesuai jadwal, konfigurasikan parameter berikut: image

      • secrets-store-csi-driver.enableSecretRotation: Atur ke true untuk mengaktifkan rotasi otomatis.

      • secrets-store-csi-driver.rotationPollInterval: Interval sinkronisasi dalam detik. Misalnya, 120 menyinkronkan secret setiap 2 menit.

  5. Klik OK. Setelah instalasi selesai, Konsol ACK akan mengarahkan Anda ke halaman csi-secrets-store-provider-alibabacloud. Verifikasi instalasi dengan memastikan semua resource yang diharapkan telah dibuat:

    image.png

Langkah 3: Konfigurasikan sinkronisasi secret

Setelah autentikasi dikonfigurasi, definisikan secret KMS mana yang akan dimount menggunakan resource SecretProviderClass.

Parameter SecretProviderClass

Spesifikasi SecretProviderClass menggunakan bidang provider: alibabacloud dan bagian parameters:

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <NAME>
spec:
  provider: alibabacloud   # Harus diatur ke alibabacloud
  parameters:

Bagian parameters mendukung bidang berikut:

`objects` (wajib)

Konfigurasi YAML yang mencantumkan secret KMS untuk dimount. Setiap entri mendukung subfield berikut:

  • objectName (wajib): Nama secret di KMS Secrets Manager. Lihat SecretName.

  • objectType (opsional): Layanan Alibaba Cloud tempat sinkronisasi dilakukan. Nilai valid: kms, oos. Default ke kms.

  • objectAlias (opsional): Nama file yang digunakan saat memount secret ke pod. Default ke nilai objectName.

  • objectVersion (opsional): Sesuai dengan VersionId di KMS Secrets Manager. Tidak didukung untuk secret ApsaraDB RDS, PolarDB, ApsaraDB for Redis/Tair, RAM, dan ECS.

  • objectVersionLabel (opsional): Sesuai dengan VersionStage di KMS Secrets Manager. Untuk secret RAM, ApsaraDB RDS, PolarDB, ApsaraDB for Redis, Tair, dan ECS, hanya ACSPrevious dan ACSCurrent yang didukung.

  • jmesPath (opsional): Mengekstrak pasangan kunci-nilai tertentu dari secret berformat JSON. Misalnya, diberikan secret dengan nilai berikut:

    • path (wajib): Ekspresi JMESPath untuk mengekstrak nilai.

    • objectAlias (opsional): Nama file untuk nilai yang diekstrak di pod.

    {
      "username": "testuser",
      "password": "testpassword"
    }

    Gunakan jmesPath untuk memount username dan password sebagai file terpisah. Setiap entri memerlukan:

  • kmsEndpoint (opsional): Titik akhir KMS untuk secret ini. Diterapkan per secret—setiap secret dalam daftar objects dapat menggunakan titik akhir berbeda. Jika tidak diatur, titik akhir VPC gateway bersama default digunakan. Lihat referensi kmsEndpoint.

`region` (opsional)

Wilayah server KMS Secrets Manager tempat mengirim permintaan. Default ke wilayah node saat ini. Tentukan bidang ini secara eksplisit jika aplikasi Anda menjalankan banyak pod, untuk menghindari overhead performa dari deteksi wilayah otomatis.

`pathTranslation` (opsional)

Karakter yang digunakan untuk menggantikan pemisah path dalam nama secret. Misalnya, My/Path/Secret menjadi My_Path_Secret secara default. Atur ke "False" untuk menonaktifkan penggantian.

Contoh: Mount secret KMS ke pod NGINX

Contoh ini memount secret KMS test-hangzhou ke pod NGINX di wilayah yang sama dengan kluster.

  1. Buat secretstore.yaml dengan konten berikut:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: test
    spec:
      provider: alibabacloud   # Harus diatur ke alibabacloud
      parameters:
        objects: |
          - objectName: "test-hangzhou"     # Nama secret di KMS Secrets Manager
            objectType: "kms"               # kms atau oos; default ke kms
            objectAlias: "hangzhou-public"  # Nama file di mount pod
            kmsEndpoint: "kms.{region}.aliyuncs.com"  # Ganti {region} dengan wilayah Anda
  2. Terapkan SecretProviderClass:

    kubectl apply -f secretstore.yaml
  3. Buat deploy.yaml dengan konten berikut. Deployment NGINX ini memount secret dari SecretProviderClass ke /mnt/secrets-store. Untuk contoh lain, lihat Contoh Deployment.

    apiVersion: apps/v1  # Jika versi API lebih awal dari 1.8.0, gunakan apps/v1beta1.
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          volumes:
            - name: secrets-store-inline
              csi:
                driver: secrets-store.csi.k8s.io
                readOnly: true
                volumeAttributes:
                  secretProviderClass: "test-secrets"
          containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 # Ganti dengan image Anda.
              ports:
                - containerPort: 80
              resources:
                limits:
                  cpu: "500m"
              volumeMounts:
                - name: secrets-store-inline
                  mountPath: "/mnt/secrets-store"
                  readOnly: true
  4. Terapkan Deployment:

    kubectl apply -f deploy.yaml
  5. Verifikasi bahwa secret telah dimount. Dapatkan nama pod dan baca file secret yang dimount:

    # Dapatkan nama pod
    kubectl get pods -l app=nginx
    
    # Baca secret yang dimount (ganti <pod-name> dengan nama pod Anda)
    kubectl exec <pod-name> -- cat /mnt/secrets-store/hangzhou-public

    Output menampilkan nilai secret yang disimpan di KMS.

Referensi kmsEndpoint

Setiap secret dalam daftar objects dapat menentukan kmsEndpoint-nya sendiri. Jika tidak diatur, plugin menggunakan titik akhir VPC gateway bersama secara default.

Jenis gerbangJenis domainTitik akhirKondisi
Gateway khususDomain privat KMS{kms-instance-id}.cryptoservice.kms.aliyuncs.comInstans secret KMS dan kluster berada di wilayah dan VPC yang sama; versi instans KMS 3.0 atau lebih baru. Ganti {kms-instance-id} dengan ID instans KMS Anda.
Gateway bersamaDomain VPCkms-vpc.{region}.aliyuncs.comSecret KMS dan kluster berada di wilayah yang sama. Ganti {region} dengan wilayah secret KMS. Tidak perlu pengaturan tambahan.
Gateway bersamaDomain publikkms.{region}.aliyuncs.comKluster dengan akses jaringan publik. Ganti {region} dengan wilayah secret KMS.

Contoh berikut menunjukkan SecretProviderClass dengan beberapa secret yang menggunakan titik akhir berbeda:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test
spec:
  provider: alibabacloud  # Harus diatur ke alibabacloud.
  parameters:
    objects: |
      - objectName: "test-hangzhou"
        objectType: "kms"
        objectAlias: "hangzhou-public"
        kmsEndpoint: "kms.{region}.aliyuncs.com"           # Gateway bersama, domain publik. Ganti {region}.
      - objectName: "test-hangzhou"
        objectType: "kms"
        objectAlias: "hangzhou-vpc"                         # Tidak ada kmsEndpoint -- menggunakan titik akhir VPC default.
      - objectName: "test-hangzhou"
        objectType: "kms"
        objectAlias: "hangzhou-cryptoservice"
        kmsEndpoint: "{kms-instance-id}.cryptoservice.kms.aliyuncs.com"  # Gateway khusus. Ganti {kms-instance-id}.
      - objectName: "test-london"
        objectAlias: "london-public"
        kmsEndpoint: "kms.{region}.aliyuncs.com"           # Akses lintas wilayah melalui domain publik. Ganti {region}.

Untuk informasi selengkapnya, lihat Perbedaan antara gateway bersama dan khusus untuk mengakses KMS.

Langkah berikutnya