kritis-validation-hook组件是部署可信容器环节中进行容器镜像签名验证的关键组件。在部署前对容器镜像进行签名验证,以确保集群中仅部署经过可信授权方进行过签名的容器镜像,降低在您的环境中运行意外或恶意代码的风险。本文通过示例介绍kritis-validation-hook组件的工作效果。
前提条件
已创建托管版或专有版集群。具体操作,请参见创建ACK托管集群或创建ACK专有集群(已停止新建)。
背景信息
kritis-validation-hook组件在开源的kritis软件的基础上增加了对阿里云容器镜像服务ACR的深度集成,支持验证通过阿里云密钥管理服务KMS签名的容器镜像。kritis-validation-hook组件通过与云安全中心、KMS和ACR的深度合作,实现了全自动化的对容器镜像进行加签和验签,协助您构建更安全的集群运行环境。实现自动验证容器镜像签名,请参见使用kritis-validation-hook组件实现自动验证容器镜像签名。
配置资源访问权限
为了正常运行kritis-validation-hook组件,需要确保集群使用的RAM角色拥有以下资源访问权限:
若您使用的是托管版集群,需要确保集群使用的Worker RAM角色拥有以下资源访问权限。
若您使用的是专有版集群,需要确保集群使用的Master RAM角色和Worker RAM角色拥有以下资源访问权限。
"cr:ListInstance",
"cr:ListMetadataOccurrences"
如果您的集群使用的RAM角色没有上述访问权限,您可以通过以下方法添加组件所需的资源访问权限。
创建自定义权限策略,策略内容如下。具体操作,请参见步骤一:创建自定义权限策略。
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
为集群的Worker RAM角色授权。具体操作,请参见步骤二:为集群的Worker RAM角色授权。
说明如果是专有版集群,您需要为集群的Master RAM角色也进行以上授权。
启用镜像签名验证示例
以下通过对当前default命名空间启用镜像签名验证为例,展示kritis-validation-hook组件的工作效果。 本示例的镜像加签信息如下,您可以根据获取来源中的提示信息替换为实际的镜像签名信息:
加签信息 | 示例值 | 获取步骤 | 对应YAML字段 |
KMS公钥(base64) |
|
| |
KMS key-id |
|
| |
证明者名称 | demo-aa |
| |
加签镜像 |
| N/A | N/A |
因为镜像签名不属于kritis-validation-hook组件的工作范畴,所以示例略过签名的步骤。详细的镜像加签步骤,请参见使用容器镜像加签。
配置AttestationAuthority,声明相应的可信授权方。
使用以下内容创建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-****
执行以下命令,配置可信授权方信息。
kubectl apply -f AttestationAuthority.yaml
配置GenericAttestationPolicy,声明验证签名策略及使用可信授权方的信息验证签名。
使用以下内容创建GenericAttestationPolicy.yaml文件。
apiVersion: kritis.grafeas.io/v1beta1 kind: GenericAttestationPolicy metadata: name: demo-gap spec: attestationAuthorityNames: - demo-aa
执行以下命令配置验证签名策略。
kubectl apply -f GenericAttestationPolicy.yaml
测试镜像签名验证功能,部署未经信任授权方签名的镜像。
执行以下命令测试镜像签名验证功能。
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:****
从预期输出可得,镜像签名验证功能拒绝部署未经信任授权方签名的镜像。
测试镜像签名验证功能,部署经信任授权方签名的镜像。
执行以下命令测试镜像签名验证功能。
请替换以下镜像地址为实际已加签的镜像。
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的系统镜像加入白名单,可以通过以下操作配置。
使用以下内容创建
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
。
常见的白名单如下,您可以根据实际需求添加。
# 容器服务ACK使用的镜像 - namePattern: 'registry*.*.aliyuncs.com/acs/*' - namePattern: 'registry-*.ack.aliyuncs.com/acs/*' # 容器服务ACK使用的镜像(限定中国地域) - 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/*'
执行以下命令配置白名单。
kubectl apply -f kritis-admission-allowlist-acs.yaml
预期输出:
admissionallowlist.kritis.grafeas.io/allow-acs-images created
执行以下命令验证白名单配置是否成功。
kubectl get admissionallowlists.kritis.grafeas.io
预期输出:
NAME AGE allow-acs-images 2m22s