如何使用Podman对容器镜像进行签名和分发
对容器镜像进行签名源于仅信任专用镜像提供程序的动机,以缓解MITM 攻击或对容器注册表的攻击,对镜像进行签名的一种方法是使用GPG密钥,此技术通常与任何符合 OCI 的容器注册表兼容
从技术角度来看,我们可以在将镜像推送到远程注册表之前利用Podman对镜像进行签名。之后,所有运行Podman的系统都必须配置为从远程服务器检索签名,远程服务器可以是任何简单的Web服务器。这意味着在镜像拉取操作期间,每个未签名的镜像都将被拒绝。
首先创建一个GPG密钥对或选择一个本地可用的密钥对。要生成新的GPG密钥,只需运行并按照交互式对话框进行操作即可。现在我们应该能够验证密钥是否在本地存在:gpg --full-gen-key
[root@100 ~]# gpg --list-keys 1@2.com
pub rsa2048 2022-08-16 [SC]
3B243ED7F402AAC7E1F0CA3A38E9251EA9154B30
uid [ultimate] Frices <1@2.com>
sub rsa2048 2022-08-16 [E]
可以简单地在本地机器上启动一个容器registry
[root@100 ~]# podman run -d --name test -p 5000:5000 registry
0b647fe61f61181aa1cbb0fe9111a0e6eaa913f11c731d3cceddaa1478c44ec3
registry对镜像签名一无所知,它只是为容器镜像提供远程存储。这意味着,如果我们要对镜像进行签名,则必须注意如何分发签名。
选择一个标准镜像:alpine
[root@100 ~]# podman pull docker.io/library/alpine
重新标记镜像以将其指向本地registry
[root@100 ~]# podman tag alpine localhost:5000/alpine
修改系统范围的registry配置,/etc/containers/registries.d/default.yaml
[root@100 ~]# vim /etc/containers/registries.d/default.yaml
default-docker:
sigstore: http://localhost:8000
sigstore-staging: file:///var/lib/containers/sigstore
- sigstore:引用 Web 服务器进行签名读取
- sigstore-staging:引用文件路径以进行签名写入
推送并签署镜像
[root@100 ~]# podman push --tls-verify=false --sign-by 111@222.com localhost:5000/alpine
Getting image source signatures
Copying blob 994393dc58e7 done
Copying config 9c6f072447 done
Writing manifest to image destination
Signing manifest
Storing signatures
现在看一下系统签名存储
[root@100 ~]# ls /var/lib/containers/sigstore/
'alpine@sha256=e89c741df8cf66a2ada32d34844bcf6b5cfe3a9e2f6846b4c90b9165bc87d7ef'
在本地暂存签名存储中启动一个新服务器
/etc/containers/registries.d/default.yamlhttp://localhost:8000
[root@100 ~]# bash -c 'cd /var/lib/containers/sigstore && python3 -m http.server'
Ser