您可以使用各种技术来确保您部署的容器包含最新的生产质量内容,并且未被篡改。这些技术包括设置构建触发器以合并最新的代码,并使用签名来确保容器来自可信来源并且未被修改。
如果在构建过程中发生某些事情,或者在部署镜像后发现漏洞,您可以使用基于策略的自动化部署工具进行修复。您可以使用触发器来重新构建和替换镜像,确保不可变容器流程,而不是修补正在运行的容器(不推荐)。
例如,您使用三个容器镜像层构建应用程序:核心、中间件和应用程序。在核心镜像中发现了一个问题,并且该镜像已重新构建。构建完成后,该镜像被推送到您的 OpenShift Container Registry。OpenShift Container Platform 检测到镜像已更改,并根据定义的触发器自动重新构建和部署应用程序镜像。此更改包含已修复的库,并确保生产代码与最新的镜像相同。
您可以使用oc set triggers
命令设置部署触发器。例如,要为名为 deployment-example 的部署设置触发器
$ oc set triggers deploy/deployment-example \
--from-image=example:latest \
--containers=web
确保部署的镜像确实来自可信来源,并且未经篡改至关重要。加密签名提供了这种保证。OpenShift Container Platform 允许集群管理员应用宽松或严格的安全策略,以反映部署环境和安全需求。两个参数定义了此策略:
一个或多个镜像仓库,以及可选的项目命名空间
信任类型,例如接受、拒绝或要求公钥
您可以使用这些策略参数来允许、拒绝或要求整个仓库、仓库的一部分或单个镜像的信任关系。使用可信的公钥,您可以确保源代码经过加密验证。策略规则适用于节点。策略可以统一应用于所有节点,也可以针对不同的节点工作负载(例如,构建、区域或环境)进行定向。
{
"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": "reject"}]
}
}
}
策略可以保存到节点上的/etc/containers/policy.json
。保存此文件到节点最好使用新的MachineConfig
对象。此示例强制执行以下规则:
要求来自 Red Hat 镜像仓库 (registry.access.redhat.com
) 的镜像必须由 Red Hat 公钥签名。
要求来自您 OpenShift Container Registry 中 openshift
命名空间的镜像必须由 Red Hat 公钥签名。
要求来自您 OpenShift Container Registry 中 production
命名空间的镜像必须由 example.com
的公钥签名。
拒绝全局default
定义中未指定的其他所有镜像仓库。
签名传输是存储和检索二进制签名 blob 的一种方式。签名传输有两种类型:
atomic
:由 OpenShift Container Platform API 管理。
docker
:作为本地文件或由 Web 服务器提供服务。
OpenShift Container Platform API 管理使用atomic
传输类型的签名。您必须将使用此签名类型的镜像存储在您的 OpenShift Container Registry 中。由于 docker/distribution extensions
API 自动发现镜像签名端点,因此无需额外配置。
使用docker
传输类型的签名由本地文件或 Web 服务器提供服务。这些签名更灵活;您可以从任何容器镜像仓库提供镜像,并使用独立服务器来传递二进制签名。
但是,docker
传输类型需要额外的配置。您必须使用主机系统上的目录(默认情况下为/etc/containers/registries.d
)中的任意命名 YAML 文件,配置节点与签名服务器的 URI。YAML 配置文件包含注册表 URI 和签名服务器 URI,或sigstore。
docker:
access.redhat.com:
sigstore: https://access.redhat.com/webassets/docker/content/sigstore
在此示例中,Red Hat 镜像仓库access.redhat.com
是为docker
传输类型提供签名的签名服务器。其 URI 定义在sigstore
参数中。您可以将此文件命名为/etc/containers/registries.d/redhat.com.yaml
,并使用 Machine Config Operator 自动将文件放置到集群中的每个节点上。由于策略和registries.d
文件是由容器运行时动态加载的,因此不需要重新启动服务。
Secret
对象类型提供了一种机制来保存敏感信息,例如密码、OpenShift Container Platform 客户端配置文件、dockercfg
文件和私有源代码库凭据。密钥将敏感内容与 Pod 解耦。您可以使用卷插件将密钥挂载到容器中,或者系统可以使用密钥代表 Pod 执行操作。
例如,要将密钥添加到您的部署配置以便它可以访问私有镜像仓库,请执行以下操作:
登录到 OpenShift Container Platform Web 控制台。
创建一个新项目。
导航到资源 → 密钥并创建一个新密钥。将密钥类型
设置为镜像密钥
,将身份验证类型
设置为镜像仓库凭据
以输入访问私有镜像仓库的凭据。
创建部署配置时(例如,从添加到项目 → 部署镜像页面),将拉取密钥
设置为您的新密钥。
配置映射类似于密钥,但旨在支持处理不包含敏感信息的字符串。ConfigMap
对象保存可用于 Pod 中的配置数据的键值对,或用于存储系统组件(如控制器)的配置数据。