卡巴斯基容器安全

与 CI/CD 的集成

卡巴斯基容器安全性允许您在

中扫描驻留在代码存储库管理系统中的容器和 IaC 的镜像,以检测漏​​洞、恶意软件、错误配置和暴露的敏感数据。

在存储库管理系统的项目构建阶段,您可以运行卡巴斯基容器安全扫描器来检查存储库中的对象是否符合已启用的安全策略。扫描器通过代理(例如 GitLab 中的 GitLab Runner)从仓库启动。有关扫描作业和发送扫描结果的的数据通过应用程序编程接口 (API) 转发。

在项目构建阶段运行对象扫描时,必须确保在应用的保障策略的设置中未选择“使 CI/CD 失效”步骤。如果激活此设置,解决方案将在扫描期间通知您出错。

扫描结果显示在“清单CI/CD在 CI/CD 中扫描”部分的镜像列表中。

对于表中的每个对象,卡巴斯基容器安全都显示以下内容:

  • 上次扫描的日期和时间。
  • 名称。
  • 风险评级。
  • 摘要扫描结果,指示与漏洞、恶意软件、敏感数据和错误配置相关的已识别对象。
  • 构件类型。
  • 在其中扫描镜像的构建的编号和管道。

在“资源CI/CD在 CI/CD 中扫描”部分中,还可以生成有关在 CI/CD 过程中扫描的镜像的报告

仅针对镜像构件类型的对象生成报告。在此部分中,无法为其他类型的构件生成报告。

本节帮助内容

在 CI/CD 过程中扫描镜像

配置与 GitLab CI/CD 的集成

配置与 Jenkins CI/CD 的集成

配置与 TeamCity CI/CD 的集成

定义容器镜像的路径

监控镜像的完整性和来源

在 SBOM 模式下运行扫描器

获取 JSON 或 HTML 格式的扫描结果

在精简版 SBOM 模式下运行扫描器

页首
[Topic 267228]

在 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

GitLab CI/CDJenkins CI/CD中扫描镜像的示例。

要从 TAR 存档扫描镜像:

  1. 使用任何用于创建容器化镜像的应用程序构建镜像并将其保存为 TAR 存档。
  2. 运行以下格式的命令来启动扫描:

    /scanner [TARGET] --file --stdout

    其中:

    • <TARGET> – 包含要扫描的镜像的文件的路径。
    • <--file> – 表示扫描TARGET文件的标志。
    • <--stdout> 是到安全事件日志的输出。

    包含用于扫描 TAR 存档的设置的配置文件示例

    stages:

    - build_tar

    - scan_tar

    - push_image

    build_tar:

    stage: build_tar

    tags:

    - k8s

    - docker

    image:

    name: gcr.io/kaniko-project/executor:v1.9.0-debug

    entrypoint: [""]

    dependencies:

    - scan_source_branch

    - scan_source_commit

    script:

    - mkdir -p /kaniko/.docker

    - echo "${DOCKER_AUTH_CONFIG}" > /kaniko/.docker/config.json

    - /kaniko/executor

    --context "${CI_PROJECT_DIR}"

    --dockerfile "${CI_PROJECT_DIR}/Dockerfile"

    --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}"

    --compressed-caching=false

    --build-arg GITLAB_USER=gitlab-ci-token

    --build-arg GITLAB_TOKEN=${CI_JOB_TOKEN}

    --no-push

    --tarPath=image.tar

    artifacts:

    paths:

    - image.tar

    expire_in: 2 hours

    scan_tar:

    stage: scan_tar

    tags:

    - k8s

    - docker

    dependencies:

    - build_tar

    image:

    name: "company.gitlab.cloud.net:5050/companydev/example/scanner:master-with-db"

    pull_policy: always

    entrypoint: [""]

    variables:

    API_BASE_URL: ${API_BASE_URL}

    API_TOKEN: ${API_TOKEN}

    API_CA_CERT: ${KCS_CA_CERT}

    script:

    - /scanner image.tar --file --stdout

    artifacts:

    paths:

    - image.tar

    expire_in: 2 hours

    push_image:

    stage: push_image

    tags:

    - k8s

    image:

    name: gcr.io/go-containerregistry/crane:debug

    entrypoint: [""]

    dependencies:

    - scan_tar

    script:

    - mkdir -p $HOME/.docker

    - echo "${DOCKER_AUTH_CONFIG}" > $HOME/.docker/config.json

    - /ko-app/crane push image.tar "${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}"

要扫描 Git 存储库:

  1. 在 Git 存储库的配置文件中,在环境变量中指定用于访问存储库的令牌(GITHUB_TOKENGITLAB_TOKEN)。
  2. 运行以下格式的命令来启动扫描:

    /scanner [TARGET] --repo [--branch BRANCH] [--commit COMMIT] --stdout

    其中:

    • <TARGET> – Git 存储库的网址 (URL)。
    • <--repo> – 表示扫描TARGET文件的标志。
    • <--branch BRANCH> – 要扫描的存储库的分支。
    • <--commit COMMIT> – 要扫描的提交所对应的哈希值。
    • <--stdout> 是到安全事件日志的输出。

    带环境变量的配置文件示例,用于从 Git 存储库扫描镜像

    stages:

    - scan_source_branch

    - scan_source_commit

    scan_source_branch:

    stage: scan_source_branch

    image:

    name: "company.gitlab.cloud.net:5050/companydev/example/scanner:master-with-db"

    pull_policy: always

    entrypoint: [""]

    tags:

    - k8s

    - docker

    variables:

    API_BASE_URL: ${API_BASE_URL}

    API_TOKEN: ${API_TOKEN}

    API_CA_CERT: ${KCS_CA_CERT}

    script:

    - GITLAB_TOKEN=${CI_JOB_TOKEN} /scanner --repo ${CI_REPOSITORY_URL} --branch ${CI_COMMIT_BRANCH} --stdout

    scan_source_commit:

    stage: scan_source_commit

    image:

    name: "company.gitlab.cloud.net:5050/companydev/example/scanner:master-with-db"

    pull_policy: always

    entrypoint: [""]

    tags:

    - k8s

    - docker

    variables:

    API_BASE_URL: ${API_BASE_URL}

    API_TOKEN: ${API_TOKEN}

    API_CA_CERT: ${KCS_CA_CERT}

    script:

    - GITLAB_TOKEN=${CI_JOB_TOKEN} /scanner --repo ${CI_REPOSITORY_URL} --commit ${CI_COMMIT_SHA} --stdout

扫描结果可以在“资源CI/CD”中查看,或以 .SPDX、.JSON 和 .HTML 格式下载。

页首
[Topic 273843]

配置与 GitLab CI/CD 的集成

此示例使用特定的扫描器镜像,其内置漏洞数据库位于卡巴斯基容器安全制造商的镜像仓库中。

要在 GitLab CI/CD 过程中使用镜像扫描功能,您应该启用 GitLab 容器仓库

集成配置包括以下步骤:

  1. 对卡巴斯基容器安全制造商的镜像仓库中的 GitLab CI/CD 授权。
    1. 在集群操作员的工作站上,运行以下命令准备授权数据的 Base64 哈希:

      printf "login:password" | openssl base64 -A

      其中 login 和 password 是卡巴斯基容器安全制造商的镜像仓库中账户的用户名和密码。

    2. 在 GitLab CI/CD 环境变量中,创建 DOCKER_AUTH_CONFIG 变量(在 GitLab 存储库中选择“设置 → CI/CD”,单击“展开”按钮展开变量 ,然后单击“添加变量”按钮)。
    3. 按以下形式指定变量:

      {

      "auths": {

      "repo.cloud.example.com": {

      "auth": "base64hash"

      }

      }

      }

      其中 base64hash 是步骤 1a 中获得的字符串。

  2. 将数据发送到卡巴斯基容器安全时对来自 GitLab CI/CD 的请求进行授权。
    1. 复制“我的个人资料”页面上的 API 令牌。
    2. 在 .gitlab-ci.yml 配置文件的 API_TOKEN 变量中指定复制的 API 令牌值。
  3. 将镜像扫描阶段添加到 CI/CD 过程中。

    要将扫描添加到 CI/CD 管道,您应该将以下行添加到 .gitlab-ci.yml 文件中:

    1. 在代码构建阶段后,按以下形式添加有关包含漏洞和其他恶意对象数据库的扫描器镜像的信息:

      scan_image:

      stage: scanner

      image:

      name: repo.cloud.example.com/repository/company/scanner:v1.2-with-db

      entrypoint: [""]

      pull_policy: always

      我们建议始终指定 pull_policy 参数,以便在每次扫描时接收包含更新的漏洞和其他恶意对象数据库的相关构建。

    2. 指定用于对卡巴斯基容器安全的 CI/CD 扫描器请求进行授权的标签、内部版本 ID、管道 ID 和 API 令牌,如下所示:

      SCAN_TARGET: ${CI_REGISTRY_IMAGE}:master

      BUILD_NUMBER: ${CI_JOB_ID}

      BUILD_PIPELINE: ${CI_PIPELINE_ID}

      API_TOKEN: <API 令牌值>

      下面的示例包含master(主)标签,您还可以指定其他标签。

    3. 如果为私有存储库配置扫描,请指定授权数据以确保扫描器能够访问镜像。授权数据可以设置为变量

      COMPANY_EXT_REGISTRY_USERNAME: ${COMPANY_EXT_REGISTRY_USERNAME}

      COMPANY_EXT_REGISTRY_PASSWORD: ${COMPANY_EXT_REGISTRY_PASSWORD}

    4. 如需要,请指定一个变量,以使用入口控制器的 CA 证书检查 CI/CD 中的数据接收服务器:

      API_CA_CERT:${KCS_CA_CERT}

      入口控制器的 CA 证书在文本字段中指定为 .PEM 格式的字符串:

      ----- BEGIN CERTIFICATE ----- \n... <certificate details> ...\n ----- END CERTIFICATE -----

      如果未设置 API_CA_CERT 变量,则扫描将会开始但不会结束。

      使用入口控制器的 CA 证书,可以让在 CI/CD 中运行的扫描器验证数据接收服务器的真实性。

      如果您使用自签名证书,或者想要跳过使用入口控制器的 CA 证书检查数据接收服务器这一步骤,请指定变量的值以跳过检查,如下所示:

      SKIP_API_SERVER_VALIDATION: 'true'

    5. 指定卡巴斯基容器安全的 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 格式下载。

页首
[Topic 271088]

配置与 Jenkins CI/CD 的集成

配置与 Jenkins CI / CD 的集成包括以下步骤:

  1. 对卡巴斯基容器安全制造商镜像仓库中的 Jenkins CI/CD 授权。为此,在集群操作员的工作站上,运行以下命令以准备授权数据的 Base64 哈希:

    printf "login:password" | openssl base64 -A

    其中 login 和 password 是卡巴斯基容器安全制造商的镜像仓库中账户的用户名和密码。

  2. 卡巴斯基容器安全 API 授权。要执行授权,请完成以下步骤:
    1. 复制“我的个人资料”页面上的 API 令牌。
    2. 在 Jenkinsfile 配置文件的 API_TOKEN 变量中指定复制的 API 令牌值。
  3. 使用 Ingress 控制器的 CA 证书对 CI/CD 中的数据接收服务器进行身份验证。要执行身份验证,请在 Jenkinsfile 配置文件中指定以下变量之一:
    1. -e API_CA_CERT=${KCS_CA_CERT}表示身份验证已执行,并且在 CI/CD 中启动的扫描器可以确保接收服务器是真实的。
    2. -e SKIP_API_SERVER_VALIDATION=true表示不使用 Ingress 控制器的 CA 证书对接收服务器进行身份验证。
  4. 创建 Jenkins 环境变量。

    要创建环境变量,请将以下行添加到 Jenkinsfile:

    1. 添加扫描器所在容器仓库的信息,如下所示:

      LOGIN:扫描器仓库中的账户名称

      PASS:扫描器仓库的密码

    2. 如果为私有存储库配置扫描,请指定以下授权数据,以确保扫描器能够访问镜像:

      COMPANY_EXT_REGISTRY_USERNAME:扫描镜像仓库的账户名称

      COMPANY_EXT_REGISTRY_PASSWORD:扫描镜像仓库的密码

  5. 添加信息以启动扫描器。对于有关启动包含漏洞和其他恶意对象数据库的扫描器的信息,请以声明式或脚本式管道的形式将其添加到 Jenkinsfile 配置文件中。

    以声明式管道形式添加有关启动扫描器的信息的示例

    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.cust02.int.example.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:v1.2.0-with-db jfrog.company.com/demo-kcs/bad:bad-project-test --html --stdout > result.html'

    }

    }

    }

    }

    以脚本式管道形式启动扫描器的数据的示例

    node {

    stage ('run scanner') {

    sh 'docker login -u ${LOGIN} -p ${PASS} company.example.com'

    sh 'docker run -e API_BASE_URL=https://kcs.cust02.int.company.com/ -e API_CA_CERT=${KCS_CA_CERT} -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:v1.2.0-with-db jfrog.company.com/demo-kcs/bad:bad-project-test --html --stdout > result.html'

    }

    }

  6. 生成用于下载的构件。

    您可以生成 .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:v1.2.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”行,如下所示:

    --json --stdout > result.json'

    并在 archiveArtifacts artifacts 行中,以定义的格式指定文件名:“result.json”。

    扫描结果能以您指定的格式获取,也可以在“资源CI/CD”部分查看。

页首
[Topic 271087]

配置与 TeamCity CI/CD 的集成

要配置与 TeamCity CI/CD 的集成:

  1. 复制“我的个人资料”页面上的 API 令牌以在 TeamCity 中授权卡巴斯基容器安全 API
  2. 在 TeamCity 网络界面的设置菜单中,选择构建配置主页参数
  3. 单击添加新参数以添加以下环境变量的值:
    • API_TOKEN – 指定复制的卡巴斯基容器安全 API 令牌的值。
    • API_BASE_URL – 指定卡巴斯基容器安全的 URL。
    • RUST_BACKTRACE – 如有必要,请指定full以使用回溯。
    • SKIP_API_SERVER_VALIDATION – 如果您使用自签名证书或者需要使用 Ingress 控制器的 CA 证书跳过接收服务器的身份验证,请指定true
  4. 转到构建配置主页构建步骤:命令行部分,然后单击添加构建步骤以添加构建步骤
  5. 在打开的窗口中,指定以下构建步骤设置:
    • Runner type下拉列表中,选择命令行
    • 运行下拉列表中,选择自定义脚本
    • 自定义脚本字段中,指定用于扫描的容器的路径(例如,/bin/sh /entrypoint.sh nginx:latest)。
  6. Docker 设置下,指定以下设置:
    • Docker 容器字段内的运行步骤中,指定扫描器在 Docker 仓库中的地址。例如,company.gitlab.cloud.net:5050/companydev/example/scanner:v1.2.0-with-db
    • 其他 docker run 参数字段中,将权限值增加为--privileged
  7. 单击“保存”以保存设置。
  8. 单击页面右上角的运行开始构建。
  9. 如有必要,请下载扫描结果构件,该工件可在 TeamCity Web 界面的构建扫描结果页面的构件选项卡上找到。
页首
[Topic 275732]

定义容器镜像的路径

要开始扫描,解决方案需要确定需要扫描的容器镜像的路径。容器镜像的路径可以通过两种方式指定:

  • 在仓库名称、存储库名称和镜像名称后面指定镜像标签。标签是镜像的可更改且易于阅读的描述。

    在本例中,路径如下所示:<仓库>/<存储库>/<镜像名称>:<标签>。例如,http://docker.io/library/nginx:1.20.1

  • 在仓库名称、存储库和镜像名称后面指定镜像摘要。摘要是镜像的一个不可或缺的内部属性,具体来说,是其内容的哈希(使用 SHA256 哈希算法)。

    使用摘要时,路径的构成如下:<仓库>/<存储库>/<镜像名称><摘要>。例如,http://docker.io/library/nginx@sha256:af9c...69ce

一个标签可以匹配不同的摘要,而每个镜像的摘要都是唯一的。

根据用于指定镜像路径的方法,卡巴斯基容器安全在扫描前执行以下操作之一:

  • 将标签转换为可信摘要。
  • 检查镜像路径中指定的摘要是否可信。对于使用哈希算法编码的对象,如果在维持所需保护时,摘要可确保所需的置信度,则该摘要被视为可信。

只有可信摘要会发送到容器运行时。

在运行容器之前,会将镜像的内容与收到的摘要进行比较。为了确认摘要为可信并且镜像未损坏,卡巴斯基容器安全会检查镜像签名的完整性和真实性

页首
[Topic 265788]

监控镜像的完整性和来源

扫描 CI/CD 中的镜像时,卡巴斯基容器安全可在仓库级别防止镜像欺骗。从 CI 的构建阶段开始,通过验证镜像签名来控制部署在编排器集群中的容器镜像的完整性和来源。

镜像完整性监控分两个阶段:

  • 创建容器镜像后对其进行签名。此过程使用外部签名应用程序实现。
  • 部署镜像之前检查镜像签名。

    解决方案保存了一个基于 SHA256 哈希函数的签名密钥,并用作签名验证的代码。在编排器中部署时,卡巴斯基容器安全会要求签名服务器确认签名的真实性。

卡巴斯基容器安全按如下方式检查镜像签名:

  1. 在“管理集成镜像签名验证器”部分中,可以配置将解决方案与外部镜像签名验证应用程序集成的设置。
  2. 在“策略运行时策略策略”部分中,添加运行时策略来保护镜像的内容。该运行时策略会验证签名的真实性。数字签名根据配置的镜像签名验证器进行验证。
  3. 编排器启动镜像部署,并使用向代理 (kube-agent) 发出部署请求。

    要将请求发送到卡巴斯基容器安全代理,请在 values.yaml 配置文件中配置动态准入控制器。

  4. 根据适用的运行时策略,代理会检查在“管理集成镜像签名验证器”部分中配置的签名验证设置。
  5. 如果检查确认签名的真实性和有效性,解决方案将允许镜像部署。否则,部署将被阻止。
页首
[Topic 263762]

在 SBOM 模式下运行扫描器

卡巴斯基容器安全可在

模式下启动扫描器来检查镜像中是否存在漏洞。在这种情况下,解决方案将扫描专门创建的 SBOM 文件而不是 TAR 存档。

使用 SBOM 的优势如下:

  • 扫描镜像是否存在漏洞所需的资源更少。
  • 由于正确操作的自动验证和解决方案组件的正确使用,减少了扫描时间。
  • 能够扫描镜像中的所有现有漏洞,无一例外。
  • 扫描结果可靠性高。

在 CI/CD 中,扫描过程包括两个阶段:接收 SBOM 文件和根据收到的 SBOM 文件扫描镜像。镜像扫描过程实现如下:

  • CI/CD 扫描器生成镜像组件列表,并将生成的构件发送到卡巴斯基容器安全。
  • 使用镜像处理程序,解决方案将收到的 SBOM 文件转发到扫描器进行扫描。

对于后续扫描,卡巴斯基容器安全会生成

格式的 SBOM 文件。您还可以生成可在 CI/CD 过程中以 格式下载的构件。

要在扫描器执行 SBOM 创建时生成 .SPDX 格式的 SBOM 文件:

在 .gitlab-ci.yml 配置文件中输入以下命令:

- /bin/sh /entrypoint.sh $SCAN_TARGET --sbom-json --spdx --stdout > example.spdx

其中:

<--sbom-json> 指示创建 SBOM 文件。

<--spdx> 指示以 .SPDX 格式生成构件。

<--stdout > example.spdx> 指示数据输出到 .SPDX 格式的文件。

要在扫描器执行 SBOM 创建时生成 .JSON 格式的 SBOM 文件:

在 .gitlab-ci.yml 配置文件中输入以下命令:

- /bin/sh /entrypoint.sh $SCAN_TARGET --sbom-json --stdout > example.json

其中:

<--sbom-json> 指示创建 SBOM 文件。

<--stdout > example.json>指示数据输出到 .JSON 格式的文件。

生成的文件(例如 example.json)被指定为构件:artifacts: paths:

使用 SBOM 文件进行扫描仅适用于扫描镜像是否存在漏洞的情况。如果您的 CI/CD 过程需要扫描其他风险和威胁(例如错误配置),则除了 SBOM 文件之外,还必须单独运行相应的扫描并将其结果添加到镜像处理程序中。

页首
[Topic 264539]

获取 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:

页首
[Topic 265362]

在精简版 SBOM 模式下运行扫描器

卡巴斯基容器安全可在精简版 SBOM 模式下启动扫描器来检查镜像中是否存在漏洞。在这种情况下,解决方案会扫描专门创建的 SBOM 文件,并且该扫描结果在 CI/CD 阶段可用。

通过监听和拦截网络流量获得的数据必须在 CI/CD 环境和解决方案之间安全传输。

您可以生成 .SPDX、.HTML 或 .JSON 格式的下载构件来接收结果。

在 GitLab 中运行扫描器

要在 GitLab 中精简版 SBOM 模式下启动扫描器,需在 CI/CD 进程中配置镜像扫描时编辑 .gitlab-ci.yml 配置文件,如下所示:

  1. 添加在 CI/CD 中启动用于镜像扫描的扫描器的镜像相关信息,如下所示:

    scan_image:

    stage: scanner

    image:

    name:repo.cloud.example.com/repository/company/scanner:v.1.2-lite

    entrypoint: [""]

    pull_policy: always

  2. 指定编排平台标签,如下所示:

    k8s

    在提供的示例中,为 Kubernetes 指定了 k8s 标签,您也可以为其他受支持的编排平台指定标签。

  3. 指定用于对卡巴斯基容器安全的 CI/CD 扫描器请求进行授权的变量,如构建 ID、私有存储库详情、管道 ID 以及 API 令牌,如下所示:

    SCAN_TARGET: ${CI_REGISTRY_IMAGE}:master

    COMPANY_EXT_REGISTRY_USERNAME: ${COMPANY_EXT_REGISTRY_USERNAME}

    COMPANY_EXT_REGISTRY_PASSWORD: ${COMPANY_EXT_REGISTRY_PASSWORD}

    BUILD_NUMBER: ${CI_JOB_ID}

    BUILD_PIPELINE: ${CI_PIPELINE_ID}

    API_TOKEN: <API 令牌值>

  4. 如需要,请指定一个变量,以使用入口控制器的 CA 证书检查 CI/CD 中的数据接收服务器:

    API_CA_CERT: ${KCS_CA_CERT}

    如果未设置 API_CA_CERT 变量,则扫描将会开始但不会结束。

  5. 指定卡巴斯基容器安全的 API 主机服务器的网址:

    API_BASE_URL: <网址>

  6. 指定扫描仪启动时创建 SBOM 文件的命令,支持以下格式之一:
    • 要生成 .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 格式的构件:

      script:

      - /bin/sh /entrypoint.sh $SCAN_TARGET --spdx --stdout > artifact-result.spdx

      artifacts:

      paths:

      - artifact-result.spdx

有关将扫描器配置为在 GitLab 中精简版 SBOM 模式下运行并以 .HTML 格式生成构件的示例

scan_image:

stage: scanner

image:

name: repo.cloud.example.com/repository/company/scanner:v.1.2-lite

entrypoint: [""]

pull_policy: always

tags:

- k8s

variables:

SCAN_TARGET: ${CI_REGISTRY_IMAGE}:master

COMPANY_EXT_REGISTRY_USERNAME: ${COMPANY_EXT_REGISTRY_USERNAME}

COMPANY_EXT_REGISTRY_PASSWORD: ${COMPANY_EXT_REGISTRY_PASSWORD}

BUILD_NUMBER: ${CI_JOB_ID}

BUILD_PIPELINE: ${CI_PIPELINE_ID}

API_CA_CERT: ${KCS_CA_CERT}

API_TOKEN: <API 令牌值>

# Demostand KCS.int API:

API_BASE_URL: <网址>

script:

- /bin/sh /entrypoint.sh $SCAN_TARGET --html --stdout > artifact-result.html

artifacts:

paths:

- artifact-result.html

在 Docker 中运行扫描器

要在 Docker 中以精简版 SBOM 模式启动扫描器:

  1. 指定卡巴斯基容器安全的 API 主机服务器的网址:

    -e API_BASE_URL=https://company.local

  2. 指定变量的值以跳过使用 Ingress 控制器的 CA 证书检查数据接收服务器:

    -e SKIP_API_SERVER_VALIDATION=true

  3. 指定用于对卡巴斯基容器安全的 CI/CD 扫描器请求进行授权的 API 令牌,如下所示:

    -e API_TOKEN=<API 令牌值>

  4. 指定要启动扫描器的数据:

    repo.kcs.company.com/images/scanner:v1.2-lite

  5. 如果您需要生成 .SPDX、.HTML 或 .JSON 格式的下载工件,请指定以下内容:

    - <工件格式> --stdout> result. <文件格式>

    例如:

    --html --stdout > result.html

  6. Enter键启动扫描器。

    如果在调用扫描仪时出现域名解析错误(Name does not resolve(名称无法解析)),则必须在组织的内部 DNS 服务器之前指定 API_BASE_URL 变量之前的地址。例如:

    --dns 10.0.xx.x

    API_BASE_URL: https://company.local/

有关将扫描器配置为在 Docker 中精简版 SBOM 模式下运行并以 .JSON 格式生成构件的示例

pipeline {

agent any

stages {

stage('run scanner') {

steps {

$ 'docker login -u ${LOGIN} -p ${PASS} company.example.com'

$ 'docker run --dns 10.0.10.10 -e API_BASE_URL=https://kcs.int.company.com -e SKIP_API_SERVER_VALIDATION=true -e API_TOKEN=${API_TOKEN} repo.kcs.company.com/images/scanner:v1.2-lite alpine:latest --stdout > result.json'

}

}

stage('archive') {

steps {

archiveArtifacts artifacts: 'result.json'

}

}

}

}

扫描结果能以您指定的格式获取,也可以在"资源CI/CD“部分查看。

页首
[Topic 276521]