Saat menjalankan workload terkontainerisasi di Container Service for Kubernetes (ACK), hardcoding AccessKey dalam kode aplikasi menimbulkan risiko keamanan dan menyulitkan rotasi kredensial. Akses cloud-native KMS menghilangkan risiko tersebut dengan menyuntikkan KMS Agent Sidecar ke dalam pod, sehingga aplikasi dapat mengambil kredensial yang dikelola di KMS secara aman melalui permintaan HTTP lokal.
Cara kerja
Fitur akses cloud-native Key Management Service (KMS) menyediakan alur kerja terpandu untuk instalasi dan konfigurasi komponen. Saat sebuah pod di kluster Container Service for Kubernetes (ACK) Anda mengirim permintaan HTTP, KMS Agent—yang secara otomatis disuntikkan ke dalam pod melalui komponen Helm ack-kms-agent-webhook-injector—menerima permintaan tersebut dan melakukan autentikasi menggunakan JWT OpenID Connect (OIDC) atau peran Resource Access Management (RAM). Setelah KMS memverifikasi izin, kredensial dikembalikan melalui Agent. Agent menyimpan cache kredensial secara lokal untuk mengurangi permintaan berulang dan menurunkan latensi pengambilan kredensial.
Prasyarat
Instans KMS telah dibuat, dan kredensial Anda dihosting di instans tersebut. Untuk informasi selengkapnya, lihat Buat dan kelola instans reguler dan Buat dan kelola instans KMS khusus.
Kluster ACK telah dibuat di wilayah yang sama dengan instans KMS Anda. Untuk informasi selengkapnya, lihat Buat kluster ACK yang dikelola dan Buat kluster ACK serverless.
Instal KMS Agent
Aktifkan saat pembuatan kluster
Saat membuat kluster ACK yang dikelola atau kluster ACK Edge, buka langkah Cluster Configurations, perluas Advanced Options (Optional), lalu klik Enable di samping RRSA OIDC.

Aktifkan untuk kluster yang sudah ada
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Klik nama kluster Anda. Di panel navigasi kiri, klik Cluster Information.
Pada tab Basic Information, gulir ke bagian Security and Auditing dan klik Enable di samping RRSA OIDC.

Pada kotak dialog Enable RRSA, klik Confirm. Tunggu hingga status kluster berubah dari Updating menjadi Running. RRSA kini telah diaktifkan.
Langkah 1: Buat namespace dan akun layanan (opsional)
Namespace mempartisi kluster ACK Anda menjadi ruang virtual yang terisolasi secara logis untuk lingkungan berbeda seperti development, testing, dan production. Aplikasi di namespace berbeda tidak dapat mengakses resource satu sama lain secara default. Jika Anda sudah memiliki namespace dan akun layanan untuk aplikasi bisnis Anda, lewati langkah ini.
Buat namespace.
Buat namespace menggunakan file YAML. Contoh berikut menggunakan
app1-namespace.yamluntuk membuat namespace bernamaapp1-dev:apiVersion: v1 kind: Namespace metadata: name: app1-devJalankan perintah berikut untuk membuat namespace:
kubectl apply -f app1-namespace.yamlVerifikasi bahwa namespace telah dibuat. Jika output mencakup
app1-dev, berarti namespace berhasil dibuat.kubectl get namespaces
Buat akun layanan.
Buat akun layanan menggunakan file YAML. Contoh berikut menggunakan
app1-serviceaccount.yamluntuk membuat akun layanan bernamaapp1-servicedi namespaceapp1-devyang telah Anda buat pada langkah sebelumnya:apiVersion: v1 kind: ServiceAccount metadata: name: app1-service namespace: app1-devJalankan perintah berikut untuk membuat akun layanan:
kubectl apply -f app1-serviceaccount.yamlVerifikasi bahwa akun layanan telah dibuat. Jika output mencakup
app1-service, berarti akun layanan berhasil dibuat.kubectl get serviceaccount -n app1-dev
Langkah 2: Konfigurasi izin
Akses cloud-native KMS mendukung dua metode autentikasi berikut.
OpenID Connect (OIDC) direkomendasikan untuk sebagian besar skenario karena konfigurasinya lebih sederhana. Gunakan peran RAM bila Anda perlu menggunakan ulang kebijakan peran RAM yang sudah ada atau memerlukan akses lintas akun.
Metode autentikasi | Fitur |
OIDC (ACK) | Kluster ACK melakukan autentikasi menggunakan JWT standar OpenID Connect (OIDC). Agent secara otomatis memperoleh token akun layanan untuk membuktikan identitas pod kepada KMS. Tidak diperlukan peran RAM, dan konfigurasinya paling sederhana. |
Peran RAM | Mengakses KMS menggunakan kredensial temporary STS dari peran RAM. Metode ini cocok untuk skenario di mana Anda ingin menggunakan ulang pengaturan peran RAM yang sudah ada. |
OIDC (ACK)
Pada panel konfigurasi yang muncul, atur Authentication Method ke OIDC (ACK).
Konfigurasi parameter berikut:
Parameter
Deskripsi
Namespace
Nama namespace tempat pod berada, misalnya
app1-dev.ServiceAccount
Akun layanan yang digunakan oleh pod, misalnya
app1-service.PodNamePrefix
Awalan nama pod. Setelah Anda mengonfigurasi parameter ini, hanya pod yang namanya sesuai dengan awalan tersebut yang diizinkan lolos verifikasi. Jika Anda tidak mengonfigurasi parameter ini, hanya namespace dan akun layanan yang diverifikasi.
Scope
Metode untuk mengakses KMS. Nilai yang valid:
Specified KMS Instance: Mengakses kunci dan kredensial di instans KMS tertentu melalui endpoint instans.
Shared KMS Gateway: Mengakses kredensial melalui endpoint layanan KMS.
Application Access Point Name
Nama kustom titik akses aplikasi (kredensial akses) untuk identifikasi dan manajemen.
Policy Name
Nama kustom kebijakan RAM. Buat kebijakan langsung pada langkah ini tanpa perlu membuatnya terlebih dahulu di Konsol RAM.
RBAC Permissions
Tingkat izin RBAC (Role-Based Access Control), yang menentukan izin operasi kredensial untuk aplikasi.
Jika Specified KMS Instance dipilih untuk scope:
CryptoServiceKeyUser: Mengizinkan penggunaan kunci di instans KMS untuk enkripsi kredensial.
CryptoServiceSecretUser: Mengizinkan penggunaan kredensial di instans KMS dan mendukung API kredensial untuk instans tersebut.
Jika Shared KMS Gateway dipilih untuk scope: Hanya SecretUser yang didukung, yang mengizinkan penggunaan semua kredensial di bawah akun saat ini.
Accessible Resources
Pilih kredensial dan kunci (digunakan untuk enkripsi dan dekripsi kredensial) yang perlu diakses oleh aplikasi.
PentingJika Anda memilih beberapa kredensial dan panjang total nama kredensial melebihi batas, kesalahan "parameter invalid" akan dikembalikan. Dalam kasus ini, gunakan wildcard untuk menentukan kredensial yang diizinkan, misalnya
secret/rds-ibm*, yang mengizinkan akses ke kredensial dengan awalanrds-ibm.Description
Opsi. Deskripsi detail titik akses aplikasi. Panjang maksimum: 8.192 karakter.
Klik OK untuk melanjutkan.
Peran RAM
Dapatkan informasi penyedia identitas.
Klik nama kluster target untuk membuka halaman detail.
Pada tab Basic Information, arahkan kursor ke label Enabled di samping RRSA (RAM Roles for Service Accounts) OIDC pada bagian Security and Auditing untuk melihat informasi URL provider dan ARN.

Buat peran RAM.
Pilih IdP sebagai tipe entitas tepercaya, lalu klik Switch to Editor.
Pada bagian Visual Editor, konfigurasi item berikut:
Konfigurasi dasar
Parameter
Deskripsi
Effect
Pilih Allow.
Action
Biarkan nilai default
sts:AssumeRole.Condition
Tambahkan kondisi dengan kunci
oidc:sub, operatorStringEquals, dan nilaisystem:serviceaccount:<namespace>:<ServiceAccountName>, di mananamespacedanServiceAccountNamesesuai dengan namespace dan akun layanan pod yang menjalankan workload.Konfigurasi principal:
Pilih Identity Provider sebagai Principal, lalu klik Edit di bawahnya.
Pada halaman konfigurasi Identity Provider, konfigurasi parameter berikut dan klik OK.
Parameter
Deskripsi
IdP Type
Pilih OIDC.
Identity Provider
Pilih penyedia identitas yang secara otomatis dibuat oleh kluster ACK setelah RRSA diaktifkan:
ack-rrsa-<cluster_id>.
Setelah konfigurasi selesai, klik OK untuk mengatur nama peran (misalnya,
app1-rrsa), lalu klik OK.
Buat kebijakan dan sambungkan ke peran RAM. Untuk informasi selengkapnya, lihat Buat kebijakan kustom dan Sambungkan kebijakan ke peran RAM.
Klik Create Policy, pilih Script Editor, lalu konfigurasi kebijakan menggunakan contoh berikut.
CatatanPada contoh ini, kebijakan diberi nama
dev-role-for-rrsa-kms-policydan hanya mengizinkan akses ke kredensial dengan tagenv:app1.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GetSecretValue" ], "Resource": "*", "Condition": { "StringEqualsIgnoreCase": { "kms:tag/secret": [ "app1" ] } } } ] }Kembali ke daftar kebijakan, temukan kebijakan target, lalu klik Attach to Identity di kolom Actions.
Pada bagian Principal, pilih peran RAM yang telah Anda buat, lalu klik Confirm.
Langkah 3: Instal ack-kms-agent-webhook-injector
Pada halaman Helm, klik Deploy. Konfigurasi bagian Basic Information, lalu klik Next.
Parameter
Deskripsi
Application Name
Gunakan nama aplikasi default
ack-kms-agent-webhook-injector.Namespace
Gunakan namespace chart default
kube-system. Instal sekali per kluster ACK; tidak perlu menginstal berulang kali.Source
Default: Marketplace. Parameter ini tidak dapat diubah.
Chart
Cari dan pilih
ack-kms-agent-webhook-injector.Saat kotak dialog konfirmasi muncul, verifikasi informasi lalu klik Yes.
Pada halaman Parameters, konfigurasi parameter berdasarkan metode autentikasi yang Anda pilih pada Langkah 2.
OIDC (ACK): Pertahankan konfigurasi default.
Peran RAM: Biarkan
agent.auth.roleArnkosong, dan aturagent.auth.roleArnMappingmenjadi<Namespace>:<ServiceAccountName>:<RAM Role ARN>. Contoh berikut menggunakan data yang dibuat pada Langkah 2:CatatanNamespacedanServiceAccountNamesesuai dengan namespace dan akun layanan pod yang menjalankan workload.RAM Role ARNdapat dilihat di halaman detail peran RAM.agent: auth: roleArn: roleArnMapping: app1-dev:app1-service: acs:ram::190325303126****:role/app1-rrsa
Setelah konfigurasi selesai, klik OK. Anda akan diarahkan ke halaman detail aplikasi.
Langkah 4: Suntikkan Agent Sidecar
Tambahkan anotasi pod: Atur kunci anotasi menjadi
kms-agent-webhook-injector/injectdan nilainya menjaditrue.Beralih ke namespace tempat workload Anda berjalan, lalu tambahkan anotasi pod ke Deployment tersebut.
PentingUntuk metode autentikasi peran RAM, modifikasi konfigurasi YAML Deployment dan atur parameter
ServiceAccountNamemenjadi nama akun layanan pod yang menjalankan workload (misalnya,app1-service). Untuk metode autentikasi OIDC (ACK), tidak diperlukan modifikasi.Buat Deployment baru
Create from Image
Klik Create from Image di atas daftar Deployment lalu konfigurasi parameter.
Saat mengonfigurasi Advanced, buka bagian Labels and Annotations dan tambahkan anotasi pod: masukkan
kms-agent-webhook-injector/injectdi kolom Name dantruedi kolom Value.Klik Create untuk menyelesaikan.
Create from YAML
Klik Create from YAML di atas daftar Deployment.
Edit file YAML dan tambahkan
kms-agent-webhook-injector/inject: "true"di bawahspec.template.metadata.annotations(buat bagian ini jika belum ada).Klik Create untuk menyelesaikan.
Modifikasi Deployment yang sudah ada
Temukan workload target lalu klik Actions > Details.
Pada halaman detail, klik Edit YAML di pojok kanan atas.
Tambahkan
kms-agent-webhook-injector/inject: "true"di bawahspec.template.metadata.annotations(buat bagian ini jika belum ada).Klik Update dan tunggu hingga workload siap.
Verifikasi penyuntikan
Pada tab Pods, periksa kolom Image. KMS Agent muncul tersuntik ke dalam pod sebagai Sidecar.
CatatanSebuah pod mungkin disuntik dengan KMS Agent dua kali. Hal ini terjadi karena container init digunakan untuk inisialisasi. Container init akan berhenti (Terminated) setelah inisialisasi selesai, dan tidak berdampak negatif pada aplikasi atau terus-menerus mengonsumsi resource komputasi.
Integrasi aplikasi
Setelah Deployment Anda disuntik dengan KMS Agent, kontainer aplikasi dapat mengambil kredensial dari KMS melalui permintaan HTTP ke KMS Agent. Tidak perlu mengonfigurasi AccessKey dalam kode Anda. Contoh berikut menunjukkan cara mengambil kredensial. Ganti <SecretId> dengan nama kredensial aktual Anda.
KMS Agent hanya mendengarkan pada 127.0.0.1, artinya hanya aplikasi atau proses di mesin yang sama yang dapat berkomunikasi dengannya. Perangkat jaringan eksternal tidak dapat terhubung. Alamat akses hanya mendukung localhost atau 127.0.0.1, bukan IP lokal aplikasi. Contoh berikut menggunakan localhost.
Selain metode akses KMS Agent, KMS juga mendukung akses melalui SDK. Untuk operasi spesifik, lihat Secrets Manager Client.
OIDC (ACK)
Menggunakan curl
Perintah biasa:
# Baca token dari file, tentukan AapArn curl -v -H "X-KMS-Token:$(</var/run/kmstoken/token)" -H "AapArn:<AapArn>" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>'Sintaks
$(<file)hanya didukung di shell seperti bash dan zsh. Jika image dasar Pod Anda menggunakan Alpine (shell default-nya adalah BusyBox ash) atau image lain yang shell default-nya tidak mendukung sintaks ini, gunakan perintah berikut sebagai gantinya:# Baca token dari file, tentukan AapArn (kompatibel dengan Alpine/BusyBox) curl -v -H "X-KMS-Token:$(cat /var/run/kmstoken/token)" -H "AapArn:<AapArn>" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>'
Contoh kode Go
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
// Anda dapat menentukan versionStage atau versionId untuk mengambil versi kredensial tertentu.
// Contoh berikut mengambil kredensial berdasarkan versionId:
// url := fmt.Sprintf("http://localhost:2025/secretsmanager/get?secretId=%s&versionId=%s", "agent-test", "version-id")
aapArn := "acs:kms:cn-hangzhou:19*********224:applicationaccesspoint/****"
url := fmt.Sprintf("http://localhost:2025/secretsmanager/get?secretId=%s", "agent-test")
token, err := ioutil.ReadFile("/var/run/kmstoken/token")
if err != nil {
fmt.Printf("error reading token file: %v\n", err)
}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Printf("error creating request: %v\n", err)
}
req.Header.Add("X-KMS-Token", string(token))
req.Header.Add("AapArn", aapArn)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error sending request: %v \n", err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("status code %d - %s \n", resp.StatusCode, string(body))
}Peran RAM
Menggunakan curl
Perintah biasa:
# Baca token dari file curl -v -H "X-KMS-Token:$(</var/run/kmstoken/token)" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>' # Atau tulis token secara langsung curl -v -H "X-KMS-Token:<token>" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>'Sintaks
$(<file)hanya didukung di shell seperti bash dan zsh. Jika image dasar Pod Anda menggunakan Alpine (shell default-nya adalah BusyBox ash) atau image lain yang shell default-nya tidak mendukung sintaks ini, gunakan perintah berikut sebagai gantinya:# Baca token dari file (kompatibel dengan Alpine/BusyBox) curl -v -H "X-KMS-Token:$(cat /var/run/kmstoken/token)" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>'
Contoh kode Go
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
// Anda dapat menentukan versionStage atau versionId untuk mengambil versi kredensial tertentu.
// Contoh berikut mengambil kredensial berdasarkan versionId:
// url := fmt.Sprintf("http://localhost:2025/secretsmanager/get?secretId=%s&versionId=%s", "agent-test", "version-id")
url := fmt.Sprintf("http://localhost:2025/secretsmanager/get?secretId=%s", "agent-test")
token, err := ioutil.ReadFile("/var/run/kmstoken/token")
if err != nil {
fmt.Printf("error reading token file: %v\n", err)
}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Printf("error creating request: %v\n", err)
}
req.Header.Add("X-KMS-Token", string(token))
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("error sending request: %v \n", err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Printf("status code %d - %s \n", resp.StatusCode, string(body))
}Penagihan
Biaya sisi KMS:
Langganan: Beli instans KMS sebelum menggunakan KMS Agent. KMS Agent itu sendiri tidak dikenai biaya tambahan. Untuk informasi selengkapnya, lihat Langganan.
Pay-as-you-go: Selain biaya yang sudah Anda tanggung, biaya QPS tambahan berlaku saat KMS Agent mengambil kredensial melalui panggilan API. Untuk informasi selengkapnya, lihat Pay-as-you-go.
Biaya sisi ACK:
Komponen ack-kms-agent-webhook-injector gratis. Anda mungkin dikenai biaya tambahan untuk resource komputasi yang dikonsumsi oleh Sidecar dan workload Webhook yang disuntikkan.
Setelah Anda menginstal komponen ack-kms-agent-webhook-injector, workload layanan Webhook dihasilkan, yang mengonsumsi resource komputasi dan menimbulkan biaya. Batasi penggunaan CPU dan memori workload ini dalam file konfigurasi.
Saat Anda membuat atau memperbarui workload yang memenuhi syarat, ack-kms-agent-webhook-injector menyuntikkan KMS Agent sebagai Sidecar ke dalam kontainer. KMS Agent mengonsumsi resource komputasi dan menimbulkan biaya.
Troubleshooting
Jika Anda mengalami masalah saat menginstal atau menggunakan KMS Agent, rujuk masalah umum berikut untuk troubleshooting.
Penyebab | Solusi |
Gagal menginstal Agent | Jalankan |
Jaringan tidak terjangkau atau timeout | Pastikan kluster ACK dapat menjangkau layanan KMS. Jika Anda mengakses KMS melalui VPC, pastikan VPC tempat kluster ACK berada terhubung secara jaringan dengan instans KMS. |
Izin tidak mencukupi | Periksa konfigurasi berikut:
|
Gagal menyuntikkan Agent | Periksa apakah komponen ack-kms-agent-webhook-injector telah terinstal dengan benar dan berjalan normal. Verifikasi bahwa anotasi pod |
RRSA tidak diaktifkan | Metode autentikasi OIDC (ACK) bergantung pada fitur RRSA (RAM Roles for Service Accounts). Di Konsol ACK, buka modul keamanan dan audit kluster untuk mengaktifkan RRSA. Untuk langkah-langkah detail, lihat pengaturan penyedia identitas di tab peran RAM pada Langkah 2. |