目录
与 CI/CD 的集成
卡巴斯基容器安全性允许您在
中扫描驻留在代码存储库管理系统中的容器和 IaC 的镜像,以检测漏洞、恶意软件、错误配置和暴露的敏感数据。在存储库管理系统的项目构建阶段,您可以运行卡巴斯基容器安全扫描器来检查存储库中的对象是否符合已启用的安全策略。扫描器通过代理(例如 GitLab 中的 GitLab Runner)从仓库启动。有关扫描作业和发送扫描结果的的数据通过应用程序编程接口 (API) 转发。
在项目构建阶段运行对象扫描时,必须确保在应用的保障策略的设置中未选择“使 CI/CD 失效”步骤。如果激活此设置,解决方案将在扫描期间通知您出错。
扫描结果显示在“清单 → CI/CD → 在 CI/CD 中扫描”部分的镜像列表中。
对于表中的每个对象,卡巴斯基容器安全都显示以下内容:
- 上次扫描的日期和时间。
- 名称。
- 风险评级。
- 摘要扫描结果,指示与漏洞、恶意软件、敏感数据和错误配置相关的已识别对象。
- 构件类型。
- 在其中扫描镜像的构建的编号和管道。
在“资源 → CI/CD → 在 CI/CD 中扫描”部分中,还可以生成有关在 CI/CD 进程内扫描的镜像的报告。
仅针对镜像构件类型的对象生成报告。在此部分中,无法为其他类型的构件生成报告。
在 CI/CD 进程中扫描构件
卡巴斯基容器安全允许您扫描 CI/CD 中使用的镜像。要从 CI/CD 扫描镜像,您应该配置卡巴斯基容器安全与 CI/CD 过程的集成。
通过监听和拦截网络流量获得的数据必须在 CI/CD 环境和解决方案之间安全传输。
要扫描 CI/CD 过程中使用的镜像或存储库(为了扫描配置文件),请向运行卡巴斯基容器安全扫描器的 CI/CD 管道添加一个阶段。
要从 CI/CD 扫描镜像,请在用于集成存储库的配置文件中,指定扫描器的 API_BASE_URL
( 卡巴斯基容器安全 API 服务器的网址)和 API_TOKEN
(用于访问卡巴斯基容器安全 API 的令牌)环境变量。您还必须指定API_CA_CERT
(用于验证 API 解决方案的主机服务器的证书)或SKIP_API_SERVER_VALIDATION=true
以跳过此扫描。
扫描结果将被转发到服务器并显示在管理控制台的“资源 → CI/CD”部分中。提供的表格会列出被扫描的镜像,显示风险评估的结果,并指示检测到的漏洞。
您可以单击镜像名称链接来打开包含镜像扫描结果详细信息的页面。此页面类似于显示仓库镜像扫描结果的页面。
卡巴斯基容器安全还显示每个对象的构件的类型。使用两种主要构件:
- 文件系统是包含配置文件的存储库。
- 容器镜像是用于容器运行时实现的模板。
对于每个扫描对象,您可以指定内部版本编号(BUILD_NUMBER
)和内部版本
BUILD_PIPELINE
)。这些参数可用于确定对象失效的具体阶段。
对于 CI/CD 镜像,不提供重新扫描。
卡巴斯基容器安全在 CI/CD 中执行以下类型的扫描:
- 扫描镜像仓库中的镜像。该解决方案在成功内部版本后运行扫描并将镜像保存到镜像仓库中。
- 扫描 TAR 存档中的镜像。TAR 存档存储为内部版本构件,解决方案将在下一个构建管道中扫描该构件。
- 扫描 Git 存储库,可以通过以下方式之一执行:
- 针对 Git 存储库中的项目分支(单个开发路径)
- 针对提交(项目时间线中的状态快照或检查点)
要扫描镜像仓库的镜像:
运行以下格式的命令来启动扫描:
/scanner [TARGET] --stdout
其中:
<TARGET>
– 注册表中映像的完整地址。<--stdout>
是到安全事件日志的输出。
要访问注册表,您必须在环境变量中设置登录名COMPANY_EXT_REGISTRY_USERNAME
和密码(令牌)COMPANY_EXT_REGISTRY_PASSWORD
。
要使用证书与注册表建立安全连接,您必须在 COMPANY_EXT_REGISTRY_TLS_CERT
环境变量中将证书详细信息指定为 .PEM 格式的以下字符串: -----BEGIN CERTIFICATE-----\n...
证书数据
> ...\n-----END CERTIFICATE-----
。
GitLab CI/CD和Jenkins CI/CD中扫描镜像的示例。
要从 TAR 存档扫描镜像:
- 使用任何用于创建容器化镜像的应用程序构建镜像并将其保存为 TAR 存档。
- 运行以下格式的命令来启动扫描:
/scanner [TARGET] --file --stdout
其中:
<TARGET>
– 包含要扫描的镜像的文件的路径。<--file>
– 表示扫描TARGET
文件的标志。<--stdout>
是到安全事件日志的输出。
要扫描 Git 存储库:
- 在 Git 存储库的配置文件中,在环境变量中指定用于访问存储库的令牌(
GITHUB_TOKEN
或GITLAB_TOKEN
)。 - 运行以下格式的命令来启动扫描:
/scanner [TARGET] --repo [--branch BRANCH] [--commit COMMIT] --stdout
其中:
<TARGET>
– Git 存储库的网址 (URL)。<--repo>
– 表示扫描
TARGET
文件的标志。<--branch BRANCH>
– 要扫描的存储库的分支。
<--commit COMMIT>
– 要扫描的提交所对应的哈希值。
<--stdout>
是到安全事件日志的输出。
要扫描
文件系统,您必须使用带有vX.XX-with-db数据库的扫描器镜像。要扫描 IaC 文件,必须授予扫描器访问容器内文件的权限(例如,通过安装包含文件的卷或将文件复制到容器文件系统)。要扫描文件系统,
运行以下格式的命令来启动扫描:
/scanner [TARGET] --sources --stdout
其中:
<TARGET>–
用于扫描的文件夹的路径<--sources>
–
指示需要扫描文件系统中的文件的标志<--stdout>
是到安全事件日志的输出。
扫描结果可以在“资源 → CI/CD”中查看,或以 .SPDX、.JSON 和 .HTML 格式下载。
页首配置与 GitLab CI/CD 的集成
此示例使用特定的扫描器镜像,其内置漏洞数据库位于卡巴斯基容器安全制造商的镜像仓库中。
要在 GitLab CI/CD 过程中使用镜像扫描功能,您应该启用 GitLab 容器仓库。
集成配置包括以下步骤:
- 对卡巴斯基容器安全制造商的镜像仓库中的 GitLab CI/CD 授权。
- 在集群操作员的工作站上,运行以下命令准备授权数据的 Base64 哈希:
printf "login:password" | openssl base64 -A
其中 login 和 password 是卡巴斯基容器安全制造商的镜像仓库中账户的用户名和密码。
- 在 GitLab CI/CD 环境变量中,创建 DOCKER_AUTH_CONFIG 变量(在 GitLab 存储库中选择“设置 → CI/CD”,单击“展开”按钮展开变量 ,然后单击“添加变量”按钮)。
- 按以下形式指定变量:
{
"auths": {
"repo.cloud.example.com": {
"auth": "base64hash"
}
}
}
其中 base64hash 是步骤 1a 中获得的字符串。
- 在集群操作员的工作站上,运行以下命令准备授权数据的 Base64 哈希:
- 将数据发送到卡巴斯基容器安全时对来自 GitLab CI/CD 的请求进行授权。
- 复制“我的个人资料”页面上的 API 令牌。
- 在 .gitlab-ci.yml 配置文件的 API_TOKEN 变量中指定复制的 API 令牌值。
- 将镜像扫描阶段添加到 CI/CD 过程中。
要将扫描添加到 CI/CD 管道,您应该将以下行添加到 .gitlab-ci.yml 文件中:
- 在代码构建阶段后,按以下形式添加有关包含漏洞和其他恶意对象数据库的扫描器镜像的信息:
scan_image:
stage: scanner
image:
name: repo.cloud.example.com/repository/company/scanner:v2.0-with-db
entrypoint: [""]
pull_policy: always
我们建议始终指定
pull_policy
参数,以便在每次扫描时接收包含更新的漏洞和其他恶意对象数据库的相关构建。 - 指定用于对卡巴斯基容器安全的 CI/CD 扫描器请求进行授权的标签、内部版本 ID、管道 ID 和 API 令牌,如下所示:
SCAN_TARGET: ${CI_REGISTRY_IMAGE}:master
BUILD_NUMBER: ${CI_JOB_ID}
BUILD_PIPELINE: ${CI_PIPELINE_ID}
API_TOKEN:
<API token value>
下面的示例包含
master
(主)标签,您还可以指定其他标签。 - 如果为私有存储库配置扫描,请指定授权数据以确保扫描器能够访问镜像。授权数据可以设置为变量。
COMPANY_EXT_REGISTRY_USERNAME: ${COMPANY_EXT_REGISTRY_USERNAME}
COMPANY_EXT_REGISTRY_PASSWORD: ${COMPANY_EXT_REGISTRY_PASSWORD}
- 要使用证书与注册表建立安全连接,请将
COMPANY_EXT_REGISTRY_TLS_CERT
环境变量中的证书数据指定为 .PEM 格式的字符串:-----BEGIN CERTIFICATE-----\n... <
证书详细信息
> ...\n-----END CERTIFICATE-----
. - 指定以下用于通过代理服务器进行通信的参数:
HTTP_PROXY
–<用于 HTTP 请求的代理服务器>
HTTPS_PROXY
–<用于 HTTPS 请求的代理服务器>
NO_PROXY
–<要从代理范围排除的域或合适的域掩码>
- 如需要,请指定一个变量,以使用入口控制器的 CA 证书检查 CI/CD 中的数据接收服务器:
API_CA_CERT: ${KCS_CA_CERT}
Ingress 控制器的 CA 证书在文本字段中指定为 .PEM 格式的字符串:
----- BEGIN CERTIFICATE ----- \n...
<certificate details>
...\n ----- END CERTIFICATE -----如果未设置
API_CA_CERT
变量,则扫描将会开始但无法完成。使用入口控制器的 CA 证书,可以让在 CI/CD 中运行的扫描器验证数据接收服务器的真实性。
如果您使用自签名证书,或者想要跳过使用入口控制器的 CA 证书检查数据接收服务器这一步骤,请指定变量的值以跳过检查,如下所示:
SKIP_API_SERVER_VALIDATION: 'true'
- 指定卡巴斯基容器安全的 API 主机服务器的网址:
API_BASE_URL
–<网址>
variables:
API_BASE_URL: ${API_BASE_URL}
script:
- /bin/sh /entrypoint.sh $SCAN_TARGET --stdout > artifact-result.json
artifacts:
paths:
- artifact-result.json
- 在代码构建阶段后,按以下形式添加有关包含漏洞和其他恶意对象数据库的扫描器镜像的信息:
配置与外部仓库的集成后,您可以在 CI/CD 过程中扫描镜像,包括在 SBOM 模式下扫描。扫描结果可以在“资源 → CI/CD”中查看,或以 .SPDX、.JSON 和 .HTML 格式下载。
页首配置与 Jenkins CI/CD 的集成
配置与 Jenkins CI / CD 的集成包括以下步骤:
- 对卡巴斯基容器安全制造商镜像仓库中的 Jenkins CI/CD 授权。为此,在集群操作员的工作站上,运行以下命令以准备授权数据的 Base64 哈希:
printf "login:password" | openssl base64 -A
其中 login 和 password 是卡巴斯基容器安全制造商的镜像仓库中账户的用户名和密码。
- 卡巴斯基容器安全 API 授权。要执行授权,请完成以下步骤:
- 复制“我的个人资料”页面上的 API 令牌。
- 在 Jenkinsfile 配置文件的 API_TOKEN 变量中指定复制的 API 令牌值。
- 使用 Ingress 控制器的 CA 证书对 CI/CD 中的数据接收服务器进行身份验证。要执行身份验证,请在 Jenkinsfile 配置文件中指定以下变量之一:
-e API_CA_CERT=${KCS_CA_CERT}
表示身份验证已执行,并且在 CI/CD 中启动的扫描器可以确保接收服务器是真实的。-e SKIP_API_SERVER_VALIDATION=true
表示不使用 Ingress 控制器的 CA 证书对接收服务器进行身份验证。
- 创建 Jenkins 环境变量。
要创建环境变量,请将以下行添加到 Jenkinsfile:
- 添加扫描器所在容器仓库的信息,如下所示:
LOGIN
:扫描器仓库中的账户名称PASS
:扫描器仓库的密码 - 如果为私有存储库配置扫描,请指定以下授权数据,以确保扫描器能够访问镜像:
COMPANY_EXT_REGISTRY_USERNAME
:扫描镜像仓库的账户名称COMPANY_EXT_REGISTRY_PASSWORD
:扫描镜像仓库的密码 - 要使用证书与注册表建立安全连接,请将
COMPANY_EXT_REGISTRY_TLS_CERT
环境变量中的证书数据指定为 .PEM 格式的字符串:-----BEGIN CERTIFICATE-----\n... <
证书详细信息
> ...\n-----END CERTIFICATE-----
. - 指定以下用于通过代理服务器进行通信的变量:
HTTP_PROXY
–<用于 HTTP 请求的代理服务器>
HTTPS_PROXY
–<用于 HTTPS 请求的代理服务器>
NO_PROXY
–<要从代理范围排除的域或合适的域掩码>
- 添加扫描器所在容器仓库的信息,如下所示:
- 添加信息以启动扫描器。对于有关启动包含漏洞和其他恶意对象数据库的扫描器的信息,请以声明式或脚本式管道的形式将其添加到 Jenkinsfile 配置文件中。
- 生成用于下载的构件。
您可以生成 .HTML 或 .JSON 格式的下载构件,以接收扫描结果。您可以在
--stout
中指定构件格式,如下所示:pipeline {
agent any
stages {
stage('run scanner') {
steps {
sh 'docker login -u ${LOGIN} -p ${PASS} company.example.com'
sh 'docker run -e API_BASE_URL=https://kcs.int.company.com -e SKIP_API_SERVER_VALIDATION=true -e API_TOKEN=${API_TOKEN} -e COMPANY_EXT_REGISTRY_USERNAME=${COMPANY_EXT_REGISTRY_USERNAME} -e COMPANY_EXT_REGISTRY_PASSWORD=${COMPANY_EXT_REGISTRY_PASSWORD} company.example.com:5050/company/kcs/scanner:v2.0.1-lite jfrog.company.com/demo-kcs/bad:bad-project-test --html --stdout > result.html'
}
}
stage('archive') {
steps {
archiveArtifacts artifacts: 'result.html'
}
}
}
}
要生成 .JSON 格式的构件,请重写上方示例中的“
--html --stdout> result.html
”行,如下所示:--stdout > result.json'
并在
archiveArtifacts artifacts
行中,以定义的格式指定文件名:“result.json”。扫描结果能以您指定的格式获取,也可以在“资源 → CI/CD”部分查看。
配置与 TeamCity CI/CD 的集成
要配置与 TeamCity CI/CD 的集成:
- 复制“我的个人资料”页面上的 API 令牌以在 TeamCity 中授权卡巴斯基容器安全 API 。
- 在 TeamCity 网络界面的设置菜单中,选择构建配置主页 → 参数。
- 单击添加新参数以添加以下环境变量的值:
API_TOKEN
– 指定复制的卡巴斯基容器安全 API 令牌的值。API_BASE_URL
– 指定卡巴斯基容器安全的 URL。RUST_BACKTRACE
– 如有必要,请指定full
以使用回溯。SKIP_API_SERVER_VALIDATION
– 如果您使用自签名证书或者需要使用 Ingress 控制器的 CA 证书跳过接收服务器的身份验证,请指定true
。COMPANY_EXT_REGISTRY_USERNAME
– 指定扫描镜像注册表中的账户名称。COMPANY_EXT_REGISTRY_PASSWORD
– 指定扫描镜像的注册表密码。COMPANY_EXT_REGISTRY_TLS_CERT
– 指定用于与注册表进行安全连接的证书的详细信息。证书详细信息以 .PEM 格式的字符串指定:
-----BEGIN CERTIFICATE-----\n...
证书详细信息
> ...\n-----END CERTIFICATE-----
。HTTP_PROXY
– 用于 HTTP 请求的代理服务器HTTPS_PROXY
– 用于 HTTPS 请求的代理服务器NO_PROXY
– 要从代理范围中排除的域或适当的域掩码
- 转到构建配置主页→构建步骤:命令行部分,然后单击添加构建步骤以添加构建步骤。
- 在打开的窗口中,指定以下构建步骤设置:
- 在 Runner type 下拉列表中,选择命令行。
- 在运行下拉列表中,选择自定义脚本。
- 在自定义脚本字段中,指定用于扫描的容器的路径(例如,
/bin/sh /entrypoint.sh nginx:latest
)。
- 在Docker 设置下,指定以下设置:
- 在Docker 容器字段内的运行步骤中,指定扫描器在 Docker 仓库中的地址。例如,
company.gitlab.cloud.net:5050/companydev/example/scanner:v2.0.0-with-db
。 - 在其他 docker run 参数字段中,将权限值增加为
--privileged
。
- 在Docker 容器字段内的运行步骤中,指定扫描器在 Docker 仓库中的地址。例如,
- 单击“保存”以保存设置。
- 单击页面右上角的运行开始构建。
- 如有必要,请下载扫描结果构件,该工件可在 TeamCity Web 界面的构建扫描结果页面的构件选项卡上找到。
定义容器镜像的路径
要开始扫描,解决方案需要确定需要扫描的容器镜像的路径。容器镜像的路径可以通过两种方式指定:
- 在仓库名称、存储库名称和镜像名称后面指定镜像标签。标签是镜像的可更改且易于阅读的描述。
在本例中,路径如下所示:
<仓库>/<存储库>/<镜像名称>:<标签>
。例如,http://docker.io/library/nginx:1.20.1。 - 在仓库名称、存储库和镜像名称后面指定镜像摘要。摘要是镜像的一个不可或缺的内部属性,具体来说,是其内容的哈希(使用 SHA256 哈希算法)。
使用摘要时,路径的构成如下:
<仓库>/<存储库>/<镜像名称><摘要>
。例如,http://docker.io/library/nginx@sha256:af9c...69ce。
一个标签可以匹配不同的摘要,而每个镜像的摘要都是唯一的。
根据用于指定镜像路径的方法,卡巴斯基容器安全在扫描前执行以下操作之一:
- 将标签转换为可信摘要。
- 检查镜像路径中指定的摘要是否可信。对于使用哈希算法编码的对象,如果在维持所需保护时,摘要可确保所需的置信度,则该摘要被视为可信。
只有可信摘要会发送到容器运行时。
在运行容器之前,会将镜像的内容与收到的摘要进行比较。为了确认摘要为可信并且镜像未损坏,卡巴斯基容器安全会检查镜像签名的完整性和真实性。
页首监控镜像的完整性和来源
扫描 CI/CD 中的镜像时,卡巴斯基容器安全可在仓库级别防止镜像欺骗。从 CI 的构建阶段开始,通过验证镜像签名来控制部署在编排器集群中的容器镜像的完整性和来源。
镜像完整性监控分两个阶段:
- 创建容器镜像后对其进行签名。此过程使用外部签名应用程序实现。
- 部署镜像之前检查镜像签名。
解决方案保存了一个基于 SHA256 哈希函数的签名密钥,并用作签名验证的代码。在编排器中部署时,卡巴斯基容器安全会要求签名服务器确认签名的真实性。
卡巴斯基容器安全按如下方式检查镜像签名:
- 在“管理 → 集成 → 镜像签名验证器”部分中,可以配置将解决方案与外部镜像签名验证应用程序集成的设置。
- 在“策略 → 运行时策略 → 策略”部分中,添加运行时策略来保护镜像的内容。该运行时策略会验证签名的真实性。数字签名根据配置的镜像签名验证器进行验证。
- 编排器启动镜像部署,并使用向代理 (kube-agent) 发出部署请求。
要将请求发送到卡巴斯基容器安全代理,请在 values.yaml 配置文件中配置动态准入控制器。
- 根据适用的运行时策略,代理会检查在“管理 → 集成 → 镜像签名验证器”部分中配置的签名验证设置。
- 如果检查确认签名的真实性和有效性,解决方案将允许镜像部署。否则,部署将被阻止。
在 SBOM 模式下运行扫描器
卡巴斯基容器安全可在
模式下启动扫描器来检查镜像中是否存在漏洞。在这种情况下,解决方案将扫描专门创建的 SBOM 文件而不是 TAR 存档。使用 SBOM 的优势如下:
- 扫描镜像是否存在漏洞所需的资源更少。
- 由于正确操作的自动验证和解决方案组件的正确使用,减少了扫描时间。
- 能够扫描镜像中的所有现有漏洞,无一例外。
- 扫描结果可靠性高。
在 CI/CD 中,扫描过程包括两个阶段:接收 SBOM 文件和根据收到的 SBOM 文件扫描镜像。镜像扫描过程实现如下:
- CI/CD 扫描器生成镜像组件列表,并将生成的构件发送到卡巴斯基容器安全。
- 使用镜像处理程序,解决方案将收到的 SBOM 文件转发到扫描器进行扫描。
为了在 SBOM 模式下进行扫描,卡巴斯基容器安全会运行一个带有预装数据库的扫描器,该数据库包含关于漏洞和其他恶意对象的信息(
scanner:v2.0-with-db
,scanner:v2.0-with-db-java
)。
要在 CI/CD 中进行镜像扫描,您必须在文件中指定以下环境变量的值:
API_TOKEN
– 指定卡巴斯基容器安全 API 令牌的值。API_BASE_URL
– 指定卡巴斯基容器安全 URL。API_CA_CERT
– 指定 Ingress 控制器的的 CA 证书详细信息,可以让在 CI/CD 中运行的扫描器验证数据接收服务器的真实性。如果您使用自签名证书,或者想要跳过使用 Ingress 控制器的 CA 证书检查数据接收服务器这一步骤,用以跳过检查的变量的值提供如下:SKIP_API_SERVER_VALIDATION: 'true'
COMPANY_EXT_REGISTRY_USERNAME
– 指定扫描镜像注册表中的账户名称。COMPANY_EXT_REGISTRY_PASSWORD
– 指定扫描镜像的注册表密码。COMPANY_EXT_REGISTRY_TLS_CERT
– 指定用于与注册表进行安全连接的证书的详细信息。证书详细信息以 .PEM 格式的字符串指定:
-----BEGIN CERTIFICATE-----\n...
证书详细信息
> ...\n-----END CERTIFICATE-----
。HTTP_PROXY
– 用于 HTTP 请求的代理服务器HTTPS_PROXY
– 用于 HTTPS 请求的代理服务器NO_PROXY
– 要从代理范围中排除的域或适当的域掩码
对于后续扫描,卡巴斯基容器安全会生成 CycloneDX 格式的报告。您还可以生成一个包含 SBOM 的构件,以便在 CI/CD 过程中以
或 格式进行下载。要在扫描器执行 SBOM 创建时生成 .SPDX 格式的 SBOM 文件:
在 .gitlab-ci.yml 配置文件中输入以下命令:
- /bin/sh /entrypoint.sh $SCAN_TARGET --sbom --spdx --stdout > example.spdx
其中:
<--sbom-json>
指示创建 SBOM 文件。
<--spdx>
指示以 .SPDX 格式生成构件。
<--stdout > example.spdx>
指示数据输出到 .SPDX 格式的文件。
要在扫描器执行 SBOM 创建时生成 .СDX 格式的 SBOM 文件:
在 .gitlab-ci.yml 配置文件中输入以下命令:
- /bin/sh /entrypoint.sh $SCAN_TARGET --sbom --cdx --stdout > example.cdx.json
其中:
<--sbom-json>
指示创建 SBOM 文件。
<--cdx>
指示以 .CDX 格式生成构件。
<--stdout > example.cdx.json>
指示数据输出到 .JSON 格式的文件。
生成的文件(例如 example.cdx.json)被指定为构件:artifacts: paths:
使用 SBOM 文件进行扫描仅适用于扫描镜像是否存在漏洞的情况。如果您的 CI/CD 过程需要扫描其他风险和威胁(例如错误配置),则除了 SBOM 文件之外,还必须单独运行相应的扫描并将其结果添加到镜像处理程序中。
页首在精简版 SBOM 模式下运行扫描器
卡巴斯基容器安全可在精简版 SBOM 模式下启动扫描器来检查镜像中是否存在漏洞。在这种情况下,解决方案会扫描专门创建的 SBOM 文件,并且该扫描结果在 CI/CD 阶段可用。
通过监听和拦截网络流量获得的数据必须在 CI/CD 环境和解决方案之间安全传输。
您可以生成一个构件,用于以 .SPDX、.HTML、.JSON 或 .CDX 格式进行下载,从而获取结果。
扫描结果能以您指定的格式获取,也可以在“资源 → CI/CD“部分查看。
在 GitLab 中运行扫描器
要在 GitLab 中精简版 SBOM 模式下启动扫描器,需在 CI/CD 进程中配置镜像扫描时编辑 .gitlab-ci.yml 配置文件,如下所示:
- 添加在 CI/CD 中启动用于镜像扫描的扫描器的镜像相关信息,如下所示:
scan_image:
stage: scanner
image:
name:repo.cloud.example.com/repository/company/scanner:v.2.0.0-lite
entrypoint: [""]
pull_policy: always
- 指定编排平台标签,如下所示:
k8s
在提供的示例中,为 Kubernetes 指定了
k8s
标签,您也可以为其他受支持的编排平台指定标签。 - 指定内部版本 ID、扫描镜像的镜像仓库数据和用于安全连接到此仓库的证书、管道 ID 和授权来自卡巴斯基容器安全中的 CI/CD 扫描程序的请求的 API 令牌等变量,如下所示:
SCAN_TARGET: ${CI_REGISTRY_IMAGE}:master
COMPANY_EXT_REGISTRY_USERNAME: ${COMPANY_EXT_REGISTRY_USERNAME}
COMPANY_EXT_REGISTRY_PASSWORD: ${COMPANY_EXT_REGISTRY_PASSWORD}
COMPANY_EXT_REGISTRY_TLS_CERT: ${COMPANY_EXT_REGISTRY_TLS_CERT}
BUILD_NUMBER: ${CI_JOB_ID}
BUILD_PIPELINE: ${CI_PIPELINE_ID}
API_TOKEN:
<API 令牌值>
HTTP_PROXY
–<用于 HTTP 请求的代理服务器>
HTTPS_PROXY
–<用于 HTTPS 请求的代理服务器>
NO_PROXY
–<要从代理范围排除的域或合适的域掩码>
COMPANY_EXT_REGISTRY_TLS_CERT
变量中用于与镜像仓库进行安全连接的证书的详细信息以 .PEM 格式的字符串指定:
-----BEGIN CERTIFICATE-----\n...
证书详细信息
> ...\n-----END CERTIFICATE-----
。 - 如果需要,指定一个用于扫描解决方案的 API 证书的变量:
API_CA_CERT: ${KCS_CA_CERT}
如果未设置
API_CA_CERT
变量,则扫描将会开始但无法完成。 - 指定卡巴斯基容器安全的 API 主机服务器的网址:
API_BASE_URL:
<网址>
- 指定在扫描器用以下其中一种受支持的格式启动时创建构件的命令:
- 要生成 .JSON 格式的构件:
script:
- /bin/sh /entrypoint.sh $SCAN_TARGET --stdout > artifact-result.json
artifacts:
paths:
- artifact-result.json
- 要生成 .HTML 格式的构件:
script:
- /bin/sh /entrypoint.sh $SCAN_TARGET --html --stdout > artifact-result.html
artifacts:
paths:
- artifact-result.html
- 要生成 .SPDX 格式的 SBOM 构件:
script:
- /bin/sh /entrypoint.sh $SCAN_TARGET --spdx --stdout > artifact-result.spdx
artifacts:
paths:
- artifact-result.spdx
- 要生成 .JSON 格式的 SBOM 构件:
script:
- /bin/sh /entrypoint.sh $SCAN_TARGET --cdx --stdout > artifact-result.cdx.json
artifacts:
paths:
- artifact-result.cdx.json
- 要生成 .JSON 格式的构件:
有关将扫描器配置为在 GitLab 中精简版 SBOM 模式下运行并以 .HTML 格式生成构件的示例
页首在 CI/CD 进程之外运行扫描器
在资源有限的情况下,您可以在 CI/CD 进程中除了工作节点之外运行卡巴斯基容器安全扫描程序。例如,通过在 Docker 节点上使用docker run
命令,或者作为 Kubernetes 集群中的 Job。
为了最大程度地节省资源,我们建议使用扫描器:2.0.0-lite镜像,因为它不包含漏洞数据库,使用 API 将基于目标镜像扫描结果的 SBOM 文件发送到解决方案。
要在 CI/CD 进程之外启动卡巴斯基容器安全扫描程序,您必须指定以下强制参数:
API_TOKEN:<
API 令牌值
>
是用于在解决方案的 API 接口中进行身份验证的卡巴斯基容器安全用户令牌。API_BASE_URL:<
网址
>
是访问卡巴斯基容器安全的 API 接口的链接。接口可以使用 HTTP 和 HTTPS 协议进行访问,具体取决于部署的解决方案的环境变量。API_CA_CERT:<
.PEM 格式的证书
>
是用于验证解决方案的 API 证书的变量。SKIP_API_SERVER_VALIDATION = true
— 如果需要,可以指定一个变量来跳过卡巴斯基容器安全的 API 证书验证。
您还可以为扫描器操作指定其他参数:
COMPANY_EXT_REGISTRY_USERNAME:<
注册表用户名
>
是存储扫描器要检查的镜像的注册表的用户的名称。COMPANY_EXT_REGISTRY_PASSWORD:<
注册表用户密码
>
是存储扫描器要检查的镜像的注册表用户的密码。BUILD_NUMBER:<
内部版本号 ID
>
是用于在解决方案接口中跟踪内部版本号的 ID。卡巴斯基容器安全在 CI\CD 进程扫描结果中显示该数字。BUILD_PIPELINE:<
管道编号 ID
>
是用于在解决方案接口中跟踪管道编号的标识符。卡巴斯基容器安全在 CI\CD 进程扫描结果中显示该数字。HTTP_PROXY:<
HTTP 请求的代理服务器
>
是一个变量,表示在需要访问外部资源时使用 HTTP 代理服务器HTTPS_PROXY:<
HTTPS 请求的代理服务器
>
是一个变量,表示在需要访问外部资源时使用 HTTPS 代理NO_PROXY:<
用于排除项代理的域对应的域或掩码
>
是一个变量,表示使用代理服务器时本地可用的资源。
获取 JSON 或 HTML 格式的扫描结果
使用卡巴斯基容器安全来扫描 CI/CD 中的镜像时,可以生成包含扫描结果的构件并将其保存在 CI/CD 平台中。这可以使用与解决方案集成的外部存储库系统的配置文件来实现。例如,可以在 GitLab 中使用 .gitlab-ci.yml 配置文件。
您可以在以下场景中生成包含扫描结果的构件:
- 扫描器执行完整的 CI/CD 扫描时,扫描结果文件能以 .HTML 或 .JSON 格式生成。
- 通过创建 SBOM 运行扫描器时,包含扫描结果的文件能以 .SPDX 或 .JSON 格式生成。
要生成 .HTML 格式的扫描结果文件:
在 .gitlab-ci.yml 配置文件中输入以下命令:
- /bin/sh /entrypoint.sh $SCAN_TARGET --html --stdout > example.html
其中:
<--html>
指示以 .HTML 格式生成构件。
<--stdout > example.html>
指示数据输出到 .HTML 格式的文件。
要在执行完整的 CI/CD 扫描时生成 .JSON 格式的扫描结果文件:
在 .gitlab-ci.yml 配置文件中输入以下命令:
- /bin/sh /entrypoint.sh $SCAN_TARGET --stdout > example.json
其中:
<--stdout > example.json>
指示数据输出到 .JSON 格式的文件。
生成的文件(例如 example.json)被指定为构件:artifacts: paths:
开始扫描时指定 Secret
在 CI/CD 进程中启动扫描作业时,包含扫描器镜像(Kaspersky Container Security 相应版本的 lite 或 with-db 扫描器)的注册表只有在获得授权后才可访问。为了授权,您可以在扫描作业中传递所需的 Secret。
要在启动扫描作业时获得访问注册表的授权:
- 创建 Secret:
kubectl create secret docker-registry ci-creds --docker-server=client.repo.example.com --docker-username=username --docker-password=password
- 在扫描作业中,指定
imagePullSecrets
变量的值:imagePullSecrets:
- name: ci-creds
- 开始扫描作业。
在此示例中,扫描作业包含以下 Secret:
- 用于下载扫描仪镜像的 secret(在
imagePullSecrets
变量中指定)。 - 如果对相关仓库的访问受到限制,则下载要扫描的镜像的密码(在
COMPANY_EXT_REGISTRY_PASSWORD
变量中指定)。
如果解决方案在运行扫描作业时获得访问权限的仓库可在未经授权的情况下访问,则可以省略这些密码。
页首