×

您可以使用各种技术来确保您部署的容器包含最新的生产质量内容,并且未被篡改。这些技术包括设置构建触发器以合并最新的代码,并使用签名来确保容器来自可信来源并且未被修改。

使用触发器控制容器部署

如果在构建过程中发生某些事情,或者在部署镜像后发现漏洞,您可以使用基于策略的自动化部署工具进行修复。您可以使用触发器来重新构建和替换镜像,确保不可变容器流程,而不是修补正在运行的容器(不推荐)。

Secure Deployments

例如,您使用三个容器镜像层构建应用程序:核心、中间件和应用程序。在核心镜像中发现了一个问题,并且该镜像已重新构建。构建完成后,该镜像被推送到您的 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

registries.d 文件示例
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 执行操作。

例如,要将密钥添加到您的部署配置以便它可以访问私有镜像仓库,请执行以下操作:

步骤
  1. 登录到 OpenShift Container Platform Web 控制台。

  2. 创建一个新项目。

  3. 导航到资源密钥并创建一个新密钥。将密钥类型设置为镜像密钥,将身份验证类型设置为镜像仓库凭据以输入访问私有镜像仓库的凭据。

  4. 创建部署配置时(例如,从添加到项目部署镜像页面),将拉取密钥设置为您的新密钥。

配置映射类似于密钥,但旨在支持处理不包含敏感信息的字符串。ConfigMap 对象保存可用于 Pod 中的配置数据的键值对,或用于存储系统组件(如控制器)的配置数据。

自动化持续部署

您可以将您自己的持续部署 (CD) 工具与 OpenShift Container Platform 集成。

通过利用 CI/CD 和 OpenShift Container Platform,您可以自动化重建应用程序以包含最新修复程序、测试和确保其在环境中所有位置部署的过程。