ack-secret-manager menyinkronkan rahasia dari Key Management Service (KMS) ke kluster Container Service for Kubernetes (ACK) Anda sebagai Kubernetes Secrets. Aplikasi memasang Secrets ini melalui sistem file untuk mengakses kredensial KMS terbaru tanpa perlu mengelolanya secara langsung.
Cara kerja
Proses sinkronisasi didorong oleh dua definisi sumber daya kustom (CRD):
SecretStore — mendefinisikan cara ack-secret-manager melakukan autentikasi ke KMS
ExternalSecret — mendefinisikan rahasia KMS yang akan disinkronkan dan lokasi penyimpanannya di dalam kluster
Saat memproses ExternalSecret, ack-secret-manager membaca SecretStore yang dirujuk untuk mendapatkan kredensial autentikasi, mengambil rahasia KMS yang ditentukan, lalu membuat atau memperbarui Kubernetes Secret dengan nama dan namespace yang sama dengan ExternalSecret tersebut.
Pertimbangan keamanan
Sebelum mengaktifkan sinkronisasi rahasia, evaluasi risiko berikut:
Traversal sistem file: Rahasia yang dipasang melalui sistem file dapat terekspos jika penyerang mengeksploitasi kerentanan CVE untuk menjelajahi direktori kluster.
Eksposur log dan debug: Breakpoint debug yang salah konfigurasi atau akses log yang terlalu permisif dapat membocorkan Secrets. Hindari merujuk Secrets melalui variabel lingkungan.
Izin berlebihan: Terapkan prinsip hak istimewa minimal saat memberikan akses ack-secret-manager ke KMS.
Jika aplikasi Anda tidak perlu menyimpan rahasia secara lokal, berikan izin minimal kepada pod melalui RRSA dan panggil GetSecretValue langsung dari aplikasi. Pendekatan ini menghindari eksposur rahasia di sistem file pod atau Kubernetes Secrets.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster ACK yang dibuat di wilayah yang sama dengan rahasia KMS yang ingin Anda sinkronkan. Jenis kluster yang didukung:
Langkah 1: Instal ack-secret-manager
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster target. Di panel navigasi kiri, pilih Applications > Helm.
Pada halaman Helm, klik Deploy. Di bagian Chart pada panel Deploy, temukan dan pilih ack-secret-manager, lalu klik Next. Pada dialog Confirm, chart akan diinstal ke namespace
kube-systemsecara default. Klik Yes untuk melanjutkan. Untuk menggunakan namespace kustom, konfigurasikan Application Name dan Namespace pada langkah Basic Information.Pada langkah Parameters, pilih versi chart terbaru dan konfigurasikan parameter berikut sesuai kebutuhan, lalu klik OK. RRSA authentication (disarankan): Atur
rrsa.enableketrueuntuk mengaktifkan RAM Roles for Service Accounts (RRSA). Ini memungkinkan ack-secret-manager melakukan autentikasi menggunakan identitas akun layanan tanpa mengelola pasangan AccessKey. Sinkronisasi terjadwal: Konfigurasikan parameter berikut untuk mengaktifkan sinkronisasi rahasia periodik. Pembatasan kecepatan (untuk kluster dengan banyak ExternalSecret): Aturcommand.maxConcurrentKmsSecretPullsuntuk membatasi jumlah maksimum permintaan rahasia KMS secara bersamaan per detik. Nilai default adalah10. Tanpa batasan ini, jumlah besar ExternalSecret dapat memicu pembatasan kecepatan di sisi KMS atau RAM. Titik akhir KMS: Aturcommand.kmsEndpointuntuk menentukan titik akhir KMS global bagi semua permintaan rahasia. Ini merupakan konfigurasi global; Anda juga dapat mengonfigurasi titik akhir pada tingkat rahasia individual. Untuk detailnya, lihat Konfigurasi alamat titik akhir KMS.Parameter Deskripsi command.disablePollingApakah polling periodik dinonaktifkan. Atur ke falseuntuk mengaktifkan sinkronisasi periodik.command.pollingIntervalFrekuensi sinkronisasi. Misalnya, 120smenyinkronkan rahasia setiap 2 menit.



Setelah instalasi, Konsol ACK akan mengarahkan Anda ke halaman ack-secret-manager. Verifikasi instalasi dengan memeriksa apakah sumber daya yang diharapkan telah dibuat.

Langkah 2: Otorisasi ack-secret-manager untuk mengakses KMS
Buat SecretStore untuk mendefinisikan cara ack-secret-manager melakukan autentikasi ke KMS. Tanpa SecretStore, ack-secret-manager tidak dapat menyinkronkan rahasia dari KMS.
Pilih metode otorisasi berdasarkan jenis kluster Anda:
| Metode | Jenis kluster yang berlaku | Keunggulan utama |
|---|---|---|
| RRSA (disarankan) | Kluster ACK yang dikelola, kluster ACK Serverless (Kubernetes 1.22+) | Tidak perlu mengelola pasangan AccessKey |
| Peran RAM Worker | Kluster ACK yang dikelola, kluster khusus ACK, kluster terdaftar | Penyiapan sederhana; tidak memerlukan kredensial tambahan |
| Pasangan AccessKey | Semua jenis kluster | Berlaku universal |
Gunakan RRSA untuk memberikan izin
RRSA memungkinkan kontrol izin tingkat pod tanpa pasangan AccessKey. Metode ini berlaku untuk kluster ACK yang dikelola dan kluster ACK Serverless yang menjalankan Kubernetes 1.22 atau lebih baru.
Aktifkan RRSA untuk kluster ACK di Konsol ACK. Tindakan ini membuat penyedia identitas OpenID Connect (OIDC) untuk kluster tersebut. Untuk detailnya, lihat Aktifkan RRSA.
Buat peran RAM dengan IdP sebagai entitas tepercaya. Atur Principal Type ke Identity provider dan konfigurasikan parameter berikut. Untuk detailnya, lihat Buat peran RAM untuk OIDC IdP.
Parameter Nilai Identity provider type Pilih OIDC Identity provider Pilih ack-rrsa-<cluster_id>, dengan<cluster_id>sebagai ID kluster AndaCondition — oidc:iss Pertahankan nilai default Condition — oidc:aud Pertahankan nilai default Condition — oidc:sub Tambahkan secara manual: Key = oidc:sub, Operator =StringEquals, Value =system:serviceaccount:<namespace>:<serviceAccountName>. Contoh:system:serviceaccount:kube-system:ack-secret-manager. Jika Anda menginstal ack-secret-manager di namespace selainkube-system, gunakan namespace aktual.Buat kebijakan RAM kustom yang memberikan akses ke rahasia KMS, lalu sambungkan ke peran RAM tersebut.
Buat kebijakan kustom dengan konten berikut. Untuk detailnya, lihat Buat kebijakan kustom. ``
json { "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }``Sambungkan kebijakan tersebut ke peran RAM. Untuk detailnya, lihat Berikan izin ke peran RAM.
Buat SecretStore menggunakan RRSA.
Buat file bernama
secretstore-rrsa.yamldengan konten berikut. Ganti placeholder seperti yang dijelaskan.Placeholder Deskripsi {accountID}ID akun Alibaba Cloud yang digunakan untuk menyinkronkan rahasia KMS {clusterID}ID kluster ACK Anda {roleName}Nama peran RAM yang dibuat pada langkah 2 apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-rrsa spec: KMS: KMSAuth: oidcProviderARN: "acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{accountID}:role/{roleName}"Terapkan SecretStore: ``
bash kubectl apply -f secretstore-rrsa.yaml``
Berikan izin ke peran RAM worker
Metode ini berlaku untuk kluster ACK yang dikelola, kluster khusus ACK, dan kluster terdaftar. Metode ini tidak berlaku untuk kluster ACK Serverless karena tidak memiliki peran RAM worker.
Buat kebijakan RAM kustom dengan konten berikut. Untuk detailnya, lihat Buat kebijakan kustom.
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }Sambungkan kebijakan tersebut ke peran RAM worker kluster. Untuk detailnya, lihat Berikan izin ke peran RAM worker.
Saat menggunakan peran RAM worker, Anda dapat menghilangkan field
secretStoreRefpada ExternalSecret.
Tentukan pasangan AccessKey untuk mengasumsikan peran RAM
Metode ini berlaku untuk semua jenis kluster ACK.
Buat peran RAM dengan akun Alibaba Cloud Anda sebagai entitas tepercaya. Untuk detailnya, lihat Buat peran RAM untuk akun Alibaba Cloud tepercaya.
Saat memilih akun Alibaba Cloud tepercaya, pilih Current Account.
Buat kebijakan RAM kustom yang memberikan akses ke rahasia KMS, lalu sambungkan ke peran RAM tersebut.
Buat kebijakan kustom dengan konten berikut. Untuk detailnya, lihat Buat kebijakan kustom. ``
json { "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }``Sambungkan kebijakan tersebut ke peran RAM. Untuk detailnya, lihat Berikan izin ke peran RAM.
Buat kebijakan RAM kustom yang memungkinkan pengguna RAM mengasumsikan peran RAM tersebut, lalu sambungkan ke pengguna RAM.
Buat kebijakan dengan konten berikut. Ganti
<account-id>dengan ID akun Alibaba Cloud pemilik peran RAM, dan ganti<role-name>dengan nama peran RAM. Untuk detail cara 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" }Sambungkan kebijakan tersebut ke pengguna RAM. Untuk detailnya, lihat Berikan izin ke pengguna RAM.
Buat Kubernetes Secret untuk menyimpan pasangan AccessKey pengguna RAM.
Buat file bernama
ramuser.yamldengan konten berikut. Ganti ID AccessKey dan Rahasia AccessKey dengan nilai Base64-nya.apiVersion: v1 data: accessKey: {AccessKey ID encoded in Base64} accessKeySecret: {AccessKey secret encoded in Base64} kind: Secret metadata: name: ramuser namespace: kube-system type: OpaqueTerapkan Secret: ``
bash kubectl apply -f ramuser.yaml``
Buat SecretStore menggunakan pasangan AccessKey.
Buat file bernama
secretstore-ramrole.yamldengan konten berikut. Ganti placeholder seperti yang dijelaskan.Placeholder Deskripsi {accountID}ID akun Alibaba Cloud yang digunakan untuk menyinkronkan rahasia KMS {roleName}Nama peran RAM yang dibuat pada langkah 1 {secretName}Nama Kubernetes Secret yang menyimpan pasangan AccessKey {secretNamespace}Namespace Kubernetes Secret {secretKey}Kunci di Kubernetes Secret yang menyimpan nilai AccessKey {roleSessionName}Nama sesi peran — string kustom apa pun apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-ramrole spec: KMS: KMSAuth: accessKey: name: {secretName} namespace: {secretNamespace} key: {secretKey} accessKeySecret: name: {secretName} namespace: {secretNamespace} key: {secretKey} ramRoleARN: "acs:ram::{accountID}:role/{roleName}" ramRoleSessionName: {roleSessionName}Terapkan SecretStore: ``
bash kubectl apply -f secretstore-ramrole.yaml``
Langkah 3: Sinkronkan rahasia KMS ke kluster
Buat ExternalSecret untuk menentukan rahasia KMS yang akan disinkronkan. ack-secret-manager membuat Kubernetes Secret dengan nama dan namespace yang sama dengan ExternalSecret tersebut.
Namespace dan nama Kubernetes Secret yang dihasilkan persis sama dengan ExternalSecret.
Buat file bernama
external.yamldengan konten berikut. Ganti placeholder seperti yang dijelaskan.Placeholder Deskripsi {KMS secret name}Wajib. Nama rahasia KMS yang akan disinkronkan. {Kubernetes secret key}Wajib. Nama kunci di Kubernetes Secret tempat nilai rahasia KMS disimpan. {KMS secret version stage}Opsional. Label tahap versi rahasia KMS, seperti ACSCurrent. Untuk menggunakan ID versi, gantiversionStagedenganversionId. Rahasia RDS, PolarDB, Redis/Tair, RAM, dan ECS hanya mendukungACSPreviousdanACSCurrentserta mengabaikanversionId. Untuk detailnya, lihat Elemen rahasia.{KMS Service endpoint address}Opsional. Titik akhir permintaan KMS. Menggantikan konfigurasi titik akhir global dan default. Untuk format titik akhir yang didukung, lihat Konfigurasi alamat titik akhir KMS. {secret store name}Opsional. Nama SecretStore yang dibuat pada langkah 2. Tidak diperlukan saat menggunakan peran RAM worker. {secret store namespace}Opsional. Namespace SecretStore. Tidak diperlukan saat menggunakan peran RAM worker. apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: esdemo spec: provider: kms # Sinkronkan dari KMS. Dapat dihilangkan atau diatur ke kms. data: - key: {KMS secret name} name: {Kubernetes secret key} versionStage: {KMS secret version stage} kmsEndpoint: {KMS Service endpoint address} secretStoreRef: # Hilangkan saat menggunakan peran RAM worker. name: {secret store name} namespace: {secret store namespace}Terapkan ExternalSecret:
kubectl apply -f external.yamlJalankan perintah berikut untuk memeriksa apakah Kubernetes Secret sudah ada:
kubectl get secret esdemoJika Kubernetes Secret sudah ada, rahasia KMS telah disinkronkan dari KMS ke kluster Anda.
Konfigurasi lanjutan
Sinkronkan rahasia KMS lintas akun Alibaba Cloud
Gunakan konfigurasi ini ketika instans KMS dimiliki oleh satu akun Alibaba Cloud (Akun A) tetapi kluster ACK dimiliki oleh akun lain (Akun B). ack-secret-manager menggunakan RRSA untuk mengasumsikan peran RAM di Akun A melalui penyedia identitas OIDC di Akun B, lalu mengimpor rahasia KMS ke kluster.
Konfigurasi izin untuk Akun A
Gunakan Akun A untuk membuat peran RAM dengan Akun B sebagai entitas tepercaya. Pilih Other Account dan masukkan ID Akun B. Untuk detailnya, lihat Buat peran RAM untuk akun Alibaba Cloud tepercaya.
Buat kebijakan RAM kustom yang memberikan akses ke rahasia KMS:
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }Sambungkan kebijakan tersebut ke peran RAM. Untuk detailnya, lihat Berikan izin ke peran RAM.
Konfigurasi izin untuk Akun B
Aktifkan RRSA untuk kluster ACK di Konsol ACK. Saat menginstal ack-secret-manager, atur
rrsa.enableketrue. Untuk detailnya, lihat Aktifkan RRSA.Buat peran RAM di Akun B dengan OIDC IdP sebagai entitas tepercaya. Atur Principal Type ke Identity provider dan konfigurasikan parameter berikut. Untuk detailnya, lihat Buat peran RAM untuk OIDC IdP.
Parameter Nilai Identity provider type Pilih OIDC Identity provider Pilih ack-rrsa-<cluster_id>, dengan<cluster_id>sebagai ID kluster AndaCondition — oidc:iss Pertahankan nilai default Condition — oidc:aud Pertahankan nilai default Condition — oidc:sub Tambahkan secara manual: Key = oidc:sub, Operator =StringEquals, Value =system:serviceaccount:kube-system:ack-secret-managerBuat kebijakan RAM kustom di Akun B yang memungkinkan mengasumsikan peran RAM di Akun A, lalu sambungkan ke peran RAM Akun B.
Buat kebijakan dengan konten berikut. Ganti
<account-id>dengan ID Akun A dan<role-name>dengan peran RAM yang dibuat di Akun A. Untuk detail cara menemukan ARN, lihat Bagaimana cara melihat ARN peran RAM?{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Resource": "acs:ram:*:<account-id>:role/<role-name>" } ], "Version": "1" }Sambungkan kebijakan tersebut ke peran RAM yang dibuat di Akun B.
Buat SecretStore untuk akses lintas akun.
Buat file bernama
secretstore-ramrole.yamldengan konten berikut. Ganti placeholder seperti yang dijelaskan.Placeholder Deskripsi {ACK-accountID}ID Akun B (akun yang memiliki kluster ACK) {clusterID}ID kluster ACK Anda {ACK-roleName}Nama peran RAM yang dibuat di Akun B {KMS-accountID}ID Akun A (akun yang memiliki instans KMS) {KMS-roleName}Nama peran RAM yang dibuat di Akun A {roleSessionName}Nama sesi peran — string kustom apa pun apiVersion: 'alibabacloud.com/v1alpha1' kind: SecretStore metadata: name: scdemo-cross-account spec: KMS: KMSAuth: oidcProviderARN: "acs:ram::{ACK-accountID}:oidc-provider/ack-rrsa-{clusterID}" ramRoleARN: "acs:ram::{ACK-accountID}:role/{ACK-roleName}" remoteRamRoleARN: "acs:ram::{KMS-accountID}:role/{KMS-roleName}" remoteRamRoleSessionName: {roleSessionName}
Buat ExternalSecret untuk menentukan detail sinkronisasi. Untuk detailnya, lihat Langkah 3: Sinkronkan rahasia KMS ke kluster.
Uraikan rahasia JSON dan YAML
Ekstrak bidang tertentu dari rahasia JSON
Gunakan jmesPath untuk mengekstrak pasangan kunci-nilai tertentu dari rahasia KMS yang disimpan dalam format JSON.
Sebagai contoh, diberikan rahasia JSON berikut yang disimpan di KMS Secrets Manager:
{"name":"tom","friends":[{"name":"lily"},{"name":"mark"}]}Buat ExternalSecret dengan jmesPath untuk mengekstrak bidang tertentu:
path: Ekspresi JMESPath untuk mengekstrak bidang. Wajib. Lihat spesifikasi JMESPath.objectAlias: Nama kunci di Kubernetes Secret hasil.
apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: es-json-demo
spec:
provider: kms
data:
- key: {KMS secret name}
versionStage: {KMS secret version stage}
secretStoreRef:
name: {secret store name}
namespace: {secret store namespace}
jmesPath:
- path: "name" # Mengekstrak: "tom"
objectAlias: "myname"
- path: "friends[0].name" # Mengekstrak: "lily"
objectAlias: "friendname"Uraikan otomatis rahasia JSON
Jika struktur JSON tidak diketahui atau bervariasi, gunakan dataProcess.extract untuk secara otomatis mengurai semua pasangan kunci-nilai dari rahasia JSON. Gunakan dataProcess.replaceRule untuk mengganti nama kunci yang tidak sesuai dengan persyaratan penamaan kunci Kubernetes Secret.
Sebagai contoh, diberikan rahasia JSON berikut dengan nama kunci yang tidak sesuai:
{"/name-invalid":"lily","name-invalid/":[{"name":"mark"}]}apiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: extract-secret
spec:
provider: kms
dataProcess:
- extract:
key: {KMS secret name}
versionStage: ACSCurrent
secretStoreRef:
name: {secret store name}
namespace: {secret store namespace}
replaceRule:
- source: "^/.*d$" # Kunci yang dimulai dengan / dan diakhiri d -> "tom"
target: "tom"
- source: "^n.*/$" # Kunci yang dimulai dengan n dan diakhiri / -> "mark"
target: "mark"Ekstrak bidang tertentu dari rahasia YAML
Gunakan jmesPath untuk mengekstrak pasangan kunci-nilai tertentu dari rahasia KMS yang disimpan dalam format YAML.
Sebagai contoh, diberikan rahasia YAML berikut yang disimpan di KMS Secrets Manager:
name: tom
friends:
- name: lily
- name: markapiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: es-yaml-demo
spec:
provider: kms
data:
- key: {KMS secret name}
versionStage: {KMS secret version stage}
secretStoreRef:
name: {secret store name}
namespace: {secret store namespace}
jmesPath:
- path: "name" # Mengekstrak: "tom"
objectAlias: "myname"
- path: "friends[0].name" # Mengekstrak: "lily"
objectAlias: "friendname"Uraikan otomatis rahasia YAML
Jika struktur YAML tidak diketahui atau bervariasi, gunakan dataProcess.extract untuk mengurai otomatis semua pasangan kunci-nilai. Gunakan dataProcess.replaceRule untuk menangani nama kunci yang tidak sesuai.
Sebagai contoh, diberikan rahasia YAML berikut:
/name-invalid: lily
name-invalid/:
- name: markapiVersion: 'alibabacloud.com/v1alpha1'
kind: ExternalSecret
metadata:
name: extract-secret
spec:
provider: kms
dataProcess:
- extract:
key: {KMS secret name}
versionStage: ACSCurrent
secretStoreRef:
name: {secret store name}
namespace: {secret store namespace}
replaceRule:
- source: "^/.*d$" # Kunci yang dimulai dengan / dan diakhiri d -> "tom"
target: "tom"
- source: "^n.*/$" # Kunci yang dimulai dengan n dan diakhiri / -> "mark"
target: "mark"Konfigurasi alamat titik akhir KMS
ack-secret-manager menyelesaikan titik akhir KMS menggunakan urutan prioritas berikut:
| Jenis | Field | Prioritas | Deskripsi |
|---|---|---|---|
| Tingkat rahasia | ExternalSecret.spec.data.kmsEndpoint | Tertinggi | Berlaku untuk rahasia tertentu; menggantikan konfigurasi global dan default. |
| Global | command.kmsEndpoint (parameter startup) | Sedang | Berlaku untuk semua permintaan KMS yang tidak memiliki titik akhir tingkat rahasia. |
| Default | Tidak ada | Terendah | Menggunakan kms-vpc.{region}.aliyuncs.com, dengan {region} sebagai wilayah rahasia KMS. |
Contoh berikut menunjukkan bagaimana titik akhir tingkat rahasia dan global saling berinteraksi:
apiVersion: "alibabacloud.com/v1alpha1"
kind: ExternalSecret
metadata:
name: esdemo
spec:
provider: kms
data:
- key: test-hangzhou
name: hangzhou-vpc
versionId: v1
# Tidak ada kmsEndpoint: menggunakan konfigurasi global jika diatur, jika tidak menggunakan kms-vpc.{region}.aliyuncs.com
- key: test-hangzhou
name: hangzhou-public
versionId: v1
kmsEndpoint: kms.cn-hangzhou.aliyuncs.com # Menggantikan global dan defaultFormat titik akhir yang didukung:
| Jenis gateway | Jenis domain | Format titik akhir | Persyaratan |
|---|---|---|---|
| Gateway khusus | Domain privat KMS | {kms-instance-id}.cryptoservice.kms.aliyuncs.com | Instans rahasia KMS dan kluster berada di wilayah dan VPC yang sama. Versi instans KMS 3.0 atau lebih baru. |
| Gateway bersama | Domain VPC | kms-vpc.{region}.aliyuncs.com | Rahasia KMS dan kluster berada di wilayah yang sama. Ini adalah titik akhir default. |
| Gateway bersama | Domain publik | kms.{region}.aliyuncs.com | Kluster dapat mengakses internet publik. |
Untuk informasi lebih lanjut, lihat Perbedaan antara gateway bersama dan khusus untuk mengakses KMS.
Langkah selanjutnya
Untuk melindungi Kubernetes Secrets yang disinkronkan dari KMS dan disimpan di etcd, aktifkan enkripsi Secret. Untuk detailnya, lihat Gunakan KMS untuk mengenkripsi Kubernetes Secrets.