All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan kritis-validation-hook untuk memverifikasi signature gambar kontainer

Last Updated:Aug 21, 2026

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

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"
Penting

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.

  1. Buat kebijakan kustom dengan konten berikut:

    {
        "Statement": [
            {
                "Action": [
                    "cr:ListInstance",
                    "cr:ListMetadataOccurrences"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ],
        "Version": "1"
    }
  2. 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)

LS0tLS1CRUdJTiBQ***

Buat kunci asimetris

spec.publicKeyData

ID kunci KMS

key-4a2ef103-5aa3-4220-****

Buat kunci

spec.publicKeyId

Nama saksi

demo-aa

Konfigurasikan witness dan kebijakan verifikasi signature

spec.noteReference — mereferensikan witness demo-aa melalui namespaces/demo-aa

Gambar yang ditandatangani

kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

—

—

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

Buat 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-aa

Terapkan resource tersebut.

kubectl apply -f GenericAttestationPolicy.yaml

Uji 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.6

Output 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:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

Output yang diharapkan:

deployment.apps/test-allow created

Penerapan 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 * hanya cocok dengan string tersebut secara tepat.

nginx:v0.1.0 hanya cocok dengan nginx:v0.1.0

* di akhir

Mencocokkan karakter apa pun kecuali /.

a.com/nginx* cocok dengan a.com/nginx:v0.1.0 tetapi tidak cocok dengan a.com/nginx/test:v0.1.0

* di tengah string

Mencocokkan huruf, angka, tanda hubung (-), dan garis bawah (_).

registry-vpc.cn-*.aliyuncs.com/acs/pause:3.2 cocok dengan registry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2 dan registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2

Tambahkan gambar sistem ACK ke daftar izin

  1. Buat file kritis-admission-allowlist-acs.yaml dengan 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/*'
  2. Terapkan daftar izin tersebut.

    kubectl apply -f kritis-admission-allowlist-acs.yaml

    Output yang diharapkan:

    admissionallowlist.kritis.grafeas.io/allow-acs-images created
  3. Verifikasi daftar izin:

    kubectl get admissionallowlists.kritis.grafeas.io

    Output yang diharapkan:

    NAME               AGE
    allow-acs-images   2m22s

Dokumen terkait