全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan Proyeksi Token ServiceAccount

更新时间:Jul 02, 2025

Token ServiceAccount berfungsi sebagai kredensial otentikasi yang memungkinkan komunikasi aman antara aplikasi dalam pod dan API Kubernetes. Untuk mengatasi risiko keamanan terkait metode tradisional pemasangan otomatis token ServiceAccount sebagai Secrets di dalam pod, Anda dapat menggunakan fitur Service Account Token Volume Projection yang disediakan oleh Container Service for Kubernetes (ACK). Fitur ini memungkinkan Anda memasang token ServiceAccount atau sertifikat terkait ke dalam kontainer sebagai proyeksi volume, mengurangi risiko paparan rahasia.

Pengenalan Fitur

Akun layanan menyediakan identitas untuk komunikasi antara pod dan server API dari klaster. Penggunaan akun layanan secara tradisional mungkin menghadapi tantangan berikut:

  • JSON Web Tokens (JWT) dalam akun layanan tidak terikat pada identitas audience. Pengguna akun layanan dapat menyamar sebagai pengguna lain dan meluncurkan serangan penyamaran.

  • Secara tradisional, setiap akun layanan disimpan dalam Secret dan dikirimkan sebagai file ke node aplikasi yang sesuai. Akun layanan yang digunakan oleh komponen sistem mungkin diberikan izin yang tidak perlu. Penyerang dapat memperoleh akun layanan ini untuk meluncurkan serangan peningkatan hak istimewa, yang menghasilkan permukaan serangan yang luas untuk bidang kontrol Kubernetes.

  • JWT tidak dibatasi waktu. JWT yang terganggu dalam serangan tersebut tetap valid selama akun layanan ada. Anda hanya dapat mengurangi masalah ini dengan merotasikan kunci privat akun layanan. Namun, client-go tidak mendukung rotasi kunci otomatis. Anda harus melakukan rotasi kunci manual, yang kompleks.

  • Secret harus dibuat untuk setiap akun layanan. Ini dapat menurunkan elastisitas dan kapasitas dalam penyebaran beban kerja berskala besar.

Fitur proyeksi volume token ServiceAccount meningkatkan keamanan ServiceAccount, memberikan informasi autentikasi terkait ServiceAccount kepada pod dengan cara yang lebih aman dan fleksibel. Fitur ini memungkinkan pod untuk memasang ServiceAccount ke dalam kontainer dalam bentuk proyeksi volume, menghindari ketergantungan pada Secrets.

Prasyarat

  • Sebuah klaster ACK dikelola, klaster ACK khusus, atau klaster ACK Serverless yang menjalankan Kubernetes 1.20 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat klaster ACK dikelola, Buat klaster ACK khusus (tidak dilanjutkan), dan Buat klaster ACK Serverless.

  • Fitur proyeksi volume token ServiceAccount diaktifkan selama proses pembuatan klaster.

    Secara default, fitur proyeksi volume token ServiceAccount diaktifkan di klaster yang menjalankan Kubernetes 1.22 atau lebih baru. Untuk meningkatkan klaster, lihat Tingkatkan klaster ACK secara manual. 1.png

    Server API dan controller-manager dari komponen sistem secara otomatis mengaktifkan gerbang fitur untuk mengikat proyeksi volume token ServiceAccount, serta menambahkan konfigurasi berikut dalam parameter startup server API.

    Parameter

    Deskripsi

    Nilai default

    Konfigurasi Konsol

    service-account-issuer

    Penerbit token ServiceAccount, yang sesuai dengan bidang iss dalam payload token.

    https://kubernetes.default.svc

    Didukung.

    api-audiences

    Pengidentifikasi API, digunakan untuk memvalidasi token permintaan untuk layanan server API.

    https://kubernetes.default.svc

    Didukung. Lebih dari satu audience dapat dikonfigurasi, dipisahkan dengan koma (,).

    service-account-signing-key-file

    Jalur file kunci privat yang menandatangani token.

    /etc/kubernetes/pki/sa.key

    Tidak didukung. Nilai default: /etc/kubernetes/pki/sa.key.

Langkah 1: Buat objek ServiceAccount

Secara default, setiap namespace memiliki default ServiceAccount, yang dapat Anda lihat dengan menjalankan perintah kubectl get serviceaccounts. Untuk menetapkan identitas tambahan ke proses yang berjalan di dalam pod, Anda dapat membuat ServiceAccount baru dengan menggunakan kode berikut:

kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
EOF

Setelah ServiceAccount dibuat, Anda dapat melihat informasi lengkap ServiceAccount dengan menjalankan perintah kubectl get serviceaccounts/build-robot -o yaml.

Langkah 2: Sebarkan aplikasi pod yang menggunakan proyeksi volume token ServiceAccount

Anda dapat memproyeksikan ServiceAccount ke dalam pod sebagai volume, memungkinkan kontainer di dalam pod menggunakan token untuk mengakses server API klaster dan mengotentikasi dengan ServiceAccount. Misalnya, Anda dapat menentukan audience, waktu kedaluwarsa (expirationSeconds), dan properti lain dari token, serta memproyeksikan ini ke dalam aplikasi yang berjalan di dalam pod.

  1. Buat file bernama nginx.yaml dengan kode contoh berikut. Konfigurasi ini menentukan bahwa pod menggunakan ServiceAccount dengan audience vault dan waktu kedaluwarsa 2 jam.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
        name: nginx
        volumeMounts:
        - mountPath: /var/run/secrets/tokens
          name: vault-token
      serviceAccountName: build-robot
      volumes:
      - name: vault-token
        projected:
          sources:
          - serviceAccountToken:
              path: vault-token
              expirationSeconds: 7200
              audience: vault
  2. Jalankan perintah berikut untuk menyebarkan aplikasi yang berjalan di dalam pod yang menggunakan proyeksi volume:

    kubectl apply -f nginx.yaml
  3. Verifikasi waktu kedaluwarsa token yang dipasang di dalam pod.

    1. Jalankan perintah berikut untuk memastikan bahwa pod berjalan seperti yang diharapkan:

      kubectl get pod nginx

      Output yang diharapkan:

      NAME    READY   STATUS    RESTARTS   AGE
      nginx   1/1     Running   0          3m15s
    2. Unduh token yang dipasang di dalam kontainer pod:

      kubectl exec -t nginx -- cat /var/run/secrets/tokens/vault-token > vault-token
    3. Jalankan perintah berikut untuk mendapatkan waktu kedaluwarsa token:

      cat vault-token |awk -F '.' '{print $2}' |base64 -d 2>/dev/null |jq  '.exp' | xargs -I {} date -d @{}

      Contoh output:

      Mon  Aug 26 15:45:59 CST 2024
Penting
  • Pastikan bahwa pod dapat mengambil token yang telah dirotasi secara real-time dengan memuat ulang token target secara berkala, sebaiknya setiap 5 menit. Kubernetes resmi mendukung pengambilan token otomatis di client-go versi 10.0.0 atau lebih baru.

  • Izin file untuk token ServiceAccount di dalam kontainer diperbarui dari 644 menjadi 600. Saat Anda menggunakan proyeksi volume token ServiceAccount terikat, izin file sekarang diatur ke 600, dan ke 640 jika fitur fsGroup diaktifkan.