配置本地Docker镜像仓库仅接受可验证镜像的方法
配置本地Docker仓库仅接受可验证的签名镜像
当然可以在仓库侧配置强制校验,避免客户端侧验证被绕过。以下是几种可行方案:
1. 给原生Docker Registry添加Webhook签名校验
原生的registry:2镜像支持通过Webhook触发事件,你可以搭建一个自定义校验服务,在镜像推送时自动验证签名:
- 编写一个轻量Webhook服务(用Python/Go均可),接收Registry推送事件,提取镜像的
digest和名称。 - 在服务中执行
cosign verify --key <你的公钥路径> <仓库地址>/<镜像名>@<digest>,根据命令退出码判断签名是否合法。 - 验证通过返回
200 OK给Registry,否则返回403 Forbidden,Registry会自动拒绝此次推送。 - 修改Registry的配置文件(
config.yml),添加Webhook配置:notifications: endpoints: - name: cosign-validator url: http://<你的Webhook服务地址>/validate timeout: 1s events: - action: push
2. 使用Harbor这类支持原生签名校验的仓库
Harbor作为企业级镜像仓库,原生支持内容信任和签名强制验证:
- 创建Harbor项目后,开启「内容信任」功能。
- 导入你的Cosign公钥到Harbor的信任根列表。
- 在项目的「镜像仓库设置」中,配置推送规则为仅接受已签名且验证通过的镜像,未签名或签名无效的推送会直接被拦截。
3. Kubernetes环境下用准入控制器拦截(如果仓库部署在K8s中)
如果你的本地仓库运行在Kubernetes集群内,可以用Kyverno或OPA Gatekeeper这类工具做准入控制:
- 编写校验规则,针对镜像推送请求,自动调用Cosign验证签名合法性。
- 规则生效后,未通过签名验证的镜像推送请求会被直接拒绝。
注意:客户端侧的Cosign验证之所以存在被绕过的风险,是因为验证逻辑完全由客户端控制,攻击者可以修改客户端脚本跳过验证直接推送。只有在仓库侧做强制校验,才能从根源上确保只有合法签名的镜像被接收。
内容的提问来源于stack exchange,提问作者Muzammil
相关产品推荐
相关产品推荐

