2.6. 保护容器内容
要确保容器内所含内容的安全性,需要以可信的基础镜像(如红帽通用基础镜像)开始,并添加可信软件。为了检查容器镜像的持续安全性,红帽及第三方都有可用于扫描镜像的工具。
2.6.1. 确保容器内安全
应用程序和基础架构由随时可用的组件组成,许多组件都是开源软件包,如 Linux 操作系统、JBoss Web Server、PostgreSQL 和 Node.js。
这些软件包也有容器化版本可用。然而,您需要知道软件包最初来自哪里,使用什么版本,是谁构建的,以及软件包内是否有恶意代码。
需要回答的一些问题包括:
- 容器内的内容是否会破坏您的基础架构?
- 应用程序层是否存在已知的漏洞?
- 运行时和操作系统层是不是最新的?
通过从红帽通用基础镜像 (UBI) 构建容器,您可以保证您的容器镜像基础由 Red Hat Enterprise Linux 中包含的同一 RPM 打包软件组成。使用或重新分发 UBI 镜像不需要订阅。
为确保容器本身持续安全,安全扫描功能(直接从 RHEL 使用或添加到 OpenShift Container Platform)可在您使用的镜像有漏洞时发出警告。RHEL 中提供了 OpenSCAP 镜像扫描,并且可添加 Red Hat Quay Container Security Operator 来检查 OpenShift Container Platform 中使用的容器镜像。
2.6.2. 使用 UBI 创建可重新分发的镜像
要创建容器化应用程序,您通常以可信基础镜像开始,该镜像提供的组件通常由操作系统提供。这些组件包括库、实用程序以及应用程序在操作系统文件系统中应该看到的其他功能。
创建红帽通用基础镜像 (UBI) 是为了鼓励任何人在构建其自己的容器时都先使用一个完全由 Red Hat Enterprise Linux rpm 软件包及其他内容组成的容器镜像。这些 UBI 镜像会定期更新,以应用最新的安全补丁,并可自由地与构建用来包含您自己的软件的容器镜像一起使用和重新分发。
搜索红帽生态系统目录,以便查找和检查不同 UBI 镜像的健康状态。作为创建安全容器镜像的人员,您可能对两种通用 UBI 镜像类型感兴趣:
-
UBI:RHEL 7 和 8 有标准的 UBI 镜像(
ubi7/ubi
和ubi8/ubi
),以及基于这些系统的最小镜像(ubi7/ubi-minimal
和ubi8/ubi-mimimal
)。所有这些镜像已预先配置,以指向您可以使用标准yum
和dnf
命令添加到构建的容器镜像中的免费 RHEL 软件存储库。红帽鼓励人们在其他发行版(如 Fedora 和 Ubuntu)上使用这些镜像。 -
Red Hat Software Collections:在红帽生态系统目录中搜索
rhscl/
以查找为用作特定应用程序类型的基础镜像而创建的镜像。例如,有 Apache httpd (rhscl/httpd-*
)、Python (rhscl/python-*
), Ruby (rhscl/ruby-*
)、Node.js (rhscl/nodejs-*
) 和 Perl (rhscl/perl-*
) rhscl 镜像。
请记住,虽然 UBI 镜像可自由使用且可重新发布,但红帽对这些镜像的支持只能通过 Red Hat 产品订阅获得。
请参阅 Red Hat Enterprise Linux 文档中 的使用红帽通用基础镜像来获得有关如何使用标准、最小和 init UBI 镜像作为构建基础的信息。
2.6.3. RHEL 中的安全扫描
对于 Red Hat Enterprise Linux (RHEL) 系统,可从 openscap-utils
软件包中获得 OpenSCAP 扫描功能。在 RHEL 中,您可以使用 openscap-podman
命令扫描针镜像中的漏洞。请参阅 Red Hat Enterprise Linux 文档中的扫描容器和容器镜像中的漏洞。
OpenShift Container Platform 可让您在 CI/CD 过程中利用 RHEL 扫描程序。例如,您可以集成静态代码分析工具来测试源代码中的安全漏洞,并集成软件组成分析工具来标识开源库,以提供关于这些库的元数据,如已知漏洞。
2.6.3.1. 扫描 OpenShift 镜像
对于在 OpenShift Container Platform 中运行并且从 Red Hat Quay registry 中拉取的容器镜像,您可以使用 Operator 来列出这些镜像的漏洞。Red Hat Quay Container Security Operator 可以添加到 OpenShift Container Platform 中,为添加到所选命名空间的镜像提供漏洞报告。
Red Hat Quay 的容器镜像扫描由 Clair 执行。在 Red Hat Quay 中,Clair 可以搜索和报告从 RHEL、CentOS、Oracle、Alpine、Debian 和 Ubuntu 操作系统软件构建的镜像中的漏洞。
2.6.4. 集成外部扫描
OpenShift Container Platform 使用对象注解来扩展功能。外部工具(如漏洞扫描程序)可以使用元数据为镜像对象添加注解,以汇总结果和控制 Pod 执行。本节描述了该注解的公认格式,以便在控制台中可靠使用它来为用户显示有用的数据。
2.6.4.1. 镜像元数据
镜像质量数据有多种不同的类型,包括软件包漏洞和开源软件 (OSS) 许可证合规性。另外,该元数据的供应商可能不止一个。为此,保留了以下注解格式:
quality.images.openshift.io/<qualityType>.<providerId>: {}
组件 | 描述 | 可接受值 |
---|---|---|
| 元数据类型 |
|
| 供应商 ID 字符串 |
|
2.6.4.1.1. 注解键示例
quality.images.openshift.io/vulnerability.blackduck: {} quality.images.openshift.io/vulnerability.jfrog: {} quality.images.openshift.io/license.blackduck: {} quality.images.openshift.io/vulnerability.openscap: {}
镜像质量注解的值是必须遵循以下格式的结构化数据:
字段 | 必需? | 描述 | 类型 |
---|---|---|---|
| 是 | 供应商显示名称 | 字符串 |
| 是 | 扫描时间戳 | 字符串 |
| 否 | 简短描述 | 字符串 |
| 是 | 信息来源的 URL 或更多详细信息。必需,以便用户可以验证数据。 | 字符串 |
| 否 | 扫描程序版本 | 字符串 |
| 否 | 合规性通过或未通过 | 布尔值 |
| 否 | 找到的问题摘要 | 列表(请参阅下表) |
summary
字段必须遵循以下格式:
字段 | 描述 | 类型 |
---|---|---|
| 显示组件标签(例如:"critical"、"important"、"moderate"、"low" 或 "health") | 字符串 |
| 此组件的数据(例如:发现的漏洞计数或分数) | 字符串 |
|
组件索引,允许对图形表示进行排序和分配。该值范围为 | 整数 |
| 信息来源的 URL 或更多详细信息。可选。 | 字符串 |
2.6.4.1.2. 注解值示例
本示例显示了一个镜像的 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:
红帽生态系统目录注解
{ "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 } ] }
2.6.4.2. 为镜像对象添加注解
虽然 OpenShift Container Platform 最终用户操作针对的是镜像流对象,但会使用安全元数据为镜像对象添加注解。镜像对象是集群范围的,指向可能由多个镜像流和标签引用的单一镜像。
2.6.4.2.1. 注解 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 } ]" }'
2.6.4.3. 控制 Pod 执行
使用 images.openshift.io/deny-execution
镜像策略,以编程方式控制镜像是否可以运行。
2.6.4.3.1. 注解示例
annotations: images.openshift.io/deny-execution: true
2.6.4.4. 集成参考
在大多数情况下,漏洞扫描程序等外部工具会开发一个脚本或插件来监视镜像更新,执行扫描,并使用结果为相关的镜像对象添加注解。通常,这个自动化过程会调用 OpenShift Container Platform 4.11 REST API 来编写注解。有关 REST API 的常规信息,请参阅 OpenShift Container Platform REST API。
2.6.4.4.1. REST API 调用示例
以下使用 curl
的示例调用会覆盖注解值。请务必替换 <token>
、<openshift_server>
、<image_id>
和 <image_annotation>
的值。
修补 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
有效负载数据的示例:
修补调用数据
{ "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}] }" } } }
其他资源