以 GNU Privacy Guard(GPG)密钥为例
如果使用 Podman 在将镜像推送到镜像仓库前对其进行了签名,则拉取时的客户端必须配置为从远程服务器获取签名,未签名的镜像都将被拒绝
1. 生成 GPG密钥
gpg --full-gen-key
# 验证密钥
gpg --list-keys xxx@gmail.com2. 拉取镜像
# 拉取镜像
podman pull docker://docker.io/alpine:latest
# 查看
podman images alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/alpine latest e7b39c54cdec 4 weeks ago 8.74 MB
# 自定义 tag(localhost:5000 为本地镜像仓库)
sudo podman tag alpine localhost:5000/alpine3. 修改配置
/etc/containers/registries.d/default.yaml
default-docker:
sigstore: http://localhost:8000 # 引用网络服务器进行签名读取
sigstore-staging: file:///var/lib/containers/sigstore # 引用文件路径进行签名写入4. 签名并推送镜像
sudo -E GNUPGHOME=$HOME/.gnupg \
podman push \
--tls-verify=false \
--sign-by sgrunert@suse.com \
localhost:5000/alpine
…
Storing signatures推送镜像后,可以看到产生的新的可用签名
ls /var/lib/containers/sigstore
'alpine@sha256=e9b65ef660a3ff91d28cc50eba84f21798a6c5c39b4dd165047db49e84ae1fb9'5. 自定义本地8000端口服务
bash -c 'cd /var/lib/containers/sigstore && python3 -m http.server'
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...6. 强制签名要求配置
nano /etc/containers/policy.json
{
"default": [{ "type": "insecureAcceptAnything" }],
"transports": {
"docker": {
"localhost:5000": [
{
"type": "signedBy",
"keyType": "GPGKeys",
"keyPath": "/tmp/key.gpg"
}
]
}
}
}# 将 GPG 密钥放置到 keyPath 目录下
gpg --output /tmp/key.gpg --armor --export xxx@gmail.com7. 拉取测试
# 先删除本地已经拉取的 alpine 镜像
podman rmi docker.io/alpine localhost:5000/alpine
# 重新拉取
podman pull --tls-verify=false localhost:5000/alpine此时在8000端口的服务日志中可以看到访问签名的日志
8. 错误配置示例
keyPath 路径配置错误,在拉取镜像时会报错
sudo podman pull --tls-verify=false localhost:5000/alpine
Trying to pull localhost:5000/alpine...
Error: pulling image "localhost:5000/alpine": unable to pull localhost:5000/alpine: unable to pull image: Source image rejected: Invalid GPG signature:
......
评论 (0)