起因

我最近在搞 ACS (ADVANCED CLUSTER SECURITY FOR KUBERNETES),其中有一个功能是验证镜像签名。

cosign 镜像签名工具_镜像工具

它是个什么?

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

cosign 镜像签名工具_镜像工具_02

二、验证程序

查看版本

cosign 镜像签名工具_acs_03

三、生成 key

cosign generate-key-pair

cosign 镜像签名工具_acs_04

其中的

  • cosign.key 是私钥
  • cosign.pub 是公钥

注意:输入保护key 密码时,我直接回车了,这里如果有需要的话可以设置。后续上镜像前面时会用到。

四、使用 cosign 登录镜像注册中心(docker.io 或者私有仓库)

cosign sign --key cosign.key docker.io/ljtian/http-server-gen:v0.2

cosign 镜像签名工具_镜像工具_05

注意1:上面有个告警,有需要的人可以仔细看一下,演示可以跳过

注意2:下面报错为未授权登录,我看网上其他文章都没有对这个描述,也没有介绍。我以为是常见podman login、 docker login。 重新进行了 podman login 登录,发现并没有解决。执行 cosign help 发现 cosign 是自己上传的,并不是通过 podman 或者 docker 这类工具上传。所以需要执行登录操作。登录成功之后再执行上面的命令

cosign login domain.com -u **** -p ****

目前做的很粗糙只能通过 -u -p 执行,不能交互方式执行。

cosign 镜像签名工具_k8s_06

五、生成签名文件并进行上传

cosign sign --key cosign.key docker.io/ljtian/http-server-gen:v0.2

cosign 镜像签名工具_cosign_07

去镜像注册中心查看

cosign 镜像签名工具_cosign_08

可以看到上传了一个 .sig 签名镜像

注意:红框对应的值与进行签名的镜像sha256值是一致的,所以,签名跟这个值一一对应,并不是标签 v0.2。 如果我现在再推送一个新的v0.2标签。新的 v0.2 将是未签名的镜像。这也是前面警告所描述的信息。

六、验证签名

cosign verify --key cosign.pub index.docker.io/ljtian/http-server-gen:v0.2 | jq .

cosign 镜像签名工具_cosign_09

签名没有问题。

资料来源

cosign 官网: https://github.com/sigstore/cosign