3.3. 将外部扫描工具与 OpenShift 集成
OpenShift Container Platform 使用对象注解来扩展功能。外部工具(如漏洞扫描程序)可能会使用元数据为镜像对象添加注解,以汇总结果并控制 Pod 执行。本节描述了该注解的可识别格式,以便在控制台中可靠使用它来为用户显示有用的数据。
3.3.1. 镜像元数据
镜像质量数据有多种不同的类型,包括软件包漏洞和开源软件 (OSS) 许可证合规性。另外,该元数据的供应商可能不止一个。为此,保留了以下注解格式:
quality.images.openshift.io/<qualityType>.<providerId>: {}
组件 | 描述 | 可接受的值 |
---|---|---|
| 元数据类型 |
|
| 供应商 ID 字符串 |
|
3.3.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 和/或更多详情。可选。 | 字符串 |
3.3.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 } ] }
本例演示了一个镜像的 Red Hat Container Catalog 注解,带有健康状态索引数据以及指向更多详情的一个外部 URL:
Red Hat Container Catalog 注解
{ "name": "Red Hat Container 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 } ] }
3.3.2. 为镜像对象添加注解
虽然 OpenShift Container Platform 最终用户操作针对的是镜像流对象,但会使用安全元数据为镜像对象添加注解。镜像对象是集群范围的,指向可能由多个镜像流和标签引用的单一镜像。
3.3.2.1. 注解 CLI 命令示例
将 <image>
替换为一个镜像摘要(digest)。例如 sha256:fec8a395afe3e804b3db5cb277869142d2b5c561ebb517585566e160ff321988
:
$ oc annotate image <image> \ quality.images.openshift.io/vulnerability.redhatcatalog='{ \ "name": "Red Hat Container Catalog", \ "description": "Container health index", \ "timestamp": "2016-09-08T05:04:46Z", \ "compliant": null, \ "scannerVersion": "1.2", \ "reference": "https://access.redhat.com/errata/RHBA-2016:1566", \ "summary": "[ \ { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null } ]" }'
3.3.3. 控制 Pod 执行
为了通过编程来控制镜像是否可以运行,可以使用 images.openshift.io/deny-execution
镜像策略。如需更多信息,请参阅镜像策略。
3.3.3.1. 注解示例
annotations: images.openshift.io/deny-execution: true
3.3.4. 集成参考
在大多数情况下,漏洞扫描程序等外部工具会开发一个脚本或插件来监视镜像更新,执行扫描,并使用结果为相关的镜像对象添加注解。通常,这个自动化过程会调用 OpenShift Container Platform REST API 来编写注解。有关 REST API 和使用 PATCH
更新镜像的信息,请参阅 REST API 参考。
3.3.4.1. 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>:8443/oapi/v1/images/<image_id> \ --data '{ <image_annotation> }'
以下是 PATCH
有效负载数据的示例:
Patch 调用数据
{ "metadata": { "annotations": { "quality.images.openshift.io/vulnerability.redhatcatalog": "{ 'name': 'Red Hat Container Catalog', 'description': 'Container health index', 'timestamp': '2016-09-08T05:04:46Z', 'compliant': null, 'reference': 'https://access.redhat.com/errata/RHBA-2016:1566', 'summary': [{'label': 'Health index', 'data': '4', 'severityIndex': 1, 'reference': null}] }" } } }