全部產品
Search
文件中心

Container Service for Kubernetes:使用kritis-validation-hook驗證容器鏡像簽名

更新時間:Jul 25, 2025

kritis-validation-hook組件是部署可信容器環節中進行容器鏡像簽名驗證的關鍵組件。在部署前對容器鏡像進行簽名驗證,以確保叢集中僅部署經過可信授權方進行過簽名的容器鏡像,降低在您的環境中運行意外或惡意代碼的風險。本文通過樣本介紹kritis-validation-hook組件的工作效果。

前提條件

已建立託管版或專有版叢集。具體操作,請參見建立ACK託管叢集建立ACK專有叢集(已停止建立)

背景資訊

kritis-validation-hook組件在開源的kritis軟體的基礎上增加了對阿里雲Container RegistryACR的深度整合,支援驗證通過阿里雲Key Management Service簽名的容器鏡像。kritis-validation-hook組件通過與Security Center、KMS和ACR的深度合作,實現了全自動化的對容器鏡像進行加簽和驗簽,協助您構建更安全的叢集運行環境。實現自動驗證容器鏡像簽名,請參見使用kritis-validation-hook組件實現自動驗證容器鏡像簽名

配置資源存取權限

為了正常運行kritis-validation-hook組件,需要確保叢集使用的RAM角色擁有以下資源存取權限:

重要
  • 若您使用的是託管版叢集,需要確保叢集使用的Worker RAM角色擁有以下資源存取權限。

  • 若您使用的是專有版叢集,需要確保叢集使用的Master RAM角色和Worker RAM角色擁有以下資源存取權限。

"cr:ListInstance",
"cr:ListMetadataOccurrences"

如果您的叢集使用的RAM角色沒有上述存取權限,您可以通過以下方法添加組件所需的資源存取權限。

  1. 建立自訂權限原則,策略內容如下。具體操作,請參見步驟一:建立自訂權限原則

    {
        "Statement": [
            {
                "Action": [
                    "cr:ListInstance",
                    "cr:ListMetadataOccurrences"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ],
        "Version": "1"
    }
  2. 為叢集的Worker RAM角色授權。具體操作,請參見步驟二:為叢集的Worker RAM角色授權

    說明

    如果是專有版叢集,您需要為叢集的Master RAM角色也進行以上授權。

啟用鏡像簽名驗證樣本

以下通過對當前default命名空間啟用鏡像簽名驗證為例,展示kritis-validation-hook組件的工作效果。 本樣本的鏡像加簽資訊如下,您可以根據擷取來源中的提示資訊替換為實際的鏡像簽名資訊:

加簽資訊

樣本值

擷取步驟

對應YAML欄位

KMS公開金鑰(base64)

LS0tLS1CRUdJTiBQ***

建立非對稱金鑰

spec.publicKeyData

KMS key-id

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

建立密鑰

spec.publicKeyId

證明者名稱

demo-aa

配置證明者及驗簽策略

spec.noteReference

namespaces/demo-aa表示引用的是名為demo-aa的證明者配置。

加簽鏡像

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

N/A

N/A

說明

因為鏡像簽名不屬於kritis-validation-hook組件的工作範疇,所以樣本略過簽名的步驟。詳細的鏡像加簽步驟,請參見使用容器鏡像加簽

  1. 配置AttestationAuthority,聲明相應的可信授權方。

    1. 使用以下內容建立AttestationAuthority.yaml檔案。

      apiVersion: kritis.grafeas.io/v1beta1
      kind: AttestationAuthority
      metadata:
        name: demo-aa
      spec:
        noteReference: namespaces/demo-aa
        publicKeyData: LS0tLS1CRUdJTiBQ***
        publicKeyId: key-4a2ef103-5aa3-4220-****
    2. 執行以下命令,配置可信授權方資訊。

      kubectl apply -f AttestationAuthority.yaml
  2. 配置GenericAttestationPolicy,聲明驗證簽名策略及使用可信授權方的資訊驗證簽名。

    1. 使用以下內容建立GenericAttestationPolicy.yaml檔案。

      apiVersion: kritis.grafeas.io/v1beta1
      kind: GenericAttestationPolicy
      metadata:
        name: demo-gap
      spec:
        attestationAuthorityNames:
        - demo-aa
    2. 執行以下命令配置驗證簽名策略。

      kubectl apply -f GenericAttestationPolicy.yaml
  3. 測試鏡像簽名驗證功能,部署未經信任授權方簽名的鏡像。

    執行以下命令測試鏡像簽名驗證功能。

    kubectl create deployment test-denied --image=anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    預期輸出:

    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:****

    從預期輸出可得,鏡像簽名驗證功能拒絕部署未經信任授權方簽名的鏡像。

  4. 測試鏡像簽名驗證功能,部署經信任授權方簽名的鏡像。

    執行以下命令測試鏡像簽名驗證功能。

    請替換以下鏡像地址為實際已加簽的鏡像。
    kubectl create deployment test-allow --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

    預期輸出:

    deployment.apps/test-allow created

    從預期輸出可得,鏡像簽名驗證功能允許部署經信任授權方簽名的鏡像。

配置鏡像驗簽白名單

在中介軟體或服務網格情境下,kritis-validation-hook組件支援通過配置鏡像驗簽白名單的方式,解決第三方組件自動注入的Sidecar容器的鏡像無法通過鏡像驗簽,導致無法部署Pod的問題。組件不會對白名單內的鏡像進行簽名驗證,只會驗證未在白名單內的鏡像。

可以通過定義admissionallowlists.kritis.grafeas.io資源的方法來配置鏡像驗簽白名單。資源定義樣本如下:

apiVersion: kritis.grafeas.io/v1beta1   # 預設值,無需修改。
kind: AdmissionAllowlist                # 預設值,無需修改。
metadata:
  name: kritis-allowlist                # 資源名,在叢集內唯一。
spec:
  patterns:                             # 白名單配置,可以定義多條白名單。
  - namePattern: 'registry*.*.aliyuncs.com/acs/*' # 想忽略的鏡像名稱,具體格式詳見下方說明。
  - namePattern: 'registry-vpc.cn-beijing.aliyuncs.com/arms-docker-repo/*'
    namespace: 'default'    # [可選],白名單配置適用於哪個命名空間,未配置時適用於所有命名空間。

若您需要將ACK的系統鏡像加入白名單,可以通過以下操作配置。

  1. 使用以下內容建立kritis-admission-allowlist-acs.yaml檔案配置白名單。

    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/*'

    namePattern配置項值支援完整匹配,且支援通過星號(*)字元實現簡單的萬用字元匹配,具體說明如下:

    • 當配置項值不包含星號(*)字元時,將按配置的值進行完整匹配。例如,nginx:v0.1.0只會匹配nginx:v0.1.0

    • 當通過星號(*)字元實現萬用字元匹配時,存在以下限制:

      • 星號(*)位於末尾時,匹配除正斜線(/)外的任一字元。例如,a.com/nginx*匹配a.com/nginx:v0.1.0,但是不匹配a.com/nginx/test:v0.1.0

      • 星號(*)不位於末尾時,匹配字母、數字、虛線(-) 以及底線(_) 。例如,registry-vpc.cn-*.aliyuncs.com/acs/pause:3.2既匹配registry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2,也匹配registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2

    常見的白名單如下,您可以根據實際需求添加。

    # Container ServiceACK使用的鏡像
    - namePattern: 'registry*.*.aliyuncs.com/acs/*'
    - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'
    
    # Container ServiceACK使用的鏡像(限定中國地區)
    - namePattern: 'registry*.cn-*.aliyuncs.com/acs/*'
    - namePattern: 'registry-cn-*.ack.aliyuncs.com/acs/*'
    
    # ARMS使用的鏡像
    - namePattern: 'registry*.*.aliyuncs.com/arms-docker-repo/*'
    
    # ARMS使用的鏡像(限定中國地區)
    - namePattern: 'registry*.cn-*.aliyuncs.com/arms-docker-repo/*'
  2. 執行以下命令配置白名單。

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

    預期輸出:

    admissionallowlist.kritis.grafeas.io/allow-acs-images created
  3. 執行以下命令驗證白名單配置是否成功。

    kubectl get admissionallowlists.kritis.grafeas.io

    預期輸出:

    NAME               AGE
    allow-acs-images   2m22s