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
Sebuah klaster ACK yang memenuhi persyaratan berikut telah dibuat. Untuk informasi lebih lanjut, lihat Buat Klaster ACK Terkelola dan Buat Klaster Terdaftar ACK One.
Versi Kubernetes klaster harus 1.20 atau lebih baru. Anda dapat menggunakan klaster ACK terkelola, klaster ACK khusus, atau klaster terdaftar. Klaster ACK Serverless tidak didukung.
Klaster dan rahasia KMS harus berada di wilayah yang sama.
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.
Berikan Izin Menggunakan RRSA: Metode ini berlaku untuk klaster ACK terkelola yang menjalankan Kubernetes 1.22 atau lebih baru.
Berikan Izin ke Peran RAM Pekerja Klaster: Metode ini berlaku untuk klaster ACK terkelola, klaster ACK khusus, dan klaster terdaftar.
Tentukan Pasangan AccessKey untuk Mengasumsikan Peran RAM Tertentu: Metode ini berlaku untuk semua jenis klaster ACK.
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.
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.
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, masukkansystem:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud.CatatanKami menyarankan Anda untuk menginstal komponen di namespace default
kube-system. Jika Anda menginstal csi-secrets-store-provider-alibabacloud di namespace lain, gantikube-systemdengan nama namespace tersebut.
Buat kebijakan kustom dan berikan izin ke peran RAM yang dibuat pada langkah sebelumnya.
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" }Berikan izin ke peran RAM yang dibuat pada langkah sebelumnya. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM.
Buat Secret bernama alibaba-credentials di klaster berdasarkan template konfigurasi berikut dan ganti bidang yang ditentukan.
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: OpaqueJalankan 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.
Buat kebijakan RAM kustom berdasarkan blok kode berikut. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }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.
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.
CatatanPilih Current Account untuk parameter Nama Principal.
Buat kebijakan RAM kustom dan lampirkan kebijakan tersebut ke peran RAM yang Anda buat pada langkah sebelumnya.
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" }Berikan izin ke peran RAM yang dibuat pada langkah sebelumnya. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM.
Buat kebijakan kustom untuk peran RAM yang dibuat pada langkah sebelumnya dan berikan izin ke pengguna RAM yang ditentukan.
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
Resourcedalam 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?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.
Buat Secret bernama alibaba-credentials di klaster berdasarkan template konfigurasi berikut dan ganti bidang yang ditentukan.
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
Jalankan perintah berikut untuk menerapkan Secret:
kubectl apply -f alibaba-credentials.yaml
Langkah 2: Instal komponen csi-secrets-store-provider-alibabacloud
Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, klik Clusters.
Di halaman Clusters, temukan klaster yang Anda inginkan dan klik namanya. Di panel navigasi di sebelah kiri, pilih .
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.
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.enableke true untuk mengaktifkan RRSA.
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: oidcproviderarnJika 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: oidcproviderarnUntuk mengaktifkan fitur sinkronisasi rahasia terjadwal, konfigurasikan parameter berikut:

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.

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: Parameter
|
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 |
|
Contoh konfigurasi
Contoh ini menunjukkan cara menggunakan SecretProviderClass untuk mengimpor rahasia test dari KMS ke aplikasi di klaster ACK terkelola di wilayah yang sama.
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"Jalankan perintah berikut untuk menerapkan SecretProviderClass:
kubectl apply -f secretstore.yamlBuat 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-storepod. 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: trueJalankan perintah berikut untuk menerapkan Deployment:
kubectl apply -f deploy.yamlVerifikasi 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 |
|
Gateway Bersama | Domain VPC | kms-vpc.{region}.aliyuncs.com |
|
Gateway Bersama | Domain Publik | kms.{region}.aliyuncs.com |
|
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
Untuk informasi lebih lanjut tentang cara mengimpor rahasia dari KMS ke aplikasi di klaster ACK Serverless, lihat Gunakan ack-secret-manager untuk Mengimpor Rahasia dari KMS.
Untuk melindungi rahasia yang dibaca dari KMS dan disimpan dalam cache di klaster ACK, Anda dapat melakukan enkripsi satu klik. Untuk informasi lebih lanjut, lihat Gunakan KMS untuk Mengenkripsi Kubernetes Secrets.