×

为确保容器内内容的安全,您需要从受信任的基础镜像(例如 Red Hat 通用基础镜像)开始,并添加受信任的软件。要检查容器镜像的持续安全性,Red Hat 和第三方都提供用于扫描镜像的工具。

容器内部安全

应用程序和基础设施由现成的组件组成,其中许多是开源软件包,例如 Linux 操作系统、JBoss Web Server、PostgreSQL 和 Node.js。

这些软件包的容器化版本也可供使用。但是,您需要知道这些软件包最初来自哪里,使用了哪些版本,谁构建了它们,以及它们内部是否存在任何恶意代码。

需要回答的一些问题包括

  • 容器内部的内容会危及您的基础设施吗?

  • 应用程序层是否存在已知漏洞?

  • 运行时和操作系统层是否是最新的?

通过从 Red Hat 通用基础镜像 (UBI) 构建容器,您可以确保容器镜像的基础由 Red Hat Enterprise Linux 中包含的相同 RPM 打包软件组成。使用或重新分发 UBI 镜像无需订阅。

为了确保容器本身的持续安全性,可以直接从 RHEL 使用或添加到 OpenShift Container Platform 的安全扫描功能可以在您使用的镜像存在漏洞时发出警报。OpenSCAP 镜像扫描功能在 RHEL 中可用,并且可以添加 Red Hat Quay 容器安全操作符 来检查 OpenShift Container Platform 中使用的容器镜像。

使用 UBI 创建可再分发镜像

要创建容器化应用程序,通常从受信任的基础镜像开始,该镜像提供通常由操作系统提供的组件。这些包括库、实用程序和应用程序期望在操作系统的文件系统中看到的其他功能。

Red Hat 通用基础镜像 (UBI) 的创建是为了鼓励任何构建自己容器的人都从完全由 Red Hat Enterprise Linux rpm 软件包和其他内容组成的镜像开始。这些 UBI 镜像会定期更新以保持与安全补丁同步,并且可以免费使用和重新分发,其中包含您自己的软件的构建容器镜像。

搜索 Red Hat 生态系统目录 以查找和检查不同 UBI 镜像的运行状况。作为创建安全容器镜像的人员,您可能会对这两种类型的 UBI 镜像感兴趣

  • UBI:提供适用于 RHEL 7、8 和 9 的标准 UBI 镜像(ubi7/ubiubi8/ubiubi9/ubi),以及基于这些系统的精简镜像(ubi7/ubi-minimalubi8/ubi-mimimalubi9/ubi-minimal)。所有这些镜像都预先配置为指向 RHEL 软件的免费资源库,您可以使用标准的 yumdnf 命令将其添加到您构建的容器镜像中。Red Hat 鼓励用户在其他发行版(例如 Fedora 和 Ubuntu)上使用这些镜像。

  • Red Hat 软件集合:在 Red Hat 生态系统目录中搜索 rhscl/ 以查找创建的镜像,这些镜像可用作特定类型应用程序的基础镜像。例如,有 Apache httpd(rhscl/httpd-*)、Python(rhscl/python-*)、Ruby(rhscl/ruby-*)、Node.js(rhscl/nodejs-*)和 Perl(rhscl/perl-*)rhscl 镜像。

请记住,虽然 UBI 镜像可免费获取和再分发,但 Red Hat 对这些镜像的支持仅通过 Red Hat 产品订阅提供。

有关如何在标准、精简和 init UBI 镜像上使用和构建的信息,请参阅 Red Hat Enterprise Linux 文档中的使用 Red Hat 通用基础镜像

RHEL 中的安全扫描

对于 Red Hat Enterprise Linux (RHEL) 系统,OpenSCAP 扫描可从 openscap-utils 软件包获得。在 RHEL 中,您可以使用 openscap-podman 命令扫描镜像中的漏洞。请参阅 Red Hat Enterprise Linux 文档中的扫描容器和容器镜像中的漏洞

OpenShift Container Platform 使您能够利用 RHEL 扫描程序和您的 CI/CD 流程。例如,您可以集成静态代码分析工具(测试源代码中的安全缺陷)和软件成分分析工具(识别开源库并提供有关这些库的元数据,例如已知的漏洞)。

扫描 OpenShift 镜像

对于在 OpenShift Container Platform 中运行并从 Red Hat Quay 注册表中提取的容器镜像,您可以使用 Operator 列出这些镜像的漏洞。Red Hat Quay 容器安全 Operator 可添加到 OpenShift Container Platform 中,为添加到所选命名空间的镜像提供漏洞报告。

Red Hat Quay 的容器镜像扫描由Clair 执行。在 Red Hat Quay 中,Clair 可以搜索并报告基于 RHEL、CentOS、Oracle、Alpine、Debian 和 Ubuntu 操作系统软件构建的镜像中的漏洞。

集成外部扫描

OpenShift Container Platform 使用对象注解来扩展功能。外部工具(例如漏洞扫描程序)可以使用元数据注释镜像对象,以汇总结果并控制 pod 执行。本节描述此注解的识别格式,以便可以在控制台中可靠地将其用于向用户显示有用的数据。

镜像元数据

存在不同类型的镜像质量数据,包括软件包漏洞和开源软件 (OSS) 许可证合规性。此外,此元数据可能有多个提供者。为此,已保留以下注解格式。

quality.images.openshift.io/<qualityType>.<providerId>: {}
表 1. 注解键格式
组件 描述 可接受的值

qualityType

元数据类型

vulnerability(漏洞)
license(许可证)
operations(操作)
policy(策略)

providerId

提供商 ID 字符串

openscap
redhatcatalog
redhatinsights
blackduck
jfrog

注解键示例

quality.images.openshift.io/vulnerability.blackduck: {}
quality.images.openshift.io/vulnerability.jfrog: {}
quality.images.openshift.io/license.blackduck: {}
quality.images.openshift.io/vulnerability.openscap: {}

镜像质量注解的值是结构化数据,必须符合以下格式。

表 2. 注解值格式
字段 必需? 描述 类型

name

提供商显示名称

字符串

timestamp

扫描时间戳

字符串

description

简短描述

字符串

reference

信息来源或更多详细信息的 URL。必需,以便用户可以验证数据。

字符串

scannerVersion

扫描程序版本

字符串

compliant

合规性通过或失败

布尔值

summary

发现问题的摘要

列表(见下表)

summary 字段必须符合以下格式。

表 3. summary 字段值格式
字段 描述 类型

label

组件的显示标签(例如,“严重”、“重要”、“中等”、“低”或“健康”)

字符串

data

此组件的数据(例如,发现的漏洞数量或分数)

字符串

severityIndex

组件索引,允许排序和分配图形表示。值为范围 0..3,其中 0 = 低。

整数

reference

信息来源或更多详细信息的 URL。可选。

字符串

注解值示例

此示例显示具有漏洞摘要数据和合规性布尔值的镜像的 OpenSCAP 注解。

OpenSCAP 注解
{
  "name": "OpenSCAP",
  "description": "OpenSCAP vulnerability score",
  "timestamp": "2016-09-08T05:04:46Z",
  "reference": "https://www.open-scap.org/930492",
  "compliant": true,
  "scannerVersion": "1.2",
  "summary": [
    { "label": "critical", "data": "4", "severityIndex": 3, "reference": null },
    { "label": "important", "data": "12", "severityIndex": 2, "reference": null },
    { "label": "moderate", "data": "8", "severityIndex": 1, "reference": null },
    { "label": "low", "data": "26", "severityIndex": 0, "reference": null }
  ]
}

此示例显示具有健康索引数据和用于更多详细信息的外部 URL 的镜像的Red Hat 生态系统目录的容器镜像部分 注解。

Red Hat 生态系统目录注解
{
  "name": "Red Hat Ecosystem Catalog",
  "description": "Container health index",
  "timestamp": "2016-09-08T05:04:46Z",
  "reference": "https://access.redhat.com/errata/RHBA-2016:1566",
  "compliant": null,
  "scannerVersion": "1.2",
  "summary": [
    { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null }
  ]
}

注释镜像对象

虽然镜像流对象是 OpenShift Container Platform 的最终用户操作的对象,但镜像对象是用安全元数据进行注释的。镜像对象是集群范围的,指向单个镜像,该镜像可能被许多镜像流和标签引用。

注释 CLI 命令示例

<image> 替换为镜像摘要,例如 sha256:401e359e0f45bfdcf004e258b72e253fd07fba8cc5c6f2ed4f4608fb119ecc2

$ oc annotate image <image> \
    quality.images.openshift.io/vulnerability.redhatcatalog='{ \
    "name": "Red Hat Ecosystem Catalog", \
    "description": "Container health index", \
    "timestamp": "2020-06-01T05:04:46Z", \
    "compliant": null, \
    "scannerVersion": "1.2", \
    "reference": "https://access.redhat.com/errata/RHBA-2020:2347", \
    "summary": "[ \
      { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null } ]" }'

控制 pod 执行

使用 images.openshift.io/deny-execution 镜像策略以编程方式控制是否可以运行镜像。

注解示例

annotations:
  images.openshift.io/deny-execution: true

集成参考

在大多数情况下,外部工具(例如漏洞扫描程序)会开发一个脚本或插件来监视镜像更新、执行扫描以及使用结果注释关联的镜像对象。此自动化通常调用 OpenShift Container Platform 4.17 REST API 来写入注解。有关 REST API 的一般信息,请参阅 OpenShift Container Platform REST API。

REST API 调用示例

以下使用 curl 的示例调用会覆盖注解的值。请务必替换 <token><openshift_server><image_id><image_annotation> 的值。

PATCH API 调用
$ curl -X PATCH \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/merge-patch+json" \
  https://<openshift_server>:6443/apis/image.openshift.io/v1/images/<image_id> \
  --data '{ <image_annotation> }'

以下是 PATCH 有效负载数据的示例。

PATCH 调用数据
{
"metadata": {
  "annotations": {
    "quality.images.openshift.io/vulnerability.redhatcatalog":
       "{ 'name': 'Red Hat Ecosystem Catalog', 'description': 'Container health index', 'timestamp': '2020-06-01T05:04:46Z', 'compliant': null, 'reference': 'https://access.redhat.com/errata/RHBA-2020:2347', 'summary': [{'label': 'Health index', 'data': '4', 'severityIndex': 1, 'reference': null}] }"
    }
  }
}
其他资源