All Products
Search
Document Center

Key Management Service:Akses cepat dari ACK

Last Updated:Jul 14, 2026

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

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.

image

Aktifkan untuk kluster yang sudah ada

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Klik nama kluster Anda. Di panel navigasi kiri, klik Cluster Information.

  3. Pada tab Basic Information, gulir ke bagian Security and Auditing dan klik Enable di samping RRSA OIDC.

    image

  4. 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.

  1. Buat namespace.

    1. Buat namespace menggunakan file YAML. Contoh berikut menggunakan app1-namespace.yaml untuk membuat namespace bernama app1-dev:

      apiVersion: v1
      kind: Namespace
      metadata:
        name: app1-dev
    2. Jalankan perintah berikut untuk membuat namespace:

      kubectl apply -f app1-namespace.yaml
    3. Verifikasi bahwa namespace telah dibuat. Jika output mencakup app1-dev, berarti namespace berhasil dibuat.

      kubectl get namespaces
  2. Buat akun layanan.

    1. Buat akun layanan menggunakan file YAML. Contoh berikut menggunakan app1-serviceaccount.yaml untuk membuat akun layanan bernama app1-service di namespace app1-dev yang telah Anda buat pada langkah sebelumnya:

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: app1-service
        namespace: app1-dev
    2. Jalankan perintah berikut untuk membuat akun layanan:

      kubectl apply -f app1-serviceaccount.yaml
    3. Verifikasi 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.

Catatan

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)

  1. Masuk ke Konsol KMS. Di panel navigasi kiri, pilih Application Access > Cloud-native Access. Di bagian Elastic Computing, temukan kluster ACK Anda dan klik Actions.

  2. Pada panel konfigurasi yang muncul, atur Authentication Method ke OIDC (ACK).

  3. 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.

    Penting

    Jika 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 awalan rds-ibm.

    Description

    Opsi. Deskripsi detail titik akses aplikasi. Panjang maksimum: 8.192 karakter.

  4. Klik OK untuk melanjutkan.

Peran RAM

  1. Dapatkan informasi penyedia identitas.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Klik nama kluster target untuk membuka halaman detail.

    3. 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.image

  2. Buat peran RAM.

    1. Masuk ke Konsol RAM. Di panel navigasi kiri, pilih Identities > Roles, lalu klik Create Role.

    2. Pilih IdP sebagai tipe entitas tepercaya, lalu klik Switch to Editor.

    3. 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, operator StringEquals, dan nilai system:serviceaccount:<namespace>:<ServiceAccountName>, di mana namespace dan ServiceAccountName sesuai dengan namespace dan akun layanan pod yang menjalankan workload.

      • Konfigurasi principal:

        1. Pilih Identity Provider sebagai Principal, lalu klik Edit di bawahnya.

        2. 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>.

    4. Setelah konfigurasi selesai, klik OK untuk mengatur nama peran (misalnya, app1-rrsa), lalu klik OK.

  3. Buat kebijakan dan sambungkan ke peran RAM. Untuk informasi selengkapnya, lihat Buat kebijakan kustom dan Sambungkan kebijakan ke peran RAM.

    1. Di panel navigasi kiri, pilih Permissions > Policies.

    2. Klik Create Policy, pilih Script Editor, lalu konfigurasi kebijakan menggunakan contoh berikut.

      Catatan

      Pada contoh ini, kebijakan diberi nama dev-role-for-rrsa-kms-policy dan hanya mengizinkan akses ke kredensial dengan tag env:app1.

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "kms:Decrypt",
                      "kms:GetSecretValue"
                  ],
                  "Resource": "*",
                  "Condition": {
                      "StringEqualsIgnoreCase": {
                          "kms:tag/secret": [
                              "app1"
                          ]
                      }
                  }
              }
          ]
      }
    3. Kembali ke daftar kebijakan, temukan kebijakan target, lalu klik Attach to Identity di kolom Actions.

    4. Pada bagian Principal, pilih peran RAM yang telah Anda buat, lalu klik Confirm.

Langkah 3: Instal ack-kms-agent-webhook-injector

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Pada halaman Clusters, klik nama kluster target untuk membuka halaman detail.

  3. Di panel navigasi kiri halaman detail, pilih Applications > Helm.

  4. 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.

  5. Saat kotak dialog konfirmasi muncul, verifikasi informasi lalu klik Yes.

  6. Pada halaman Parameters, konfigurasi parameter berdasarkan metode autentikasi yang Anda pilih pada Langkah 2.

    • OIDC (ACK): Pertahankan konfigurasi default.

    • Peran RAM: Biarkan agent.auth.roleArn kosong, dan atur agent.auth.roleArnMapping menjadi <Namespace>:<ServiceAccountName>:<RAM Role ARN>. Contoh berikut menggunakan data yang dibuat pada Langkah 2:

      Catatan

      Namespace dan ServiceAccountName sesuai dengan namespace dan akun layanan pod yang menjalankan workload. RAM Role ARN dapat dilihat di halaman detail peran RAM.

      agent:
        auth:
          roleArn:
          roleArnMapping:
            app1-dev:app1-service: acs:ram::190325303126****:role/app1-rrsa
  7. Setelah konfigurasi selesai, klik OK. Anda akan diarahkan ke halaman detail aplikasi.

Langkah 4: Suntikkan Agent Sidecar

  1. Tambahkan anotasi pod: Atur kunci anotasi menjadi kms-agent-webhook-injector/inject dan nilainya menjadi true.

    1. Di panel navigasi kiri halaman detail kluster, pilih Workloads > Deployments.

    2. Beralih ke namespace tempat workload Anda berjalan, lalu tambahkan anotasi pod ke Deployment tersebut.

      Penting

      Untuk metode autentikasi peran RAM, modifikasi konfigurasi YAML Deployment dan atur parameter ServiceAccountName menjadi nama akun layanan pod yang menjalankan workload (misalnya, app1-service). Untuk metode autentikasi OIDC (ACK), tidak diperlukan modifikasi.

      • Buat Deployment baru

        Create from Image

        1. Klik Create from Image di atas daftar Deployment lalu konfigurasi parameter.

        2. Saat mengonfigurasi Advanced, buka bagian Labels and Annotations dan tambahkan anotasi pod: masukkan kms-agent-webhook-injector/inject di kolom Name dan true di kolom Value.

        3. Klik Create untuk menyelesaikan.

        Create from YAML

        1. Klik Create from YAML di atas daftar Deployment.

        2. Edit file YAML dan tambahkan kms-agent-webhook-injector/inject: "true" di bawah spec.template.metadata.annotations (buat bagian ini jika belum ada).

        3. Klik Create untuk menyelesaikan.

      • Modifikasi Deployment yang sudah ada

        1. Temukan workload target lalu klik Actions > Details.

        2. Pada halaman detail, klik Edit YAML di pojok kanan atas.

        3. Tambahkan kms-agent-webhook-injector/inject: "true" di bawah spec.template.metadata.annotations (buat bagian ini jika belum ada).

        4. Klik Update dan tunggu hingga workload siap.

  2. Verifikasi penyuntikan

    1. Kembali ke Workloads > Deployments lalu klik nama Deployment target untuk membuka halaman detail.

    2. Pada tab Pods, periksa kolom Image. KMS Agent muncul tersuntik ke dalam pod sebagai Sidecar.

      Catatan

      Sebuah 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.

Penting
  • 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 kubectl get nodes untuk memverifikasi kluster berada dalam status Running. Periksa izin KMS di bawah pengguna RAM.

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:

  • OIDC (ACK): Verifikasi namespace dan akun layanan, serta periksa apakah filter PodNamePrefix dikonfigurasi.

  • Peran RAM: Verifikasi bahwa peran RAM telah benar tersambung ke penyedia identitas dan kebijakan mencakup izin kms:GetSecretValue dan kms:Decrypt.

Gagal menyuntikkan Agent

Periksa apakah komponen ack-kms-agent-webhook-injector telah terinstal dengan benar dan berjalan normal. Verifikasi bahwa anotasi pod kms-agent-webhook-injector/inject: "true" telah dikonfigurasi dengan benar.

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.