Container Scanning
- Overview
- Configuration
- Running the standalone Container Scanning Tool
- Security Dashboard
- Interacting with the vulnerabilities
- Troubleshooting
Container Scanning
Introduced in 10.4.
应用程序的 Docker 映像本身可能基于包含已知漏洞的 Docker 映像. 通过在管道中包含一个额外的作业来扫描这些漏洞并将其显示在合并请求中,您可以使用 GitLab 来审核基于 Docker 的应用程序. 默认情况下,GitLab 中的容器扫描基于Clair和 ,这是用于对容器中的漏洞进行静态分析的开源工具. GitLab 的 Klar 分析仪扫描容器并用作 Clair 的包装纸.
注意:要将除 Clair 和 Klar 以外的其他到 GitLab 中,请参阅” 安全扫描器集成” .
您可以通过执行以下任一操作来启用容器扫描:
- 在现有的
.gitlab-ci.yml
文件中 . - 隐式使用Auto DevOps提供的 容器扫描 .
GitLab 比较发现的源分支与目标分支之间的漏洞,并在合并请求中直接显示信息.
Requirements
要在管道中启用容器扫描,您需要以下内容:
- 带有或Kubernetes执行器的 .
- Docker
18.09.03
或更高版本与 Runner 安装在同一台计算机上. 如果您在 GitLab.com 上使用共享的 Runners,那么情况已经如此. 构建 Docker 镜像送到项目的容器注册表中. Docker 映像的名称应使用以下预定义的环境变量 :
您可以在
.gitlab-ci.yml
文件中直接使用它们:build:
image: docker:19.03.12
stage: build
services:
- docker:19.03.12-dind
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
Configuration
启用容器扫描的方式取决于您的 GitLab 版本:
- GitLab 11.9 及更高版本: 包括 GitLab 安装随附的 .
- 11.9 之前的 GitLab 版本:从
Container-Scanning.gitlab-ci.yml
模板复制并使用作业.
要包括Container-Scanning.gitlab-ci.yml
模板(GitLab 11.9 及更高版本),请将以下内容添加到您的.gitlab-ci.yml
文件中:
include:
- template: Container-Scanning.gitlab-ci.yml
包含的模板:
- 在 CI / CD 管道中创建
container_scanning
作业. - 从项目的拉出已构建的 Docker 映像(请参阅要求 ),并扫描其可能的漏洞.
GitLab 将结果保存为” ,您可以稍后下载和分析. 下载时,您始终会收到最新的工件.
以下是一个示例.gitlab-ci.yml
,用于构建您的 Docker 映像,将其推送到 Container Registry 并扫描容器:
variables:
DOCKER_DRIVER: overlay2
stages:
- build
- test
build:
image: docker:stable
stage: build
services:
- docker:19.03.12-dind
variables:
IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
script:
- docker info
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker build -t $IMAGE .
include:
- template: Container-Scanning.gitlab-ci.yml
此示例包括容器扫描模板,并通过将CLAIR_OUTPUT
环境变量设置为High
来启用 Clair 的详细输出:
Available variables
可以使用环境变量配置容器扫描.
如果要覆盖作业定义(例如,更改诸如variables
属性),则必须在container_scanning
模板之后声明一个container_scanning
作业,然后指定任何其他键. 例如:
include:
- template: Container-Scanning.gitlab-ci.yml
container_scanning:
variables:
GIT_STRATEGY: fetch
Deprecated: GitLab 13.0 and later doesn’t support . When overriding the template, you must use rules
instead.
要允许列表特定漏洞,请按照下列步骤操作:
- 设置
GIT_STRATEGY: fetch
按照的说明,GIT_STRATEGY: fetch
.gitlab-ci.yml
文件. - 在名为
vulnerability-allowlist.yml
的 YAML 文件中定义允许列出的漏洞. 这必须使用许可清单示例文件中描述的格式. - 将
vulnerability-allowlist.yml
文件添加到项目的 Git 存储库中.
对于在通过互联网有限,受限或间歇性访问外部资源的环境中进行自我管理的 GitLab 实例,需要进行一些调整才能使容器扫描作业成功运行. 有关更多信息,请参阅 .
Requirements for offline Container Scanning
要在脱机环境中使用容器扫描,您需要:
- GitLab 亚军与 .
- 要使用 Container Scanning 分析器映像的副本配置本地 Docker Container Registry,请在 .
注意: GitLab Runner 的默认pull policy
为always
,这意味着即使本地副本可用,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 容器注册表 :
registry.gitlab.com/gitlab-org/security-products/analyzers/klar
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
.gitlab-ci.yml
文件中的容器扫描模板 ,以引用本地 Docker 容器注册表中托管的 Docker 映像:include:
- template: Container-Scanning.gitlab-ci.yml
container_scanning:
image: $CI_REGISTRY/namespace/gitlab-klar-analyzer
variables:
CLAIR_DB_IMAGE: $CI_REGISTRY/namespace/clair-vulnerabilities-db
如果您的本地 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 作业的上下文中运行它. 要直接扫描图像,请按照下列步骤操作:
- Run or Docker Machine.
运行最新的 Docker 映像:
docker run -p 5432:5432 -d --name clair-db arminc/clair-db:latest
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 theCLAIR_DB_CONNECTION_STRING
in the next step):export LOCAL_MACHINE_IP_ADDRESS=your.local.ip.address
运行分析器的 Docker 映像,并在
CI_APPLICATION_REPOSITORY
和CI_APPLICATION_TAG
环境变量中传递要分析的映像和标签:docker run \
--interactive --rm \
--volume "$PWD":/tmp/app \
-e CI_PROJECT_DIR=/tmp/app \
-e CLAIR_DB_CONNECTION_STRING="postgresql://postgres:password@${LOCAL_MACHINE_IP_ADDRESS}:5432/postgres?sslmode=disable&statement_timeout=60000" \
-e CI_APPLICATION_REPOSITORY=registry.gitlab.com/gitlab-org/security-products/dast/webgoat-8.0@sha256 \
-e CI_APPLICATION_TAG=bc09fe2e0721dfaeee79364115aeedf2174cce0947b9ae5fe7c33312ee019a4e \
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
或更高. 有关更多信息,请参见 .