Container Scanning

Container Scanning

Introduced in 10.4.

应用程序的 Docker 映像本身可能基于包含已知漏洞的 Docker 映像. 通过在管道中包含一个额外的作业来扫描这些漏洞并将其显示在合并请求中,您可以使用 GitLab 来审核基于 Docker 的应用程序. 默认情况下,GitLab 中的容器扫描基于Clair和 ,这是用于对容器中的漏洞进行静态分析的开源工具. GitLab 的 Klar 分析仪扫描容器并用作 Clair 的包装纸.

注意:要将除 Clair 和 Klar 以外的其他到 GitLab 中,请参阅” 安全扫描器集成” .

您可以通过执行以下任一操作来启用容器扫描:

GitLab 比较发现的源分支与目标分支之间的漏洞,并在合并请求中直接显示信息.

Requirements

要在管道中启用容器扫描,您需要以下内容:

  • 带有或Kubernetes执行器的 .
  • Docker 18.09.03或更高版本与 Runner 安装在同一台计算机上. 如果您在 GitLab.com 上使用共享的 Runners,那么情况已经如此.
  • 构建 Docker 镜像送到项目的容器注册表中. Docker 映像的名称应使用以下预定义的环境变量

    您可以在.gitlab-ci.yml文件中直接使用它们:

    1. build:
    2. image: docker:19.03.12
    3. stage: build
    4. services:
    5. - docker:19.03.12-dind
    6. variables:
    7. IMAGE_TAG: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
    8. script:
    9. - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    10. - docker build -t $IMAGE_TAG .
    11. - docker push $IMAGE_TAG

Configuration

启用容器扫描的方式取决于您的 GitLab 版本:

要包括Container-Scanning.gitlab-ci.yml模板(GitLab 11.9 及更高版本),请将以下内容添加到您的.gitlab-ci.yml文件中:

  1. include:
  2. - template: Container-Scanning.gitlab-ci.yml

包含的模板:

  • 在 CI / CD 管道中创建container_scanning作业.
  • 从项目的拉出已构建的 Docker 映像(请参阅要求 ),并扫描其可能的漏洞.

GitLab 将结果保存为” ,您可以稍后下载和分析. 下载时,您始终会收到最新的工件.

以下是一个示例.gitlab-ci.yml ,用于构建您的 Docker 映像,将其推送到 Container Registry 并扫描容器:

  1. variables:
  2. DOCKER_DRIVER: overlay2
  3. stages:
  4. - build
  5. - test
  6. build:
  7. image: docker:stable
  8. stage: build
  9. services:
  10. - docker:19.03.12-dind
  11. variables:
  12. IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
  13. script:
  14. - docker info
  15. - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
  16. - docker build -t $IMAGE .
  17. include:
  18. - template: Container-Scanning.gitlab-ci.yml

此示例包括容器扫描模板,并通过将CLAIR_OUTPUT环境变量设置为High来启用 Clair 的详细输出:

Available variables

可以使用环境变量配置容器扫描.

如果要覆盖作业定义(例如,更改诸如variables属性),则必须在container_scanning模板之后声明一个container_scanning作业,然后指定任何其他键. 例如:

  1. include:
  2. - template: Container-Scanning.gitlab-ci.yml
  3. container_scanning:
  4. variables:
  5. GIT_STRATEGY: fetch

Deprecated: GitLab 13.0 and later doesn’t support . When overriding the template, you must use rules instead.

要允许列表特定漏洞,请按照下列步骤操作:

  1. 设置GIT_STRATEGY: fetch按照的说明, GIT_STRATEGY: fetch .gitlab-ci.yml文件.
  2. 在名为vulnerability-allowlist.yml的 YAML 文件中定义允许列出的漏洞. 这必须使用许可清单示例文件中描述的格式.
  3. vulnerability-allowlist.yml文件添加到项目的 Git 存储库中.

对于在通过互联网有限,受限或间歇性访问外部资源的环境中进行自我管理的 GitLab 实例,需要进行一些调整才能使容器扫描作业成功运行. 有关更多信息,请参阅 .

Requirements for offline Container Scanning

要在脱机环境中使用容器扫描,您需要:

  • GitLab 亚军与 .
  • 要使用 Container Scanning 分析器映像的副本配置本地 Docker Container Registry,请在 .

注意: GitLab Runner 的默认pull policyalways ,这意味着即使本地副本可用,Runner 也会尝试从 GitLab 容器注册表中拉取 Docker 映像. 如果您只喜欢使用本地可用的 Docker 映像,则可以在离线环境 GitLab Runner 的pull_policy设置为if-not-present . 但是,如果不在离线环境中,我们建议将拉取策略设置保持为always ,因为这样可以在 CI / CD 管道中使用更新的扫描仪.

Make GitLab Container Scanning analyzer images available inside your Docker registry

对于容器扫描,将以下默认图像从registry.gitlab.com导入本地 Docker 容器注册表

  1. registry.gitlab.com/gitlab-org/security-products/analyzers/klar
  2. https://hub.docker.com/r/arminc/clair-db

将 Docker 映像导入本地脱机 Docker 注册表的过程取决于您的网络安全策略 . 请咨询您的 IT 员工,以找到可以导入或临时访问外部资源的已接受和批准的流程. 请注意,这些扫描程序会使用新定义进行更新 ,因此请考虑您是否能够自己进行定期更新.

有关更多信息,请参见 .

有关将 Docker 映像保存和传输为文件的详细信息,请参阅 Docker 有关docker save , , docker export和的文档.

Set Container Scanning CI job variables to use local Container Scanner analyzers

  1. .gitlab-ci.yml文件中的容器扫描模板 ,以引用本地 Docker 容器注册表中托管的 Docker 映像:

    1. include:
    2. - template: Container-Scanning.gitlab-ci.yml
    3. container_scanning:
    4. image: $CI_REGISTRY/namespace/gitlab-klar-analyzer
    5. variables:
    6. CLAIR_DB_IMAGE: $CI_REGISTRY/namespace/clair-vulnerabilities-db
  2. 如果您的本地 Docker 容器注册表正在通过HTTPS安全运行,但是您使用的是自签名证书,则必须在.gitlab-ci.yml的上述container_scanning部分中将DOCKER_INSECURE: "true"设置为.

Automating Container Scanning vulnerability database updates with a pipeline

上面的模板适用于在本地安装上运行的 GitLab Docker 注册表,但是,如果您使用的是非 GitLab Docker 注册表,则需要更改$CI_REGISTRY值和 Docker docker login凭据以匹配以下内容:您的本地注册表.

可以对 Docker 容器运行GitLab 容器扫描工具 ,而无需在 CI 作业的上下文中运行它. 要直接扫描图像,请按照下列步骤操作:

  1. Run or Docker Machine.
  2. 运行最新的 Docker 映像:

    1. docker run -p 5432:5432 -d --name clair-db arminc/clair-db:latest
  3. Configure an environment variable to point to your local machine’s IP address (or insert your IP address instead of the LOCAL_MACHINE_IP_ADDRESS variable in the CLAIR_DB_CONNECTION_STRING in the next step):

    1. export LOCAL_MACHINE_IP_ADDRESS=your.local.ip.address
  4. 运行分析器的 Docker 映像,并在CI_APPLICATION_REPOSITORYCI_APPLICATION_TAG环境变量中传递要分析的映像和标签:

    1. docker run \
    2. --interactive --rm \
    3. --volume "$PWD":/tmp/app \
    4. -e CI_PROJECT_DIR=/tmp/app \
    5. -e CLAIR_DB_CONNECTION_STRING="postgresql://postgres:password@${LOCAL_MACHINE_IP_ADDRESS}:5432/postgres?sslmode=disable&statement_timeout=60000" \
    6. -e CI_APPLICATION_REPOSITORY=registry.gitlab.com/gitlab-org/security-products/dast/webgoat-8.0@sha256 \
    7. -e CI_APPLICATION_TAG=bc09fe2e0721dfaeee79364115aeedf2174cce0947b9ae5fe7c33312ee019a4e \
    8. registry.gitlab.com/gitlab-org/security-products/analyzers/klar

结果存储在gl-container-scanning-report.json .

Reports JSON format

容器扫描工具会发出 JSON 报告文件. 有关更多信息,请参见此的架构 .

这是示例容器扫描报告:

Security Dashboard

安全仪表板向您显示组,项目和管道中所有安全漏洞的概述.

有关漏洞数据库更新的更多信息,请查看 .

Interacting with the vulnerabilities

一旦发现漏洞,便可以 .

Solutions for vulnerabilities (auto-remediation)

可以通过应用 GitLab 自动生成的解决方案来修复某些漏洞.

为了使整治的支持,对扫描工具必须能够访问Dockerfile指定由环境变量. 为确保扫描工具可以访问此文件,有必要设置GIT_STRATEGY: fetch按照本文档中” 部分中介绍的说明,在.gitlab-ci.yml文件中进行GIT_STRATEGY: fetch .

阅读有关更多信息.

这是由于 Docker 中的一个错误而导致的,该错误现已修复 . 为避免该错误,请确保 Runner 使用的 Docker 版本为18.09.03或更高. 有关更多信息,请参见 .