全部產品
Search
文件中心

Container Service for Kubernetes:kritis-validation-hook組件介紹

更新時間:Nov 05, 2024

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角色也進行以上授權。

配置ACK Serverless叢集中組件所需的RAM許可權

由於ACK Serverless叢集沒有Worker RAM角色和Master RAM角色,您需要使用RRSA特性配置組件所需的RAM許可權。更多資訊,請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

您可以使用ack-ram-tool工具快速完成組件所需的RRSA相關配置。更多資訊,請參見ack-ram-tool。相關配置操作如下。

說明

請替換以下命令中出現的 <clusterId>為您需要操作的叢集ID。

  1. 執行以下命令,開啟叢集的RRSA特性。

    ack-ram-tool rrsa enable -c <clusterId>
  2. 執行以下命令,配置組件所需的RAM許可權。

    ack-ram-tool rrsa setup-addon -a kritis-validation-hook -c <clusterId>

啟用鏡像簽名驗證樣本

以下通過對當前default命名空間啟用鏡像簽名驗證為例,展示kritis-validation-hook組件的工作效果。

說明

因為鏡像簽名不屬於kritis-validation-hook組件的工作範疇,所以樣本略過簽名的步驟。詳細的鏡像加簽步驟,請參見使用容器鏡像加簽。本樣本中涉及的簽名後的資訊如下,您需要替換為實際的鏡像簽名資訊:

  • 已簽名的容器鏡像:kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

    如果未啟用不可變鏡像的話,必須配置使用digest格式的鏡像地址,關於鏡像不可變的詳細介紹,請參見開啟鏡像版本不可變

  • 鏡像加簽時使用的證明者名稱(加簽Key):demo-aa。

  • 使用cat publickey.txt | base64 | tr -d '\n'命令得到的base64編碼後的公開金鑰:LS0tLS1CRUdJTiBQ***

    鏡像加簽時使用的KMS Key對應的公開金鑰資訊儲存在publickey.txt中。

  • 鏡像加簽時使用的KMS key-id:4a2ef103-5aa3-4220-****

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

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

      apiVersion: kritis.grafeas.io/v1beta1
      kind: AttestationAuthority
      metadata:
        name: demo-aa
      spec:
        noteReference: namespaces/demo-aa
        publicKeyData: LS0tLS1CRUdJTiBQ***
        publicKeyId: 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=alpine:3.11

      預期輸出:

      Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine:3.11 is not attested
    • 執行以下命令測試鏡像簽名驗證功能。

      kubectl create deployment test-denied --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine:3.11

      預期輸出:

      Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine:3.11 is not attested

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

  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