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.
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 autentikasi | Versi Kubernetes minimum | Jenis kluster yang didukung |
|---|---|---|
| RRSA | 1.22 | Kluster ACK yang dikelola dan kluster ACK Serverless |
| Worker RAM role | 1.20 | Kluster ACK yang dikelola, khusus, dan terdaftar |
| Pasangan AccessKey | 1.20 | Semua 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
Aktifkan RRSA untuk kluster ACK Anda di Konsol ACK. Tindakan ini membuat penyedia identitas OpenID Connect (OIDC) untuk kluster. Lihat Aktifkan RRSA.
Buat peran RAM untuk OIDC IdP dengan kondisi kebijakan kepercayaan berikut. Lihat Buat peran RAM untuk OIDC IdP.
Komponen diinstal di namespace
kube-systemsecara default. Jika Anda menginstal csi-secrets-store-provider-alibabacloud di namespace berbeda, gantikube-systemdengan nama namespace tersebut.Parameter Nilai Identity provider type OIDC Identity provider ack-rrsa-<cluster_id>(ganti<cluster_id>dengan ID kluster Anda)oidc:iss Gunakan nilai default oidc:aud Gunakan nilai default oidc:sub Tambahkan secara manual: key = oidc:sub, operator = StringEquals, value =system:serviceaccount:<namespace>:<serviceAccountName>. Untuk instalasi default, gunakansystem:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloudBuat 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" }Buat Secret bernama
alibaba-credentialsdi namespacekube-system. Buat file bernamasecretstore-rrsa.yamldengan 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: OpaqueTerapkan 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.
Buat kebijakan RAM kustom. Lihat Buat kebijakan kustom.
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }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.
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.
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" }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" }Buat Secret bernama
alibaba-credentialsdi namespacekube-system. Buat file bernamaalibaba-credentials.yamldengan 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: OpaqueTerapkan Secret:
kubectl apply -f alibaba-credentials.yaml
Langkah 2: Instal csi-secrets-store-provider-alibabacloud
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Klik nama kluster Anda. Di panel navigasi kiri, pilih Applications > Helm.
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 defaultkube-systemdan aplikasi dirilis dengan nama komponen tersebut. Jika Anda ingin menggunakan nama aplikasi atau namespace kustom, konfigurasikan sesuai petunjuk.Atur Chart Version ke versi terbaru. Di bagian Parameters, konfigurasikan parameter berdasarkan metode autentikasi yang Anda pilih di Langkah 1:
RRSA: Atur
rrsa.enableketrue. Plugin membacaALICLOUD_ROLE_ARNdanALICLOUD_OIDC_PROVIDER_ARNdari Secretalibaba-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: oidcproviderarnWorker RAM role: Gunakan parameter default. Tidak perlu perubahan.
Pasangan AccessKey: Konfigurasikan
ACCESS_KEY_ID,SECRET_ACCESS_KEY, danALICLOUD_ROLE_ARNuntuk membaca dari Secretalibaba-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:

secrets-store-csi-driver.enableSecretRotation: Atur ketrueuntuk mengaktifkan rotasi otomatis.secrets-store-csi-driver.rotationPollInterval: Interval sinkronisasi dalam detik. Misalnya,120menyinkronkan secret setiap 2 menit.
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:

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 kekms.objectAlias(opsional): Nama file yang digunakan saat memount secret ke pod. Default ke nilaiobjectName.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, hanyaACSPreviousdanACSCurrentyang 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
jmesPathuntuk memountusernamedanpasswordsebagai file terpisah. Setiap entri memerlukan:kmsEndpoint(opsional): Titik akhir KMS untuk secret ini. Diterapkan per secret—setiap secret dalam daftarobjectsdapat 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.
Buat
secretstore.yamldengan 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 AndaTerapkan SecretProviderClass:
kubectl apply -f secretstore.yamlBuat
deploy.yamldengan 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: trueTerapkan Deployment:
kubectl apply -f deploy.yamlVerifikasi 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-publicOutput 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 gerbang | Jenis domain | Titik akhir | Kondisi |
|---|---|---|---|
| Gateway khusus | Domain privat KMS | {kms-instance-id}.cryptoservice.kms.aliyuncs.com | Instans 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 bersama | Domain VPC | kms-vpc.{region}.aliyuncs.com | Secret KMS dan kluster berada di wilayah yang sama. Ganti {region} dengan wilayah secret KMS. Tidak perlu pengaturan tambahan. |
| Gateway bersama | Domain publik | kms.{region}.aliyuncs.com | Kluster 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
Untuk mengimpor secret dari KMS ke kluster ACK Serverless, lihat Gunakan ack-secret-manager untuk mengimpor secret dari KMS.
Untuk mengenkripsi secret yang sudah disimpan di kluster ACK, lihat Gunakan KMS untuk mengenkripsi Kubernetes Secrets.