注册表扫描配置
注册表扫描要求在主机/节点上部署 SUSE® Security Allinone 或控制器容器。请参见 安装/部署 部分以了解如何部署 SUSE® Security 容器。在登录管理器后,从 SUSE® Security 控制台配置注册表扫描。
此外,请确保部署并配置了一个 SUSE® Security 扫描器容器,以连接到 Allinone 或控制器。在 4.0 及更高版本中,neuvector/scanner 容器必须与 allinone 或控制器分开部署。
|
注册镜像扫描由扫描器执行,镜像在内存中被拉取和展开。如果预期展开的镜像大小超过 500MB,请考虑将扫描器内存增加到 1.5GB 或更多,以提供容量和余量。 |
为了提高注册表扫描的性能和可伸缩性,可以在不同节点上部署多个扫描器 Pod,以将扫描任务分配给多个扫描器。有关详细信息,请参见 多个并行扫描器 部分。
对于多集群(联邦)环境,主(主控)集群可以扫描指定为联邦注册表的注册表/储存库。这些注册表的扫描结果将同步到所有受管理(远程)集群。这使得在受管理集群控制台中显示扫描结果成为可能,并且可以在受管理集群的准入控制规则中使用这些结果。注册表只需扫描一次,而不是每个集群都扫描,从而减少 CPU/内存和网络带宽的使用。有关更多详细信息,请参见 多集群 部分。
配置注册表扫描
要配置要扫描的注册表和储存库,请在 SUSE® Security 控制台的资产 → 注册表菜单中进行。添加或编辑要扫描的注册表。使用过滤器定义要扫描的储存库或镜像子集。如果您的注册表需要通过代理访问,可以在设置 → 配置中进行配置。

注册表将根据可配置的计划进行扫描。默认情况下,仅会扫描新图像或更新的图像。如果您希望在每次更新CVE数据库时重新扫描所有适用的图像,请在配置注册表时选择“在CVE数据库更新后重新扫描”按钮。您还可以选择分层扫描,以按图像中的每一层显示漏洞(注意:分层扫描可能需要更长时间并消耗更多资源才能完成)。
扫描完成后,您将在其下方看到结果。单击储存库/标签以查看漏洞,单击漏洞以查看更多信息。您还可以下载CSV文件中的报告或在事件日志中查看结果。

NeuVector提供了一个"查看所有扫描的图像"选项。用户无需查看注册表即可查看特定镜像。相反,用户可以单击最后一行以列出所有扫描的图像。

用户还可以访问注册表页面,并从容器页面的超链接打开特定镜像。如果图像名称不可点击,则表示该图像尚未被扫描。

扫描结果包括按镜像层显示的漏洞,如果在注册表/储存库配置期间选择了该选项,还包括合规性检查结果。查看图像的扫描结果时,单击合规性选项卡以查看合规性检查。
扫描还将发现并列出图像中的所有模块(即清单),如下所示。它还将按模块总结漏洞风险,并列出每个模块的所有漏洞。

扫描支持对基于原生Docker、Amazon ECR、Redhat/Openshift、jFrog、Microsoft ACR、Sonatype Nexus、Harbor、Google云及其他仓库的公共和私有docker仓库中的镜像进行。 镜像的扫描报告包含镜像中各种软件包和二进制文件的漏洞状态。扫描报告的简要摘要可以通过在策略→响应规则中使用响应规则配置的Webhook发送,或通过在设置→配置中配置Syslog服务器以Syslog方式发送。结果也可以在事件日志中查看。
至少需要一个储存库过滤器(不能为空)。
储存库过滤器示例

|
注册表扫描选项
-
扫描层:
-
为每个镜像层提供漏洞扫描结果
-
提供有关执行的命令、在镜像层中添加的软件包的信息
-
每层的镜像大小
-
-
自动扫描:
-
自动扫描仅支持与OpenShift imagestream集成。应提前配置适当的角色绑定。
-
当启用自动扫描时,一旦镜像被推送到注册表,镜像扫描将被安排。
-
-
定期扫描:
-
启用定期扫描以定期进行扫描
-
扫描间隔可以设置为5分钟到7天之间。
-
由于许多入场控制检查依赖于镜像扫描结果,启用定期扫描有助于确保入场控制拥有最新的镜像信息。
-
请注意,SUSE® Security将扫描注册表中自上次扫描以来新添加或更改的镜像。
-
-
在CVE数据库更新后重新扫描
-
启用此选项以在漏洞数据库更新后重新扫描所有镜像。
-
原生 Docker 注册表(也包括 Quay 和 Harbor)
添加原生 Docker 注册表
-
选择 Docker 注册表作为类型
-
为注册表提供唯一名称
-
输入带端口的注册表URL
-
如果注册表需要,请提供用户名和密码
-
以以下格式添加储存库作为过滤器
-
Organization/repository:tag
-
储存库可以以起始字符串作为通配符
-
示例 neuvector/all*:2*
-
添加带有用户名/密码的私有 Docker 注册表,启用层扫描,每 30 分钟进行一次定期扫描,并使用 * 作为过滤器扫描所有储存库的所有标签。

添加无需用户名/密码的公共 Docker 注册表进行扫描,并使用通配符的 2 个储存库,启用层扫描并启用定期扫描。

添加带有用户名/密码的公共 Docker 注册表进行扫描,使用通配符储存库,启用层扫描并启用定期扫描。

|
Quay 注册表
|
Red Hat 注册表
添加 Red Hat 注册表
-
选择 Red Hat 注册表作为类型
-
为注册表提供唯一名称
-
输入注册表 URL https://registry.connect.redhat.com/
-
提供用于管理注册表的帐户的用户名和密码
-
以以下格式添加储存库作为过滤器
-
Organization/repository:tag
-
储存库可以以起始字符串作为通配符
-
示例 neuvector/all*:2*
-
*以扫描所有图像标签
-

OpenShift 注册表
添加带有用户名和密码的 OpenShift 注册表
-
选择 OpenShift 注册表作为类型
-
为注册表提供唯一名称
-
输入注册表 URL(如果与默认值不同,请从 OpenShift 网络中的 "oc get is" 命令的输出中获取)
-
默认注册表 URL
https://docker-registry.default.svc:5000/
-
-
提供用于管理注册表的帐户的用户名和密码
-
以以下格式添加储存库作为过滤器
-
Organization/repository:tag
-
示例 openshift/htt*:*
-
*以扫描所有图像标签
-
-
启用自动扫描,以便在 OpenShift 镜像流中更新镜像后立即开始扫描。

添加带有令牌的 OpenShift 注册表
-
选择 OpenShift 注册表作为类型
-
为注册表提供唯一名称
-
输入注册表 URL(如果与默认值不同,请从 OpenShift 网络中的 "oc get is" 命令的输出中获取)
-
默认注册表 URL
https://docker-registry.default.svc:5000/
-
-
提供具有访问所有命名空间权限的服务帐户的令牌
-
查看下面的说明以创建服务帐户并获取令牌。
-
创建服务帐户
-
oc 项目默认
-
oc 创建 sa nvqa
-
oc get sa
-
-
将集群管理员角色分配给服务账户以读取所有注册表
-
oc adm policy add-cluster-role-to-user cluster-admin system:serviceaccount:default:nvqa
-
-
获取服务账户的令牌
-
oc sa get-token nvqa
-
-
-
以以下格式添加储存库作为过滤器
-
Organization/repository:tag
-
示例 openshift/htt*:*
-
*以扫描所有图像标签
-
-
启用自动扫描,以便在OpenShift镜像流中图像更新时立即开始扫描。

JFrog Artifactory
添加JFrog Artifactory注册表(Docker访问方法 — 储存库路径)JFrog管理页面管理员→HTTP设置显示Docker访问方法 - 储存库路径

添加JFrog Artifactory注册表(Docker访问方法 — 储存库路径)
-
选择JFrog Artifactory作为类型
-
为注册表提供一个唯一的名称
-
输入带有端口的注册表URL,例如
http://10.1.7.122:8081/
-
-
如果注册表需要,请提供用户名和密码
-
以以下格式将储存库添加为过滤器
-
Organization/repository:tag
-
储存库或标签可以在末尾使用通配符,例如 abc/*,abc/n*
-
要扫描储存库的所有标签,例如 alpine,请使用 alpine:*
-
通配符必须前面有完整名称、路径或起始字符串
-
* 扫描所有标签
-
添加 JFrog Artifactory 注册表(Docker 访问方法 — 子域)
JFrog 管理页面 admin→HTTP 设置显示 Docker 访问方法 — 子域

添加 JFrog Artifactory 注册表(Docker 访问方法 — 子域)
-
选择JFrog Artifactory作为类型
-
为注册表提供一个唯一的名称
-
输入带有端口的注册表URL,例如
http://10.1.7.122:8081/ -
选择子域作为 JFrog Docker 访问方法
-
如果注册表需要,请提供用户名和密码
-
以以下格式将储存库添加为过滤器
-
Subdomain/repository:tag
-
储存库或标签可以在末尾使用通配符,例如 abc/*,abc/n*
-
要扫描储存库的所有标签,例如 alpine,请使用 alpine:*
-
通配符必须前面有完整名称、路径或起始字符串
-
* 用于扫描所有子域的所有标签
-
|
创建一个虚拟储存库并将所有本地和远程储存库添加到其中。在过滤器部分指定此虚拟储存库,以扫描来自本地和远程储存库的所有标签。 |
添加基于子域的 JFrog 注册表以扫描来自 docker-local 子域的镜像

添加基于子域的 JFrog 注册表以扫描来自所有子域的所有标签

添加 JFrog Artifactory 注册表(Docker 访问方法 — 端口)
JFrog 管理页面 admin→HTTP 设置显示 Docker 访问方法 - 端口

JFrog 管理页面管理员→本地储存库→docker-local 储存库→ 高级 - 显示储存库 URL 和注册表端口 8181

JFrog 管理页面管理员→本地储存库→guo 储存库→ 高级 - 显示储存库 URL 和注册表端口 8182

-
选择JFrog Artifactory作为类型
-
为注册表提供一个唯一的名称
-
输入带有端口的注册表URL,例如
http://10.1.7.122:8181/-
每个注册表名称都有唯一的端口
-
-
选择端口作为 JFrog Docker 访问方法
-
如果注册表需要,请提供用户名和密码
-
以以下格式将储存库添加为过滤器
-
Organization/repository:tag
-
储存库或标签可以在末尾使用通配符,例如 abc/, abc/n
-
要扫描某个储存库的所有标签,例如 alpine,请使用 alpine:*
-
通配符必须前面有完整名称、路径或起始字符串
-
* 用于扫描所有标签
-
为端口访问方法添加 JFrog 注册表,注册表 docker-local 的端口为 8181

为端口访问方法添加 JFrog 注册表,注册表的端口为 8182

为虚拟注册表添加 JFrog 注册表的端口访问方法,端口为 8188,该注册表已添加所有本地注册表。

显示 docker-local 注册表的扫描结果

添加 SaaS JFrog Artifactory 注册表(Docker 访问方法 — 端口)
选择JFrog Artifactory作为类型
-
为注册表提供一个唯一的名称
-
输入注册表 URL,例如 https://jfrogtraining-docker-nv-virtual.jfrog.io
-
选择端口作为 JFrog Docker 访问方法
-
如果注册表需要,请提供用户名和密码
-
以以下格式将储存库添加为过滤器
-
Organization/repository:tag
-
* 扫描所有储存库的所有标签
-

使用 JFrog 注册表扫描 NeuVector 注册表
对于在子域模式下使用 JFrog 注册表扫描 NeuVector 注册表,子域通常是 JFrog 注册表 URL 的前缀。
标准 JFrog 子域示例
JFrog注册表URL:https://mysubdomain.myhost.com
-
mysubdomain:子域名
-
myhost.com:JFrog 注册表主机名
注册表过滤器示例:mysubdomain/docker-service-broker-tmp-local/devop/test/joe/*
当JFrog使用修改过的子域名
当您在注册表URL中使用修改过的子域名时。
JFrog注册表URL:https://artifact-mysubdomain.myhost.com
-
artifact-mysubdomain:仅在注册表URL中使用的修改过的子域名
-
mysubdomain:JFrog服务器中的实际子域名
-
myhost.com:JFrog注册表主机名
注册表过滤器示例:myrepo/docker-service-broker-tmp-local/devop/test/joe/*
|
NeuVector之前支持这些环境。然而,在升级到新版 JFrog 服务器后,支持出现中断,因为 NeuVector 无法确定真实的子域名值究竟来自 URL 还是过滤器(例如,artifact-mysubdomain 与 mysubdomain)。 |
所需修复
如果子域名不是JFrog注册表服务器URL的前缀,您必须使用以下格式配置注册表过滤器:
JFrog注册表URL:https://artifact-mysubdomain.myhost.com
注册表过滤器:<mysubdomain>/docker-service-broker-tmp-local/devop/test/joe/*
|
所需格式: |
通过以这种格式指定过滤器,NeuVector可以正确识别在子域名模式下与JFrog服务器通信所使用的实际子域名。
Google容器注册表
参考: https://cloud.google.com/container-registry/docs/advanced-authentication https://cloud.google.com/container-registry/docs/advanced-authentication#json_key_file
为项目启用云资源管理器API
Google云平台→选择项目→API和服务→启用API和服务→搜索 “Cloud Resource Manager API”→启用API https://console.cloud.google.com/apis/library?project=nvtest-219600&q=Cloud%20Resource%20Manager%20API (更改项目名称)

从SUSE® Security GUI添加Google容器注册表
-
选择Google注册表作为类型
-
为注册表提供唯一名称
-
输入注册表URL。示例 https://gcr.io/(这也可以是us.gcr.io、eu.gcr.io等)
-
将上述捕获的json文件的所有内容粘贴到JSON密钥中。
-
以以下格式添加储存库作为过滤器
-
Project-id/repository:tag
-
示例 nvtestid-1/neuvector*:*
-
*以扫描所有镜像标签
-

Azure容器注册表
Sonatype Nexus Docker 注册表
参考: https://help.sonatype.com/repomanager3/private-registry-for-docker https://hub.docker.com/r/sonatype/nexus3/
GitLab 容器注册表
示例 GitLab 环境配置
sudo docker run --detach \
--hostname gitlab \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://10.1.7.73:9096'; gitlab_rails['lfs_enabled'] = true;" \
--publish 10.1.7.73:9095:9095 --publish 10.1.7.73:9096:9096 --publish 10.1.7.73:6222:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
External_URL: http://10.1.7.73:9096
Registry_URL: https://10.1.7.73:9095
获取 GitLab 私有令牌,如下所示
-
从 GitLab 登录页面右上角的图标导航到设置页面,如下所示:

-
从用户设置页面导航到访问令牌页面,如下所示:

-
填写所有适用的字段,然后在准备好生成访问令牌时点击"`Create personal access token`":

-
一旦用户离开生成的令牌页面,访问令牌将不再可用。 因此,强烈建议在导航或关闭以下页面之前先复制访问令牌:

IBM Cloud 容器注册表
添加 IBM 容器注册表
-
选择 IBM Cloud 容器注册表作为类型
-
为注册表提供唯一名称
-
输入注册表 URL https://us.icr.io/
-
提供 iamapikey 作为用户名,下面的 apikey 作为密码
-
从 CLI 创建 apikey
-
在ibmcloud中创建api密钥atibmKey
-
-
通过GUI创建apikey
-
IBM Cloud→管理访问(IAM)-IBM Cloud API密钥
-
-
-
提供IBM Cloud账户
-
从CLI获取IBM Cloud账户
-
Ibmcloud cr信息
-
-
-
以以下格式添加储存库作为过滤器
-
Organization/repository:tag
-
储存库可以以起始字符串作为通配符
-
示例 neuvector/all:2
-
-
扫描所有镜像标签
-
-
-
如有需要,请启用其他参数

|
注册表身份验证的用户名必须为’iamapikey' |
GitHub容器注册表
在NeuVector v5.4.3及更高版本中,现已支持从 GitHub容器注册表(GHCR)进行镜像扫描,使用户能够将存储在GitHub中的镜像纳入其安全和合规工作流程。
添加GitHub容器注册表
要在NeuVector中配置GHCR,请转到添加注册表并从注册表类型下拉菜单中选择GitHub容器注册表。
| 字段 | 说明 |
|---|---|
名称 |
用于识别此注册表配置的名称。 |
注册表 |
GHCR 注册表 URL。示例: |
用户名 |
您的 GitHub 用户名。 |
令牌 |
一个 GitHub 个人访问令牌,具有 |
过滤器 |
指定要扫描的名称空间(例如, |










