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.

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
issdalam 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
audiencedapat 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
EOFSetelah 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.
Buat file bernama nginx.yaml dengan kode contoh berikut. Konfigurasi ini menentukan bahwa pod menggunakan ServiceAccount dengan
audiencevaultdan 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: vaultJalankan perintah berikut untuk menyebarkan aplikasi yang berjalan di dalam pod yang menggunakan proyeksi volume:
kubectl apply -f nginx.yamlVerifikasi waktu kedaluwarsa token yang dipasang di dalam pod.
Jalankan perintah berikut untuk memastikan bahwa pod berjalan seperti yang diharapkan:
kubectl get pod nginxOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3m15sUnduh token yang dipasang di dalam kontainer pod:
kubectl exec -t nginx -- cat /var/run/secrets/tokens/vault-token > vault-tokenJalankan 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
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
fsGroupdiaktifkan.