全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan csi-secrets-store-provider-alibabacloud untuk mengimpor rahasia dari KMS

更新时间:Jul 12, 2025

csi-secrets-store-provider-alibabacloud memungkinkan Anda mengimpor atau menyinkronkan rahasia dari Key Management Service (KMS) ke Kubernetes Secrets di dalam klaster Container Service for Kubernetes (ACK). Plugin ini juga mendukung pemasangan langsung rahasia ke aplikasi melalui CSI inline volumes. Komponen ini membantu mengurangi risiko paparan rahasia dan menyelesaikan masalah kompatibilitas dengan Secrets Manager dari KMS.

Catatan Keamanan

Secara default, membaca rahasia dari volume dapat menimbulkan masalah kompatibilitas dengan Secrets Manager dari KMS. Plugin csi-secrets-store-provider-alibabacloud dapat menyelesaikan masalah ini. Sebelum menggunakan plugin ini, evaluasi risiko keamanan berikut:

  • Penyerang dapat mengeksploitasi kerentanan Common Vulnerabilities and Exposures (CVE) pada aplikasi untuk menjelajahi direktori klaster dan mencuri rahasia yang tersedia melalui sistem file.

  • Konfigurasi titik henti debug atau izin log yang tidak tepat dapat mengekspos rahasia. Hindari merujuk rahasia melalui variabel lingkungan untuk mengurangi risiko keamanan.

  • Aktifkan sinkronisasi rahasia dengan prinsip hak istimewa minimal untuk membatasi akses.

Jika Anda tidak perlu mempertahankan rahasia untuk aplikasi, gunakan RRSA untuk memberi otorisasi pod yang berbeda agar mendapatkan izin akses minimal. Kemudian, panggil operasi GetSecretValue secara langsung untuk mengurangi kemungkinan paparan rahasia.

Prasyarat

Langkah 1: Konfigurasikan informasi autentikasi komponen

Anda perlu mengonfigurasi informasi autentikasi untuk csi-secrets-store-provider-alibabacloud agar plugin tersebut memiliki izin untuk mengakses rahasia dari KMS. Jika tidak, csi-secrets-store-provider-alibabacloud tidak akan dapat mengimpor atau menyinkronkan rahasia ke dalam klaster. Pilih salah satu metode otorisasi berikut berdasarkan jenis klaster yang digunakan.

Gunakan RRSA untuk memberikan izin

Metode ini berlaku untuk klaster ACK terkelola dan klaster ACK Serverless yang menjalankan Kubernetes 1.22 atau lebih baru. Fitur RRSA memungkinkan kontrol izin tingkat pod dan mencegah kebocoran rahasia karena tidak memerlukan pasangan AccessKey.

  1. Aktifkan fitur RRSA untuk klaster ACK di Konsol ACK. Ini memungkinkan pembuatan penyedia identitas (IdP) untuk klaster Anda. Untuk informasi lebih lanjut, lihat Aktifkan RRSA.

  2. Buat peran RAM untuk penyedia identitas (IdP) tepercaya sehingga peran RAM dapat digunakan oleh csi-secrets-store-provider-alibabacloud. Untuk informasi lebih lanjut, lihat Buat Peran RAM untuk IdP OIDC.

    Parameter

    Deskripsi

    Identity Provider Type

    Pilih OIDC.

    Identity Provider

    Pilih ack-rrsa-<cluster_id>. Ganti <cluster_id> dengan ID klaster Anda.

    Condition

    • oidc:iss: Gunakan nilai default.

    • oidc:aud: Gunakan nilai default.

    • oidc:sub: Anda harus menambahkan kondisi ini secara manual.

      • Kunci: Pilih oidc:sub.

      • Operator: Pilih StringEquals.

      • Nilai: Masukkan system:serviceaccount:<namespace>:<serviceAccountName>. Ganti <namespace> dengan namespace aplikasi Anda. Ganti <serviceAccountName> dengan akun layanan yang digunakan oleh aplikasi Anda. Dalam contoh ini, masukkan system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud.

        Catatan

        Kami menyarankan Anda untuk menginstal komponen di namespace default kube-system. Jika Anda menginstal csi-secrets-store-provider-alibabacloud di namespace lain, ganti kube-system dengan nama namespace tersebut.

  3. Buat kebijakan kustom dan berikan izin ke peran RAM yang dibuat pada langkah sebelumnya.

    1. Buat kebijakan yang diperlukan saat menggunakan csi-secrets-store-provider-alibabacloud untuk mengimpor rahasia dari KMS. Blok kode berikut menunjukkan isi kebijakan tersebut. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.

      {
          "Action": [
             "kms:GetSecretValue",
             "kms:Decrypt"
          ],
          "Resource": [
              "*"
          ],
          "Effect": "Allow"
      }
    2. Berikan izin ke peran RAM yang dibuat pada langkah sebelumnya. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM.

  4. Buat Secret bernama alibaba-credentials di klaster berdasarkan template konfigurasi berikut dan ganti bidang yang ditentukan.

    1. Buat file bernama secretstore-rrsa.yaml berdasarkan konten berikut dan ganti bidang yang ditentukan:

      • {rolearn}: Ganti nilainya dengan ARN peran RAM yang dibuat di Langkah 2. ARN harus berupa string yang dikodekan Base64.

      • {oidcproviderarn}: Ganti nilainya dengan ARN penyedia yang dihasilkan setelah RRSA diaktifkan untuk klaster. ARN harus berupa string yang dikodekan Base64.

      apiVersion: v1
      data:
        rolearn: {rolearn}
        oidcproviderarn: {oidcproviderarn}
      kind: Secret
      metadata:
        name: alibaba-credentials
        namespace: kube-system
      type: Opaque
      	                     
    2. Jalankan perintah berikut untuk menerapkan Secret:

      kubectl apply -f secretstore-rrsa.yaml

Berikan izin ke peran RAM pekerja klaster

Metode ini berlaku untuk klaster ACK terkelola, klaster ACK khusus, dan klaster terdaftar.

  1. Buat kebijakan RAM kustom berdasarkan blok kode berikut. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.

    {
      "Action": [
        "kms:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
    
  2. Lampirkan kebijakan kustom yang dibuat pada langkah sebelumnya ke peran RAM pekerja. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM Pekerja.

Tentukan pasangan AccessKey yang digunakan untuk mengasumsikan peran RAM

Metode ini cocok untuk semua jenis klaster ACK.

  1. Buat peran RAM untuk akun Alibaba Cloud tepercaya sehingga peran RAM dapat digunakan oleh csi-secrets-store-provider-alibabacloud. Untuk informasi lebih lanjut, lihat Buat Peran RAM untuk Akun Alibaba Cloud Tepercaya.

    Catatan

    Pilih Current Account untuk parameter Nama Principal.

  2. Buat kebijakan RAM kustom dan lampirkan kebijakan tersebut ke peran RAM yang Anda buat pada langkah sebelumnya.

    1. Buat kebijakan yang diperlukan untuk mengakses rahasia KMS. Blok kode berikut menunjukkan isi kebijakan tersebut. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.

      {
        "Action": [
          "kms:GetSecretValue",
          "kms:Decrypt"
        ],
        "Resource": [
          "*"
        ],
        "Effect": "Allow"
      }
      
    2. Berikan izin ke peran RAM yang dibuat pada langkah sebelumnya. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM.

  3. Buat kebijakan kustom untuk peran RAM yang dibuat pada langkah sebelumnya dan berikan izin ke pengguna RAM yang ditentukan.

    1. Buat kebijakan kustom untuk peran RAM yang dibuat sebelumnya. Blok kode berikut menunjukkan isi kebijakan tersebut. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.

      {
          "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Resource": "acs:ram:*:<account-id>:role/<role-name>" 
              }
          ],
          "Version": "1"
      }

      Bidang Resource dalam blok kode di atas menentukan ARN peran RAM. Ganti <account-id> dengan akun Alibaba Cloud tempat peran RAM yang Anda buat milik dan <role-name> dengan peran RAM yang Anda buat. Untuk informasi lebih lanjut tentang cara mendapatkan ARN peran RAM, lihat Bagaimana Cara Melihat ARN Peran RAM?

    2. Lampirkan kebijakan tersebut ke pengguna RAM yang ingin Anda gunakan. Dengan cara ini, pengguna RAM dapat mengasumsikan peran RAM. Untuk informasi lebih lanjut tentang cara memberikan izin ke pengguna RAM, lihat Berikan Izin ke Pengguna RAM.

  4. Buat Secret bernama alibaba-credentials di klaster berdasarkan template konfigurasi berikut dan ganti bidang yang ditentukan.

    1. Buat file bernama alibaba-credentials.yaml berdasarkan konten berikut dan ganti bidang yang ditentukan:

      • {rolearn}: Ganti nilainya dengan ARN peran RAM yang dibuat di Langkah 1. ARN harus berupa string yang dikodekan Base64.

      • {ak}: Ganti nilainya dengan ID AccessKey pengguna RAM, yang harus berupa string yang dikodekan Base64.

      • {sk}: Ganti nilainya dengan Rahasia AccessKey pengguna RAM, yang harus berupa string yang dikodekan Base64.

        apiVersion: v1
        data:
          id: {ak}
          secret: {sk}
          rolearn: {rolearn}
        kind: Secret
        metadata:
          name: alibaba-credentials
          namespace: kube-system
        type: Opaque
        
        
    2. Jalankan perintah berikut untuk menerapkan Secret:

      kubectl apply -f alibaba-credentials.yaml

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

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

  2. Di halaman Clusters, temukan klaster yang Anda inginkan dan klik namanya. Di panel navigasi di sebelah kiri, pilih Applications > Helm.

  3. Di halaman Helm, klik Deploy. Di bagian Chart, masukkan csi-secrets-store-provider-alibabacloud. Pertahankan pengaturan default untuk parameter lainnya, lalu klik Next.

    Di kotak dialog yang muncul, pastikan bahwa komponen diinstal di namespace kube-system default dan aplikasi dirilis dengan nama komponen. Jika Anda ingin menentukan nama aplikasi dan namespace kustom, konfigurasikan sesuai petunjuk.

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

    • Jika Anda memilih untuk memberikan izin menggunakan RRSA, atur parameter rrsa.enable ke true untuk mengaktifkan RRSA.image

      Blok kode berikut menunjukkan parameter lainnya:

      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
    • Jika Anda memilih untuk memberikan izin ke peran RAM pekerja klaster, gunakan pengaturan parameter default untuk langsung menginstal csi-secrets-store-provider-alibabacloud.

    • Jika Anda memilih untuk menentukan pasangan AccessKey untuk mengasumsikan peran RAM tertentu, konfigurasikan parameter berikut:

      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
    • Untuk mengaktifkan fitur sinkronisasi rahasia terjadwal, konfigurasikan parameter berikut:image

      • secrets-store-csi-driver.enableSecretRotation: Tentukan apakah akan mengaktifkan fitur rotasi otomatis untuk rahasia. Atur nilainya ke true untuk mengaktifkan fitur rotasi otomatis.

      • secrets-store-csi-driver.rotationPollInterval: Tentukan frekuensi sinkronisasi rahasia. Dalam contoh ini, parameter ini diatur ke 120 detik, yang menentukan bahwa rahasia disinkronkan setiap 2 menit. Sesuaikan nilai sesuai kebutuhan.

    Setelah pembuatan selesai, Anda akan diarahkan ke halaman csi-secrets-store-provider-alibabacloud klaster untuk memeriksa hasil instalasi. Jika semua sumber daya pada gambar berikut dibuat, komponen telah terinstal.image.png

Langkah 3: Konfigurasikan informasi sinkronisasi data

Setelah informasi autentikasi dikonfigurasi, Anda harus mengonfigurasi rahasia KMS dengan menggunakan SecretProviderClass.

Deskripsi template konfigurasi

Blok kode berikut menunjukkan template SecretProviderClass:

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

Bagian parameters biasanya berisi parameter permintaan berikut untuk memasang Kubernetes Secrets.

Parameter

Diperlukan

Deskripsi

objects

Ya

Konfigurasi YAML untuk memasang Kubernetes Secrets. Contoh:

parameters:
    objects: |
        - objectName: "MySecret"

Parameter objects berisi subbidang berikut:

  • objectName: diperlukan. Bidang ini menentukan nama rahasia di Secrets Manager dari KMS. Untuk informasi lebih lanjut, lihat SecretName.

  • objectType: opsional. Anda dapat menggunakan bidang ini untuk menentukan jenis layanan Alibaba Cloud yang akan disinkronkan. Nilai valid: kms dan oos. Nilai default: kms. Anda dapat membiarkan bidang ini kosong jika Anda mengimpor rahasia dari KMS.

  • objectAlias: opsional. Anda dapat menggunakan bidang ini untuk menentukan nama file yang dipasang ke pod. Jika Anda tidak menentukan bidang ini, nilai objectName digunakan secara default.

  • objectVersion: opsional. Bidang ini sesuai dengan parameter VersionId di Secrets Manager dari KMS. Parameter VersionId tidak didukung oleh rahasia ApsaraDB RDS, rahasia PolarDB, rahasia ApsaraDB for Redis/Tair, rahasia RAM, dan rahasia ECS.

  • objectVersionLabel: opsional. Bidang ini sesuai dengan parameter VersionStage di Secrets Manager dari KMS. Anda hanya dapat menanyakan nilai rahasia yang label tahapnya adalah ACSPrevious atau ACSCurrent untuk rahasia RAM, rahasia ApsaraDB RDS, rahasia PolarDB, rahasia ApsaraDB for Redis, rahasia Tair, dan rahasia Elastic Compute Service (ECS).

  • jmesPath: opsional. Bidang ini digunakan untuk mengurai pasangan kunci-nilai yang ditentukan dalam rahasia berformat JSON. Misalnya, contoh rahasia uji berikut berisi segmen JSON:

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

    Untuk memasang username dan password sebagai file rahasia secara terpisah, konfigurasikan bidang JMESPath. Saat menggunakan bidang JMESPath, Anda harus menentukan subbidang berikut:

    • path: diperlukan. Bidang ini mendefinisikan item konfigurasi yang ditentukan untuk pengambilan jalur berdasarkan JMESPath.

    • objectAlias: opsional. Bidang ini menentukan nama file yang memasang rahasia ke pod.

  • kmsEndpoint: opsional. Bidang ini menentukan alamat titik akhir untuk permintaan layanan KMS. Saat tidak dikonfigurasi, titik akhir default digunakan. Anda dapat mengonfigurasinya sebagai gateway bersama atau gateway khusus untuk KMS. Konfigurasi ini diterapkan pada tingkat kredensial, artinya setiap kredensial dapat menentukan alamat titik akhir yang berbeda. Untuk informasi lebih lanjut, lihat deskripsi kmsEndpoint.

region

Tidak

Kirim permintaan ke server Secrets Manager di wilayah yang ditentukan. Jika Anda tidak menentukan parameter ini, wilayah node saat ini dipilih. Ini mungkin meningkatkan overhead kinerja jika aplikasi Anda berjalan di sejumlah besar pod. Oleh karena itu, kami sarankan agar Anda mengonfigurasi parameter ini untuk menentukan wilayah.

pathTranslation

Tidak

  • Pemisah jalur substitusi untuk digunakan jika nama file rahasia yang akan dipasang di Secrets Manager berisi pemisah jalur. Misalnya, My/Path/Secret dipasang sebagai My_Path_Secret.

  • Jika Anda tidak menentukan parameter ini, pemisah jalur untuk penggantian adalah garis bawah (_).

  • Untuk menonaktifkan penggantian pemisah jalur, atur parameter ke "False".

Contoh konfigurasi

Contoh ini menunjukkan cara menggunakan SecretProviderClass untuk mengimpor rahasia test dari KMS ke aplikasi di klaster ACK terkelola di wilayah yang sama.

  1. Buat file bernama secretstore.yaml dan tambahkan konten berikut ke file untuk mendefinisikan SecretProviderClass:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: test
    spec:
      provider: alibabacloud   # Atur nilainya menjadi alibabacloud.
      parameters:
        objects: | # Parameter objectType dapat diatur ke oos atau kms. Nilai default: kms.
          - objectName: "test-hangzhou"
            objectType: "kms"
            objectAlias: "hangzhou-public"
            kmsEndpoint:  "kms.{region}.aliyuncs.com"
  2. Jalankan perintah berikut untuk menerapkan SecretProviderClass:

    kubectl apply -f secretstore.yaml
  3. Buat file bernama deploy.yaml dan tambahkan konten berikut ke file tersebut.

    Deployment NGINX termasuk, yang mendeklarasikan SecretProviderClass yang dibuat dalam contoh sebelumnya dengan menggunakan volume CSI Inline. Rahasia dipasang di direktori /mnt/secrets-store pod. Untuk informasi lebih lanjut tentang Deployment, lihat contoh Deployment.

    apiVersion: apps/v1  # Jika versi API lebih lama 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 nilai ini dengan gambar aktual.
              ports:
                - containerPort: 80
              resources:
                limits:
                  cpu: "500m"
              volumeMounts:
                - name: secrets-store-inline
                  mountPath: "/mnt/secrets-store"
                  readOnly: true
  4. Jalankan perintah berikut untuk menerapkan Deployment:

    kubectl apply -f deploy.yaml
  5. Verifikasi bahwa rahasia telah dipasang.

    Masuk ke pod, periksa apakah rahasia yang ditentukan dalam SecretProviderClass dibuat di target pemasangan /mnt/secrets-store, dan kemudian periksa apakah rahasia tersebut berisi teks sandi yang sesuai yang disimpan di KMS.

Deskripsi kmsEndpoint

Anda dapat memperoleh rahasia KMS melalui gateway khusus atau gateway bersama. Sebelum mengakses gateway, konfigurasikan titik akhir KMS berdasarkan tabel berikut. Untuk informasi lebih lanjut tentang perbedaan antara akses melalui gateway khusus dan akses melalui gateway bersama, lihat Perbedaan antara Gateway Bersama dan Gateway Khusus untuk Mengakses KMS.

Titik Akhir KMS

Jenis Gateway

Jenis Domain

Titik Akhir

Deskripsi

Gateway Khusus

Domain Pribadi KMS

{kms-instance-id}.cryptoservice.kms.aliyuncs.com

  • Instansi rahasia KMS dan klaster berada di wilayah dan virtual private cloud (VPC) yang sama.

  • Ganti {kms-instance-id} dengan ID instansi rahasia KMS.

  • Versi instansi rahasia KMS harus 3.0 atau lebih baru.

Gateway Bersama

Domain VPC

kms-vpc.{region}.aliyuncs.com

  • Rahasia KMS dan klaster berada di wilayah yang sama.

  • Ganti {region} dengan wilayah tempat rahasia KMS berada.

  • Alamat ini dapat digunakan dengan konfigurasi default tanpa pengaturan tambahan.

Gateway Bersama

Domain Publik

kms.{region}.aliyuncs.com

  • Ganti {region} dengan wilayah tempat rahasia KMS berada.

  • Klaster dapat mengakses jaringan publik.

Contoh Konfigurasi Titik Akhir KMS

{region}kmsEndpoint{kms-instance-id}{region}apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test
spec:
  provider: alibabacloud # Atur nilainya menjadi alibabacloud.
  parameters:
    # objects: Contoh penggunaan gateway KMS
    # hangzhou-public: Menggunakan titik akhir publik gateway bersama. Ganti <code data-tag="code" id="0c3242c29695n">{region}

Referensi