3.5. 使用 policy.json 文件进行容器签名验证
您可以通过修改 policy.json 文件将 RHEL 配置为验证容器镜像签名。这样可确保 podman、buildah 和 skopeo 等工具仅从可信且未修改的源拉取镜像。
对于系统范围的配置,您可以修改 /etc/containers/policy.json 文件。对于无根用户,您可以在 $HOME/.config/containers/policy.json 文件中应用这些规则。
- 基于
transport、registry和namespace的策略范围限定 policy.json文件结构验证规则分层,以确定哪些它们应用到特定的镜像。您可以使用以下元素对这些策略进行范围限定:-
default:default 数组指定了回退策略,该策略适用于镜像不匹配任何已定义作用域的情况。 -
transport:您可以在 transports 对象中定义自定义策略。对于容器注册表,您可以在docker传输下定义自定义策略。 registry和namespace:您可以使用transport部分在不同的机构级别配置信任策略。您以以下任一方式对策略进行范围限定:- 将策略应用到整个注册表,例如,用于单一公司专用注册表的<registry>。
-
将策略缩小到特定命名空间或存储库,例如用于公共注册表的
<registry>/<namespace>。
-
- 指定签名证书
您可以在注册表或命名空间块中定义签名要求,以强制相应的密钥或证书必须验证特定范围内的镜像。您可以配置以下键值对:
-
type:signedBy:指定容器工具仅接受具有有效签名的镜像。 -
keyType:指定您使用的密钥的格式,例如GPGKeys。 -
keyPath:指定用于验证的本地公钥或证书文件的绝对路径,例如testdata/sequoia-key.pgp。
-
您可以配置默认规则来接受所有内容。但是,您可以在 docker 传输中限制特定范围的命名空间,如 localhost:5003/simple-sq-signed-centos,来严格要求有效的签名。例如:
{
"default": [
{
"type": "insecureAcceptAnything"
}
],
"transports": {
"docker": {
"localhost:5003/simple-sq-signed-centos": [
{
"type": "signedBy",
"keyType": "GPGKeys",
"keyPath": "testdata/sequoia-key.pgp"
}
]
}
}
}
配置处于活跃状态后,您必须运行 podman pull <registry>/<namespace>/<image> 命令。Podman 会按照您在 policy.json 文件中配置的策略,自动强制要求镜像必须存在签名。如果您试图从配置的注册表中拉取未签名或使用错误密钥的镜像,命令会失败。