Impor kredensial KMS sebagai Kubernetes Secrets atau pasang melalui CSI inline volumes dengan csi-secrets-store-provider-alibabacloud, yang juga mendukung rotasi rahasia otomatis.
Risiko keamanan
Interaksi langsung antara workload yang membaca rahasia dari sistem file dan Secrets Manager dapat menyebabkan masalah kompatibilitas. csi-secrets-store-provider-alibabacloud mengatasi hal ini dan mendukung sinkronisasi rahasia ke objek Kubernetes Secret untuk digunakan sebagai variabel lingkungan. Evaluasi risiko keamanan berikut sebelum melanjutkan.
Jika kunci dapat diakses dalam sistem file, kerentanan pada aplikasi dapat menimbulkan ancaman penelusuran direktori, yang berpotensi mengekspos informasi sensitif.
Titik akhir debug atau izin log yang salah konfigurasi dapat mengekspos kunci. Oleh karena itu, mengakses kunci dengan memasangnya sebagai referensi dalam variabel lingkungan tidak aman dan tidak disarankan.
Saat Anda mengaktifkan fitur sinkronisasi instans Secret, Anda harus mengontrol ketat izin akses berdasarkan prinsip hak istimewa minimal.
Karena alasan tersebut, jika aplikasi Anda tidak memerlukan penyimpanan persisten untuk ciphertext, kami menyarankan Anda untuk Menggunakan RRSA untuk kontrol akses tingkat pod mengonfigurasi izin minimum tingkat pod untuk aplikasi dan GetSecretValue memperoleh kredensial kunci secara langsung dalam aplikasi guna mengurangi risiko eksposur konten kunci di sistem file pod atau Kubernetes Secrets.
Prasyarat
Buat kluster ACK yang memenuhi persyaratan berikut (lihat Buat kluster ACK yang dikelola atau Buat kluster terdaftar ACK One).
Kluster menjalankan Kubernetes 1.20 atau lebih baru. Jenis kluster yang didukung mencakup kluster ACK yang dikelola, kluster khusus ACK, kluster ACK Edge, dan kluster terdaftar ACK One. Kluster ACK Serverless tidak didukung.
Langkah 1: Konfigurasikan autentikasi add-on
Konfigurasikan autentikasi untuk csi-secrets-store-provider-alibabacloud agar dapat mengambil kredensial dari KMS. Tanpa autentikasi, csi-secrets-store-provider-alibabacloud tidak dapat mengimpor atau menyinkronkan kredensial ke kluster. Pilih salah satu metode otorisasi berikut berdasarkan jenis kluster Anda.
Berikan izin menggunakan RRSA: Metode ini berlaku untuk kluster ACK yang dikelola yang menjalankan Kubernetes 1.22 atau lebih baru.
Berikan izin ke peran RAM worker kluster: Metode ini berlaku untuk kluster ACK yang dikelola, kluster khusus ACK, dan kluster terdaftar ACK One.
Tentukan ID AccessKey dan rahasia untuk mengasumsikan peran RAM tertentu: Metode ini berlaku untuk semua kluster ACK.
Berikan izin dengan RRSA
Dibandingkan metode otorisasi lainnya, otorisasi RRSA menyediakan isolasi izin tingkat pod dan menghindari risiko kebocoran kredensial akibat penggunaan AK/SK secara langsung.
Aktifkan fitur RRSA untuk kluster Anda di Konsol ACK. RRSA menggunakan informasi penyedia identitas yang ditentukan saat kluster dibuat.
Untuk menggunakan csi-secrets-store-provider-alibabacloud, buat peran RAM dengan penyedia identitas OIDC sebagai entitas tepercaya. Parameter utama ditunjukkan dalam tabel berikut.
Parameter
Deskripsi
IdP Type
Pilih OIDC.
Identity Provider
Pilih ack-rrsa-<cluster_id>. Ganti <cluster_id> dengan ID kluster Anda.
Condition
oidc:iss: Pertahankan nilai default.
oidc:aud: Pertahankan nilai default.
oidc:sub: Tambahkan kondisi ini.
Kunci: Pilih oidc:sub.
Operator: Pilih StringEquals.
Nilai: Masukkan
system:serviceaccount:<namespace>:<serviceAccountName>. Ganti<namespace>dengan namespace aplikasi dan<serviceAccountName>dengan nama akun layanan. Untuk topik ini, gunakansystem:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud.CatatanKami menyarankan Anda menginstal komponen di namespace default
kube-system. Jika Anda menginstal csi-secrets-store-provider-alibabacloud di namespace berbeda, gantikube-systemdengan nama namespace tersebut.
Buat kebijakan kustom dan berikan izin ke peran RAM dari langkah sebelumnya.
Buat kebijakan izin untuk csi-secrets-store-provider-alibabacloud agar dapat mengimpor kredensial KMS (lihat Buat kebijakan kustom). Konten kebijakan:
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }Berikan izin ke peran RAM dari langkah sebelumnya. Lihat Kelola izin untuk peran RAM.
Buat Kubernetes Secret bernama
alibaba-credentialsdi kluster. Ganti nilai placeholder.Buat file bernama secretstore-rrsa.yaml dengan konten berikut. Ganti placeholder dengan nilai aktual Anda.
{rolearn}: ARN peran RAM yang telah dikodekan Base64, dibuat di langkah 2.{oidcproviderarn}: ARN penyedia OIDC yang telah dikodekan Base64, dihasilkan setelah mengaktifkan RRSA.
apiVersion: v1 data: rolearn: {rolearn} oidcproviderarn: {oidcproviderarn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: OpaqueTerapkan Kubernetes Secret:
kubectl apply -f secretstore-rrsa.yaml
Melalui peran RAM worker
Berlaku untuk kluster ACK yang dikelola, kluster khusus ACK, dan kluster terdaftar ACK One.
Buat kebijakan kustom (lihat Buat kebijakan kustom). Konten kebijakan:
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }Sambungkan kebijakan kustom ke peran RAM worker. Lihat Berikan izin ke peran RAM worker.
Melalui AccessKey
Berlaku untuk semua kluster ACK.
Buat peran RAM untuk akun Alibaba Cloud tepercaya. Lihat Buat peran RAM untuk akun Alibaba Cloud.
CatatanUntuk entitas tepercaya, pilih Current Account.
Buat kebijakan kustom dan berikan izin ke peran RAM dari langkah sebelumnya.
Buat kebijakan izin untuk akses kredensial KMS (lihat Buat kebijakan kustom). Konten kebijakan:
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }Berikan izin ke peran RAM dari langkah sebelumnya. Lihat Kelola izin untuk peran RAM.
Buat kebijakan kustom untuk mengasumsikan peran sebelumnya, lalu sambungkan ke pengguna RAM.
Buat kebijakan kustom untuk mengasumsikan peran (lihat Buat kebijakan kustom). Konten kebijakan:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram:*:<account-id>:role/<role-name>" } ], "Version": "1" }Dalam kebijakan kustom ini, elemen
Resourcemenentukan ARN peran, di mana<ACCOUNT_ID>adalah ID akun Alibaba Cloud dan<ROLE_NAME>adalah nama peran RAM.Memberikan kebijakan kustom kepada pengguna RAM memungkinkan Anda menentukan peran RAM mana yang dapat diasumsikan oleh pengguna tersebut. Untuk informasi selengkapnya, lihat Kelola izin pengguna RAM.
Buat Kubernetes Secret bernama alibaba-credentials di kluster. Ganti nilai placeholder.
Buat file bernama alibaba-credentials.yaml dengan konten berikut. Ganti placeholder dengan nilai aktual Anda.
{rolearn}: ARN peran RAM yang telah dikodekan Base64 dari langkah 1.{ak}: ID AccessKey pengguna RAM yang telah dikodekan Base64.{sk}: Rahasia AccessKey pengguna RAM yang telah dikodekan Base64.apiVersion: v1 data: id: {ak} secret: {sk} rolearn: {rolearn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque
Terapkan Kubernetes Secret:
kubectl apply -f alibaba-credentials.yaml
Langkah 2: Instal add-on csi-secrets-store-provider-alibabacloud
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
Di halaman Helm, klik Deploy. Cari dan pilih csi-secrets-store-provider-alibabacloud. Pertahankan pengaturan default dan klik Next.
Konfirmasi pengaturan. Add-on diinstal di namespace kube-system default dengan rilis Helm yang dinamai sesuai add-on. Untuk menyesuaikan nama aplikasi atau namespace, konfigurasikan parameter sesuai petunjuk.
Pilih Chart Version terbaru. Di bagian Parameters, konfigurasikan parameter berdasarkan metode autentikasi dari langkah 1. Lalu, klik OK.
Jika Anda memilih Berikan izin dengan RRSA, atur
rrsa.enableke true.
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: oidcproviderarnJika Anda memilih Berikan izin ke peran RAM worker kluster, gunakan pengaturan default.
Jika Anda memilih Tentukan ID AccessKey dan rahasia 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 menyinkronkan rahasia ke objek Kubernetes Secret, konfigurasikan parameter berikut.
syncSecret: enabled: truesecrets-store-csi-driver.syncSecret.enabled: Menyinkronkan rahasia sebagai Kubernetes Secrets. Saattrue, menerapkan Role dan RoleBinding RBAC yang diperlukan. Untuk mengaktifkan rotasi rahasia otomatis, konfigurasikan parameter berikut:

secrets-store-csi-driver.enableSecretRotation: Mengaktifkan rotasi rahasia otomatis. Atur ke true.secrets-store-csi-driver.rotationPollInterval: Interval sinkronisasi rahasia. Contoh: 120s menyinkronkan setiap dua menit. Sesuaikan berdasarkan kebutuhan Anda.
Setelah penerapan, Anda akan dialihkan ke halaman csi-secrets-store-provider-alibabacloud. Verifikasi bahwa semua resource telah dibuat. Di halaman Resources konsol, lihat resource Kubernetes yang dibuat oleh add-on, termasuk secrets-store-csi-driver dan csi-secrets-store-provider-alibabacloud (ServiceAccount), secretproviderclasses-admin-role, secretproviderclasses-viewer-role, dan secretproviderclasses-role (ClusterRole), secretproviderclasses-rolebinding (ClusterRoleBinding), secrets-store-csi-driver dan csi-secrets-store-provider-alibabacloud (DaemonSet), serta secrets-store.csi.k8s.io (CSIDriver).

Langkah 3: Konfigurasikan sinkronisasi data
Setelah mengonfigurasi autentikasi, gunakan SecretProviderClass untuk menentukan kredensial KMS yang akan diimpor.
Templat
SecretProviderClass menggunakan format berikut.
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: <NAME>
spec:
provider: alibabacloud # Nilai ini tetap 'alibabacloud'.
parameters:
objects: |
- objectName: <Nama Parameter Enkripsi KMS> # Nama kredensial KMS.
objectType: kms # Tetap 'kms' saat menyinkronkan kredensial KMS.Field parameters mendukung pengaturan pemasangan berikut:
Parameter | Wajib | Deskripsi |
objects | Ya | Menentukan rahasia yang akan dipasang sebagai array YAML. Contoh: Parameter
|
region | Opsional | Wilayah Secrets Manager. Default ke wilayah node, yang dapat menambah overhead performa pada penerapan skala besar. Tentukan wilayah secara eksplisit. |
pathTranslation | Opsional |
|
Contoh penggunaan
Gunakan SecretProviderClass untuk mengimpor kredensial KMS bernama test dari wilayah yang sama dengan kluster ACK yang dikelola ke dalam workload.
Buat file bernama secretstore.yaml dengan konten berikut.
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: test-secrets spec: provider: alibabacloud # Nilai ini tetap alibabacloud. parameters: objects: | # objectType mendukung oos dan kms. Default adalah kms. - objectName: "test-hangzhou" objectType: "kms" objectAlias: "hangzhou-public" kmsEndpoint: "kms.{region}.aliyuncs.com"Terapkan SecretProviderClass:
kubectl apply -f secretstore.yamlBuat file bernama deploy.yaml dengan konten berikut.
Penyebaran NGINX ini memasang kredensial dari SecretProviderClass sebelumnya melalui CSI inline volume ke
/mnt/secrets-store(Contoh Penyebaran).apiVersion: apps/v1 # Untuk versi sebelum 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 aktual Anda. ports: - containerPort: 80 resources: limits: cpu: "500m" volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: trueTerapkan aplikasi:
kubectl apply -f deploy.yamlVerifikasi bahwa rahasia telah dipasang dengan benar.
Masuk ke Pod dan pastikan file yang sesuai dengan nama rahasia ada di
/mnt/secrets-storedengan konten yang sesuai dengan kredensial KMS.
Sinkronkan kredensial KMS ke Kubernetes Secrets
Secrets Store CSI Driver secara otomatis menyinkronkan rahasia dari layanan eksternal (KMS atau OOS) sebagai objek Kubernetes Secret native, sehingga aplikasi dapat menggunakan rahasia eksternal tanpa perubahan kode.
Metode konfigurasi: SecretProviderClass
Anda dapat menambahkan field opsional secretObjects ke spec resource SecretProviderClass untuk mengaktifkan fitur ini.
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: <NAME>
spec:
provider: alibabacloud # Nilai ini tetap alibabacloud. Jangan ubah.
parameters:
objects: |
- objectName: <Nama Parameter Enkripsi KMS> # Nama kredensial KMS.
objectType: kms # Tetap 'kms' saat menyinkronkan kredensial KMS.
secretObjects:
- secretName: <Nama Kubernetes Secret> # Nama Kubernetes Secret.
type: <Jenis Kubernetes Secret> # Jenis Kubernetes Secret.
data:
- objectName: <parameters.objects.objectName> # Nama dari parameters.objects.objectName. Gunakan alias jika ditentukan.
key: <Kunci Data Kubernetes Secret> # Nama kunci dalam data Kubernetes Secret.secretObjects biasanya mencakup tiga parameter berikut:
|
Parameter |
Jenis |
Deskripsi |
|
secretName |
Wajib |
Nama Kubernetes Secret yang akan dibuat. |
|
type |
Wajib |
Jenis Secret. Nilai valid: |
|
data |
Wajib |
Menentukan cara memetakan rahasia eksternal ke field
|
Siklus hidup sinkronisasi
Sinkronisasi dan pembersihan objek Secret dipicu secara dinamis oleh Pod yang memasang SecretProviderClass terkait:
-
Pembuatan: Kubernetes Secret dibuat hanya ketika Pod pertama yang menggunakan
SecretProviderClassdimulai dan memasang volume. -
Pembaruan: Saat
secrets-store-csi-driver.enableSecretRotationbernilaitrue, Kubernetes Secret diperbarui secara berkala sesuai intervalsecrets-store-csi-driver.rotationPollInterval. Jika tidak, tidak diperbarui. -
Penghapusan: Saat Pod terakhir yang menggunakan
SecretProviderClassdihapus, Kubernetes Secret terkait juga dihapus.
Contoh: Sinkronkan dan suntikkan kredensial
Sinkronkan kredensial KMS ke Kubernetes Secret dan suntikkan sebagai variabel lingkungan ke dalam Pod NGINX.
Buat SecretProviderClass.
Buat file bernama syncSecret.yaml dengan konten berikut.
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: alibabacloud-sync-secret spec: provider: alibabacloud parameters: objects: | - objectName: test-kms objectAlias: secretalias objectType: kms secretObjects: - secretName: test-sync-secret # Nama Kubernetes Secret yang dihasilkan. type: Opaque data: - objectName: secretalias # Sesuai dengan objectName atau objectAlias. key: test # Mengisi kunci data Kubernetes Secret yang dihasilkan.Terapkan SecretProviderClass.
kubectl apply -f syncSecret.yamlBuat Pod aplikasi untuk memicu sinkronisasi.
Buat file
pod-sync-secret.yamldengan konten berikut. Pod ini memasangSecretProviderClasssebelumnya dan mencoba menggunakansecretKeyRefuntuk mereferensikanSecretbernamatest-sync-secretyang akan dihasilkan.kind: Pod apiVersion: v1 metadata: name: pod-sync-secret spec: containers: - name: nginx image: nginx:latest volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true env: - name: SECRET_TEST valueFrom: secretKeyRef: name: test-sync-secret key: test volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "alibabacloud-sync-secret"Terapkan Pod untuk memicu sinkronisasi.
kubectl apply -f pod-sync-secret.yamlVerifikasi hasilnya.
Periksa apakah Kubernetes Secret telah dibuat.
kubectl get secret test-sync-secretOutput perintah menampilkan Kubernetes Secret
test-sync-secret.Periksa apakah variabel lingkungan telah disuntikkan ke dalam Pod.
kubectl exec -it $(kubectl get pods | awk '/pod-sync-secret/{print $1}' | head -1) -- envOutput mencakup
SECRET_TESTdengan nilai yang sesuai dengan rahasia KMS.
Konfigurasi kmsEndpoint
Konfigurasikan titik akhir KMS untuk gateway khusus atau bersama (lihat Perbedaan antara gateway bersama dan khusus).
Alamat titik akhir KMS
Jenis gateway | Jenis domain | Alamat titik akhir | Deskripsi |
Gateway khusus | KMS privat | {kms-instance-id}.cryptoservice.kms.aliyuncs.com |
|
Gateway bersama | VPC | kms-vpc.{region}.aliyuncs.com |
|
Gateway bersama | Publik | kms.{region}.aliyuncs.com |
|
Contoh konfigurasi titik akhir KMS
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: test
spec:
provider: alibabacloud # Tetap 'alibabacloud'
parameters:
# Contoh penggunaan gateway:
# hangzhou-public menggunakan titik akhir publik gateway bersama. Ganti {region} dengan wilayah tempat kredensial KMS berada. Metode ini memungkinkan Anda mengakses kredensial KMS dari wilayah berbeda dengan kluster.
# hangzhou-vpc tidak menentukan field kmsEndpoint dan menggunakan titik akhir VPC default gateway bersama.
# hangzhou-cryptoservice menggunakan gateway khusus. Ganti {kms-instance-id} dengan ID instans KMS.
# london-public menggunakan titik akhir publik gateway bersama. Ganti {region} dengan wilayah tempat kredensial KMS berada. Metode ini memungkinkan Anda mengakses kredensial KMS dari wilayah berbeda dengan kluster.
objects: |
- objectName: "test-hangzhou"
objectType: "kms"
objectAlias: "hangzhou-public"
kmsEndpoint: "kms.{region}.aliyuncs.com"
- objectName: "test-hangzhou"
objectType: "kms"
objectAlias: "hangzhou-vpc"
- objectName: "test-hangzhou"
objectType: "kms"
objectAlias: "hangzhou-cryptoservice"
kmsEndpoint: "{kms-instance-id}.cryptoservice.kms.aliyuncs.com"
- objectName: "test-london"
objectAlias: "london-public"
kmsEndpoint: "kms.{region}.aliyuncs.com"Referensi
Untuk workload kluster ACK Serverless, lihat Gunakan ack-secret-manager untuk mengimpor kredensial layanan KMS Alibaba Cloud.
Untuk melindungi cache rahasia KMS, enkripsi saat diam dengan Alibaba Cloud KMS.