本文介绍如何使用容器镜像服务ACR(Container Registry)、密钥管理服务KMS(Key Management Service)、云安全中心(Security Center)和kritis-validation-hook组件实现自动验证容器镜像签名,确保只部署可信授权方签名的容器镜像,降低在您环境中发生意外或恶意代码的风险。

步骤一:安装kritis-validation-hook组件

  1. 在左侧导航栏选择运维管理 > 组件管理
  2. 组件管理页面的安全区域,找到kritis-validation-hook并单击安装
  3. 可选:授予访问kritis-validation-hook组件所需的权限。

    如果您使用的是ACK托管版集群,还需要确保您的集群拥有运行kritis-validation-hook组件所需的访问权限。具体操作,请参见kritis-validation-hook组件介绍

    说明 ACK专有版集群默认开通运行kritis-validation-hook组件所需的访问权限。

步骤二:创建用于容器镜像签名的KMS密钥

注意 选择密钥类型RSA_2048;选择密钥用途SIGN/VERIFY

    步骤三:在云安全中心配置使用KMS密钥的证明者

    1. 证明者页签中,单击创建证明者
      创建证明者的配置信息,请参见容器签名
    2. 单击确定

    步骤四:在ACR中开启容器镜像自动加签功能

    1. 登录容器镜像服务控制台
    2. 实例列表页面,单击目标企业版实例名称或者单击目标企业版实例的管理
    3. 在企业版实例管理页左侧导航栏中,选择仓库管理 > 命名空间
      创建一个命名空间,用于为该命名空间内的所有容器镜像启用镜像加签功能。具体操作,请参见命名空间的基本操作
    4. 为创建的命名空间启用容器镜像自动加签功能。

      添加加签规则时选择步骤三中在云安全中心创建的证明者。

      1. 在企业版实例管理页左侧导航栏中,选择内容可信 > 镜像加签
      2. 镜像加签页签中,单击添加加签规则
        添加加签规则配置详情,请参见使用容器镜像加签

    步骤五:在云安全中心启用容器镜像验签功能

    通过在云安全中心添加和启用策略的方式来为Kubernetes集群中某个命名空间启用容器镜像验签功能。

    1. 安全策略页签,单击添加策略
      添加策略的配置说明,请参见创建安全策略验签
    2. 单击确定

    步骤六:验证容器镜像自动验签功能

    说明 目前只支持使用digest格式的镜像。

    执行以下命令验证容器镜像自动验签功能:

    • 已开启验签功能的Default命名空间将拒绝部署使用未加签的容器镜像服务。
      使用Tag格式镜像的命令如下:
      kubectl -n default create deployment not-sign --image=alpine:3.11 -- sleep 10
      Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine:3.11 is not attested
      使用Digest格式镜像的命令如下:
      kubectl -n default create deployment not-sign --image=alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 -- sleep 10
      Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 is not attested
    • 向已开启自动加签功能的容器镜像服务命名空间中推送一个镜像,然后验证可以使用这个加签的容器镜像部署服务。
      docker push kritis-demo-registry-vpc.cn-hongkong.cr.aliyuncs.com/kritis-demo/alpine:3.11
      The push refers to repository [kritis-demo-registry-vpc.cn-hongkong.cr.aliyuncs.com/kritis-demo/alpine]
      5216338b40a7: Pushed
      3.11: digest: sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 size: 528
      放行已自动加签容器镜像的命令如下:
      kubectl -n default create deployment is-signed --image=kritis-demo-registry-vpc.cn-hongkong.cr.aliyuncs.com/kritis-demo/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45 -- sleep 10
      deployment.apps/is-signed created