起因
我最近在搞 ACS (ADVANCED CLUSTER SECURITY FOR KUBERNETES),其中有一个功能是验证镜像签名。
它是个什么?
Cosign 是一个用于签名和验证容器镜像的工具,它允许用户对镜像进行数字签名,并验证签名以确保镜像的完整性和来源。通过使用 Cosign,你可以创建和管理镜像的签名,并在部署时验证这些签名,以确保镜像的安全性。
如何使用?
一、安装程序
github 地址:https://github.com/sigstore/cosign
下载地址:https://github.com/sigstore/cosign/releases/tag/v2.2.2
- 我使用的是下载 rpm 包(自行找合适自己的安装方式)
wget https://github.com/sigstore/cosign/releases/download/v2.2.2/cosign-2.2.2-1.x86_64.rpm
- 安装
rpm -ivh cosign-2.2.2-1.x86_64.rpm
二、验证程序
查看版本
三、生成 key
cosign generate-key-pair
其中的
- cosign.key 是私钥
- cosign.pub 是公钥
注意:输入保护key 密码时,我直接回车了,这里如果有需要的话可以设置。后续上镜像前面时会用到。
四、使用 cosign 登录镜像注册中心(docker.io 或者私有仓库)
cosign sign --key cosign.key docker.io/ljtian/http-server-gen:v0.2
注意1:上面有个告警,有需要的人可以仔细看一下,演示可以跳过
注意2:下面报错为未授权登录,我看网上其他文章都没有对这个描述,也没有介绍。我以为是常见podman login、 docker login。 重新进行了 podman login 登录,发现并没有解决。执行 cosign help 发现 cosign 是一自己上传的,并不是通过 podman 或者 docker 这类工具上传。所以需要执行登录操作。登录成功之后再执行上面的命令
cosign login domain.com -u **** -p ****
目前做的很粗糙只能通过 -u -p 执行,不能交互方式执行。
五、生成签名文件并进行上传
cosign sign --key cosign.key docker.io/ljtian/http-server-gen:v0.2
去镜像注册中心查看
可以看到上传了一个 .sig 签名镜像
注意:红框对应的值与进行签名的镜像sha256值是一致的,所以,签名跟这个值一一对应,并不是标签 v0.2。 如果我现在再推送一个新的v0.2标签。新的 v0.2 将是未签名的镜像。这也是前面警告所描述的信息。
六、验证签名
cosign verify --key cosign.pub index.docker.io/ljtian/http-server-gen:v0.2 | jq .
签名没有问题。
资料来源
cosign 官网: https://github.com/sigstore/cosign