Konfigurasikan dan uji kritis-validation-hook di kluster Container Service for Kubernetes (ACK) untuk memblokir gambar kontainer yang tidak ditandatangani pada saat admission, sehingga hanya gambar yang ditandatangani oleh otoritas tepercaya yang diperbolehkan guna mengurangi risiko kode tak terduga atau berbahaya.
Prasyarat
Anda memiliki kluster ACK yang dikelola atau kluster khusus ACK (Telah dihentikan).
Latar Belakang
kritis-validation-hook dibangun di atas perangkat lunak open source kritis, dengan integrasi mendalam dengan Container Registry (ACR) dan mendukung verifikasi gambar kontainer yang ditandatangani menggunakan Key Management Service (KMS). Melalui kolaborasi dengan Security Center, KMS, dan ACR, solusi ini sepenuhnya mengotomatiskan penandatanganan dan verifikasi gambar untuk menciptakan lingkungan runtime kluster yang lebih aman.
Lihat Verifikasi signature gambar kontainer dengan kritis-validation-hook.
Konfigurasikan izin akses resource
Pastikan peran RAM yang digunakan oleh kluster memiliki izin berikut:
"cr:ListInstance",
"cr:ListMetadataOccurrences"Untuk kluster ACK yang dikelola, berikan izin ini ke peran Worker RAM. Untuk kluster khusus ACK, berikan ke peran Master RAM dan peran Worker RAM.
Tambahkan izin yang belum ada sebagai berikut.
Buat kebijakan kustom dengan konten berikut:
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }Berikan kebijakan tersebut ke peran Worker RAM kluster.
Untuk kluster khusus ACK, berikan juga kebijakan tersebut ke peran Master RAM.
Aktifkan verifikasi signature gambar
Contoh ini mengonfigurasi verifikasi signature gambar untuk namespace default. Penandatanganan gambar berada di luar cakupan kritis-validation-hook — contoh ini mengasumsikan gambar telah ditandatangani. Lihat Gunakan penandatanganan gambar kontainer untuk langkah-langkah penandatanganan.
Contoh ini menggunakan informasi penandatanganan berikut. Ganti nilai contoh dengan nilai yang sebenarnya.
Informasi penandatanganan | Nilai contoh | Cara mendapatkan | YAML Field |
Kunci publik KMS (Base64) |
|
| |
ID kunci KMS |
|
| |
Nama saksi |
|
| |
Gambar yang ditandatangani |
| — | — |
Deklarasikan otoritas tepercaya
Buat file AttestationAuthority.yaml dengan konten berikut:
apiVersion: kritis.grafeas.io/v1beta1
kind: AttestationAuthority
metadata:
name: demo-aa
spec:
noteReference: namespaces/demo-aa
publicKeyData: LS0tLS1CRUdJTiBQ***
publicKeyId: key-4a2ef103-5aa3-4220-****Terapkan resource tersebut.
kubectl apply -f AttestationAuthority.yamlBuat kebijakan verifikasi signature
Buat file GenericAttestationPolicy.yaml dengan konten berikut. Kebijakan ini mereferensikan AttestationAuthority dari langkah sebelumnya.
apiVersion: kritis.grafeas.io/v1beta1
kind: GenericAttestationPolicy
metadata:
name: demo-gap
spec:
attestationAuthorityNames:
- demo-aaTerapkan resource tersebut.
kubectl apply -f GenericAttestationPolicy.yamlUji dengan gambar yang tidak ditandatangani
Lakukan penerapan gambar yang tidak ditandatangani.
kubectl create deployment test-denied --image=anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6Output yang diharapkan:
error: failed to create deployment: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: "ACROpenAPIError detail: <image anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 is not attested because of get resource url for anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6: ListInstance failed, instanceName: "anolis", regionId: "cn-zhangjiakou", requstURL:error:****Admission webhook menolak penerapan karena gambar tersebut tidak memiliki attestation yang valid dari demo-aa.
Uji dengan gambar yang ditandatangani
Lakukan penerapan gambar yang ditandatangani. Ganti alamat gambar dengan alamat gambar yang ditandatangani sebenarnya.
kubectl create deployment test-allow --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45Output yang diharapkan:
deployment.apps/test-allow createdPenerapan berhasil karena gambar tersebut telah diattestasi oleh otoritas tepercaya demo-aa.
Konfigurasikan daftar izin verifikasi signature gambar
Secara default, kritis-validation-hook memverifikasi setiap gambar kontainer dalam cakupan penerapannya. Di lingkungan middleware atau service mesh, sidecar yang disuntikkan oleh add-on pihak ketiga mungkin tidak ditandatangani, sehingga menyebabkan pembuatan pod gagal. Konfigurasikan daftar izin untuk melewati verifikasi signature pada gambar tertentu.
Definisikan resource admissionallowlists.kritis.grafeas.io untuk menentukan gambar yang dilewati verifikasinya.
apiVersion: kritis.grafeas.io/v1beta1 # Nilai default. Jangan ubah.
kind: AdmissionAllowlist # Nilai default. Jangan ubah.
metadata:
name: kritis-allowlist # Harus unik dalam kluster.
spec:
patterns: # Definisikan satu atau beberapa entri daftar izin.
- namePattern: 'registry*.*.aliyuncs.com/acs/*'
- namePattern: 'registry-vpc.cn-beijing.aliyuncs.com/arms-docker-repo/*'
namespace: 'default' # Opsional. Jika dihilangkan, entri berlaku untuk semua namespace.Aturan pencocokan namePattern
Setiap nilai namePattern mencocokkan referensi gambar lengkap, termasuk host registri, path repositori, serta tag atau digest. Aturan pencocokan berikut berlaku:
Aturan | Deskripsi | Contoh |
Pencocokan eksak | Nilai tanpa |
|
| Mencocokkan karakter apa pun kecuali |
|
| Mencocokkan huruf, angka, tanda hubung ( |
|
Tambahkan gambar sistem ACK ke daftar izin
Buat file
kritis-admission-allowlist-acs.yamldengan konten berikut:apiVersion: kritis.grafeas.io/v1beta1 kind: AdmissionAllowlist metadata: name: allow-acs-images spec: patterns: - namePattern: 'registry*.*.aliyuncs.com/acs/*' - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'Pola daftar izin umum:
# Gambar yang digunakan oleh ACK - namePattern: 'registry*.*.aliyuncs.com/acs/*' - namePattern: 'registry-*.ack.aliyuncs.com/acs/*' # Gambar yang digunakan oleh ACK (hanya wilayah Tiongkok) - namePattern: 'registry*.cn-*.aliyuncs.com/acs/*' - namePattern: 'registry-cn-*.ack.aliyuncs.com/acs/*' # Gambar yang digunakan oleh ARMS - namePattern: 'registry*.*.aliyuncs.com/arms-docker-repo/*' # Gambar yang digunakan oleh ARMS (hanya wilayah Tiongkok) - namePattern: 'registry*.cn-*.aliyuncs.com/arms-docker-repo/*'Terapkan daftar izin tersebut.
kubectl apply -f kritis-admission-allowlist-acs.yamlOutput yang diharapkan:
admissionallowlist.kritis.grafeas.io/allow-acs-images createdVerifikasi daftar izin:
kubectl get admissionallowlists.kritis.grafeas.ioOutput yang diharapkan:
NAME AGE allow-acs-images 2m22s