Dependency Scanning

Dependency Scanning

Introduced in 10.7.

在开发和测试应用程序时,例如当应用程序使用已知的易受攻击的外部(开源)库时,”依赖关系扫描”有助于自动在依赖项中查找安全漏洞.

如果您使用的是GitLab CI / CD ,则可以使用”依赖关系扫描”来分析依赖关系中的已知漏洞. 扫描所有依赖项,包括传递性依赖项(也称为嵌套依赖项). 您可以通过在现有.gitlab-ci.yml文件中 ,或通过隐式使用Auto DevOps提供的来利用依赖扫描 .

GitLab 检查”依赖性扫描”报告,比较发现的源分支和目标分支之间的漏洞,并显示有关合并请求的信息.

结果按漏洞的严重性排序:

  1. Critical
  2. High
  3. Medium
  4. Low
  5. Unknown
  6. 其他一切

Requirements

要运行依赖扫描作业,默认情况下,你需要 GitLab 亚军与或kubernetes执行. 如果您在 GitLab.com 上使用共享的 Runners,则默认启用该功能.

注意:如果使用自己的 Runners,请确保已安装的 Docker 版本不是 19.03.0 . 有关详细 ,请参见故障排除信息 .

从 GitLab 13.0 开始,仅当您已时,才需要 Docker 特权模式.

Supported languages and package managers

GitLab 依赖于来启动相关分析器,具体取决于存储库中检测到的语言. 当前的检测逻辑将最大搜索深度限制为两个级别. 例如,如果存储库包含Gemfileapi/Gemfile文件,则启用gemnasium-dependency_scanning作业,但如果唯一受支持的依赖性文件是api/client/Gemfile .

支持以下语言和依赖项管理器:

正在制定支持以下语言,依赖性管理器和依赖性文件的计划. 有关详细信息,请参见每个的问题链接.

Contribute your scanner

文档说明了如何将其他安全扫描程序集成到 GitLab 中.

Configuration

To enable Dependency Scanning for GitLab 11.9 and later, you must include the that’s provided as a part of your GitLab installation. For GitLab versions earlier than 11.9, you can copy and use the job as defined that template.

将以下内容添加到您的.gitlab-ci.yml文件中:

随附的模板将在 CI / CD 管道中创建”依赖关系扫描”作业,并扫描项目的源代码以查找可能的漏洞. 结果将保存为” 依赖关系扫描”报告工件 ,您以后可以下载和分析该 . 由于实施限制,我们始终采用最新的”依赖关系扫描”工件.

可以使用.gitlab-ci.ymlvariables参数通过来更改”依赖项扫描”设置. 例如:

  1. include:
  2. - template: Dependency-Scanning.gitlab-ci.yml
  3. variables:
  4. DS_PYTHON_VERSION: 2

因为模板是管道配置的,所以最后提到的变量将具有优先权.

Overriding Dependency Scanning jobs

要覆盖作业定义(例如,更改诸如variablesdependencies类的属性),请声明一个与要覆盖的作业同名的新作业. 将此新作业放置在包含模板之后,并在其下指定其他任何键. 例如,这将禁用DS_REMEDIATEgemnasium分析器:

  1. include:
  2. gemnasium-dependency_scanning:
  3. variables:
  4. DS_REMEDIATE: "false"

Available variables

可以使用环境变量配置依赖性扫描.

Configuring Dependency Scanning

以下变量允许配置全局依赖项扫描设置.

Configuring Docker-in-Docker orchestrator

以下变量配置 Docker-in-Docker 协调器,因此仅在 Docker-in-Docker 模式时才使用.

Configuring specific analyzers used by Dependency Scanning

以下变量用于配置特定的分析器(用于特定的语言/框架).

如果您的私有 Maven 存储库需要登录凭据,则可以使用MAVEN_CLI_OPTS环境变量.

阅读有关更多信息 .

Enabling Docker-in-Docker

在 GitLab Ultimate 12.5 中引入 .

如果需要,可以启用 Docker-in-Docker 来还原 GitLab 13.0 之前存在的 Dependency Scanning 行为. 请按照以下步骤操作:

  1. 在使用 Docker-in-Docker 配置 GitLab Runner.
  2. Set the DS_DISABLE_DIND variable to false:

    1. include:
    2. - template: Dependency-Scanning.gitlab-ci.yml
    3. variables:
    4. DS_DISABLE_DIND: "false"

这将在您的 CI / CD 管道中创建一个dependency_scanning作业,而不是多个<analyzer-name>-dependency_scanning作业.

一旦发现漏洞,便可以与其进行交互. 阅读有关如何与漏洞进行更多信息.

Solutions for vulnerabilities (auto-remediation)

可以通过应用 GitLab 自动生成的解决方案来修复某些漏洞. 阅读有关更多信息.

Security Dashboard

在”安全仪表板”中,您可以概览您的组,项目和管道中的所有安全漏洞. 阅读有关更多信息 .

Vulnerabilities database update

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

Dependency List

依赖项扫描的另一个好处是能够查看项目的依赖项及其已知漏洞. 阅读有关依赖列表的更多信息.

依赖关系扫描工具将发出 JSON 报告文件. 有关更多信息,请参见此的架构 .

这是一个示例依赖性扫描报告:

Versioning and release process

Contributing to the vulnerability database

您可以搜索项目,以在 Gemnasium 数据库中找到漏洞. 您还可以提交新漏洞 .

Running Dependency Scanning in an offline environment

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

Requirements for offline Dependency Scanning

以下是在脱机环境中使用依赖关系扫描的要求:

  • Keep Docker-In-Docker disabled (default).
  • GitLab 亚军与dockerkubernetes执行 .
  • Docker 容器注册表以及 Dependency Scanning 映像的本地可用副本.
  • 托管gemnasium-db 咨询数据库的脱机 Git 副本
  • 仅在扫描 Ruby 项目时 :托管的脱机 Git 副本.
  • 仅在扫描 npm / yarn 项目时 :托管retire.jsjs咨询数据库的脱机副本.

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

对于具有所有受支持的语言和框架的依赖关系扫描,请将以下默认的依赖关系扫描分析器映像从registry.gitlab.com导入 :

  1. registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium:2
  2. registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven:2
  3. registry.gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python:2
  4. registry.gitlab.com/gitlab-org/security-products/analyzers/retire.js:2
  5. registry.gitlab.com/gitlab-org/security-products/analyzers/bundler-audit:2

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

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

Set Dependency Scanning CI job variables to use local Dependency Scanning analyzers

将以下配置添加到您的.gitlab-ci.yml文件. 您必须替换SECURE_ANALYZERS_PREFIX才能引用本地 Docker 容器注册表:

  1. include:
  2. - template: Dependency-Scanning.gitlab-ci.yml
  3. variables:
  4. SECURE_ANALYZERS_PREFIX: "docker-registry.example.com/analyzers"
  5. GEMNASIUM_DB_REMOTE_URL: "gitlab.example.com/gemnasium-db.git"
  6. GIT_SSL_NO_VERIFY: "true"

请参阅以上变量的说明.

Specific settings for languages and package managers

请参阅以下各节,以配置特定的语言和程序包管理器.

JavaScript (npm and yarn) projects

将以下内容添加到.gitlab-ci.yml的变量部分:

  1. RETIREJS_JS_ADVISORY_DB: "example.com/jsrepository.json"
  2. RETIREJS_NODE_ADVISORY_DB: "example.com/npmrepository.json"

Ruby (gem) projects

将以下内容添加到.gitlab-ci.yml的变量部分:

Python (setuptools)

当为私有 PyPi 存储库使用自签名证书时,不需要额外的作业配置(除了上面的模板.gitlab-ci.yml ). 但是,您必须更新setup.py以确保它可以到达您的私有存储库. 这是一个示例配置:

  1. 更新setup.py ,以为install_requires列表中的每个依赖项创建一个指向您的私有存储库的dependency_links属性:

    1. install_requires=['pyparsing>=2.0.3'],
    2. dependency_links=['https://pypi.example.com/simple/pyparsing'],
  2. 从存储库 URL 中获取证书并将其添加到项目中:

    1. echo -n | openssl s_client -connect pypi.example.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > internal.crt
  3. setup.py指向新下载的证书:

    1. import setuptools.ssl_support
    2. setuptools.ssl_support.cert_paths = ['internal.crt']

Limitations

分析器不支持使用 JavaScript 项目的package.json本地路径进行的依赖项引用. 依赖项扫描针对此类引用输出以下错误:

解决方法是,从删除retire.js分析器.

Error response from daemon: error processing tar file: docker-tar: relocation error