6.2. 控制可以部署的镜像源
务必要确保实际部署了所需的镜像,确保它们来自可信源,且未被更改。加密签名提供了这一保证。OpenShift Container Platform 可让集群管理员应用广泛或狭窄的安全策略,以反应部署环境和安全要求。该策略由两个参数定义:
- 一个或多个带有可选项目命名空间的 registry
- 信任类型(接受、拒绝或要求公钥)
使用这些策略参数,可以将 registry 或 registry 的部分(甚至单独的镜像)列入白名单(接受)、列入黑名单(拒绝)或者使用可信公钥定义信任关系,以确保以加密方式验证源。该策略规则应用于节点。策略可以在所有节点中统一应用,或针对不同的节点工作负载(例如:构建、区域或环境)加以应用。
镜像签名策略文件示例
{ "default": [{"type": "reject"}], "transports": { "docker": { "access.redhat.com": [ { "type": "signedBy", "keyType": "GPGKeys", "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release" } ] }, "atomic": { "172.30.1.1:5000/openshift": [ { "type": "signedBy", "keyType": "GPGKeys", "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release" } ], "172.30.1.1:5000/production": [ { "type": "signedBy", "keyType": "GPGKeys", "keyPath": "/etc/pki/example.com/pubkey" } ], "172.30.1.1:5000": [{"type": "insecureAcceptAnything"}] } } }
该策略可以在节点上保存为 /etc/containers/policy.json。这个示例强制执行以下规则:
-
要求 Red Hat Registry(
access.redhat.com
)中的镜像由红帽公钥签名。 - 要求 openshift 命名空间中的 OpenShift Container Registry 中的镜像由红帽公钥签名。
-
要求 production 命名空间中的 OpenShift Container Registry 中的镜像由
example.com
的公钥签名。 -
拒绝未由全局
默认
定义指定的所有其他 registry。
有关配置主机的具体步骤,请参阅启用镜像签名支持。更多信息,请参见以下部分签名传输。有关镜像签名策略的详情,请参阅 Signature 验证策略文件格式源代码文档。
6.2.1. 签名传输
签名传输是一种存储和检索二进制签名 blob 的方法。签名传输有两种类型。
-
Atomic
:由 OpenShift Container Platform API 管理。 -
Docker
:作为本地文件或通过 Web 服务器提供。
OpenShift Container Platform API 负责管理使用 atomic
传输类型的签名。您必须将使用此签名类型的镜像存储在 OpenShift Container Registry 中。由于 docker/distribution extensions API
会自动发现镜像签名端点,因此不需要额外的配置。
使用 docker
传输类型的签名由本地文件或者 Web 服务器提供。这些签名更为灵活,您可以提供来自任何容器镜像 registry 的镜像,并使用独立的服务器来提供二进制签名。根据 Signature 访问协议,您可以直接访问每个镜像的签名 ; 服务器目录的根用户不会显示其文件结构。
但是,docker
传输类型需要进行额外的配置。您必须为节点配置签名服务器的 URI,方法是将随机命名的 YAML 文件放在主机系统上的目录中,默认为 /etc/containers/registries.d。YAML 配置文件包含 registry URI 和签名服务器 URI,或 sigstore:
Registries.d 文件示例
docker: access.redhat.com: sigstore: https://access.redhat.com/webassets/docker/content/sigstore
在这个示例中,Red Hat Registry access.redhat.com
是为 docker
传输类型提供签名的签名服务器。其 URI 在 sigstore
参数中定义。您可以将此文件命名为 /etc/containers/registries.d/redhat.com.yaml,并使用 Ansible 自动将文件放在集群中的每个节点上。由于策略和 registry.d 文件由容器运行时动态加载,因此不需要重启服务。
如需更多详细信息,请参阅 注册配置目录 或者 签名访问协议 源代码文档。
深入阅读
OpenShift Container Platform 集群管理指南
红帽知识库
源代码参考