kritis-validation-hook组件是部署可信容器环节中进行容器镜像签名验证的关键组件。通过在部署前对容器镜像进行签名验证可以确保只部署经过可信授权方进行过签名的容器镜像,降低在您的环境中运行意外或恶意代码的风险。本文通过具体示例对kritis-validation-hook组件的工作效果进行介绍。

背景信息

kritis-validation-hook组件在开源的kritis软件的基础上增加了对阿里云容器镜像服务ACR的深度集成,支持验证通过阿里云密钥管理服务KMS进行过签名的容器镜像。kritis-validation-hook组件通过与云安全中心、KMS和ACR的深度合作,实现了全自动化的对容器镜像进行加签和验签,协助您构建更安全的集群运行环境。实现自动验证容器镜像签名,请参见使用kritis-validation-hook组件实现自动验证容器镜像签名

示例

以下通过对当前default这个namespace启用镜像签名验证为例,展示kritis-validation-hook组件的工作效果。
说明 因为镜像签名不属于kritis-validation-hook组件的工作范畴,所以示例略过签名的步骤。本示例中涉及的签名后的信息如下。
  • 使用KMS进行过签名的容器镜像:kritis-demo-registry.cn-hangzhou.cr.aliyuncs.com/kritis-demo/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45。
  • 使用的KMS key对应的公钥信息存储在publickey.txt中。
  • 使用的KMS key-id:4a2ef103-5aa3-4220-89ee-kms-key-id。
  1. 运行以下命令配置AttestationAuthority,声明相应的可信授权方。
    这里配置的是本示例KMS公钥信息。
    $ cat <<EOF > AttestationAuthority.yaml
    apiVersion: kritis.grafeas.io/v1beta1
    kind: AttestationAuthority
    metadata:
      name: demo-aa
    spec:
      noteReference: namespaces/demo-aa
      publicKeyData: $(cat publickey.txt | base64 | tr -d '\n')
      publicKeyId: 4a2ef103-5aa3-4220-89ee-kms-key-id
    EOF
    
    $ kubectl apply -f AttestationAuthority.yaml
  2. 运行以下命令配置GenericAttestationPolicy,声明验证签名策略及使用哪个可信授权方的信息去验证签名。
    $ cat <<EOF > GenericAttestationPolicy.yaml
    apiVersion: kritis.grafeas.io/v1beta1
    kind: GenericAttestationPolicy
    metadata:
      name: demo-gap
    spec:
      attestationAuthorityNames:
      - demo-aa
    EOF
    
    $ 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-registry.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-registry.cn-hangzhou.cr.aliyuncs.com/kritis-demo/alpine:3.11 is not attested
  4. 测试镜像签名验证功能,部署由信任的授权方进行过签名的镜像。
    $ kubectl create deployment test-allow --image=kritis-demo-registry.cn-hangzhou.cr.aliyuncs.com/kritis-demo/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45
    deployment.apps/test-allow created

未来展望

kritis-validation-hook组件在未来可能会同阿里云其他服务一起合作提供不仅限于以下的增强功能。
  • 集成不可变镜像tag功能。通过集成不可变镜像tag功能,在对镜像签名进行验证的时候不再需要用户必须指定镜像的digest,支持对普通的镜像tag进行验签,提升用户体验。
  • 集成镜像漏洞检测功能。不只是验证镜像签名,您同样也可以拒绝部署包含特定级别漏洞的容器镜像,进一步地降低您环境的安全风险。