Dynamic Application Security Testing (DAST)

Dynamic Application Security Testing (DAST)

Introduced in 10.4.

注意:白皮书“应用程序安全性发生了说明了前 6 种攻击中有 4 种是基于应用程序的 . 下载它以了解如何保护您的组织.

对代码运行静态检查是检测可能使代码安全性受到威胁的漏洞的第一步. 但是,一旦部署,您的应用程序将面临一类新的可能的攻击,例如跨站点脚本或损坏的身份验证缺陷. 这是动态应用程序安全性测试(DAST)实施的地方.

如果您使用的是 ,则可以使用动态应用程序安全性测试(DAST)分析运行中的 Web 应用程序是否存在已知漏洞. 您可以通过在现有文件中包含 CI 作业 ,或通过隐式使用提供的Auto 来利用DAST .

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

注意:此比较逻辑仅使用针对目标分支的基本提交执行的最新管道. 在任何其他提交上运行管道对合并请求没有影响.

通过单击检测到的链接漏洞之一,您可以查看详细信息和受影响的 URL.

DAST Widget Clicked

使用流行的开源工具OWASP Zed Attack Proxy对运行中的 Web 应用程序执行分析.

默认情况下,DAST 执行并仅执行被动扫描. 它不会主动攻击您的应用程序. 但是,可以将 DAST 配置为还执行主动扫描 :攻击您的应用程序并生成更广泛的安全报告. 与结合使用可能非常有用.

注意:管道可能包含多个作业,包括 SAST 和 DAST 扫描. 如果任何作业由于任何原因未能完成,则安全信息中心将不会显示 DAST 扫描仪输出. 例如,如果 DAST 作业完成但 SAST 作业失败,则安全性仪表板将不会显示 DAST 结果. 分析器将在失败时输出退出代码 .

Use cases

它可以帮助您在开发和测试应用程序时自动查找正在运行的 Web 应用程序中的安全漏洞.

Requirements

要运行 DAST 作业,您需要具有 GitLab Runner.

Configuration

对于 GitLab 11.9 和更高版本,要启用 DAST,您必须 DAST.gitlab-ci.yml模板 ,该作为 GitLab 安装的一部分提供. 对于 11.9 之前的 GitLab 版本,您可以复制和使用该模板中定义的作业.

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

有两种方法来定义要由 DAST 扫描的 URL:

  1. 设置DAST_WEBSITE 变量 .

  2. 将其添加到项目根目录的environment_url.txt文件中. 这非常适合在动态环境中进行测试. 为了针对在 GitLab CI / CD 管道中动态创建的应用程序运行 DAST,请让该应用程序将其域保留在environment_url.txt文件中,然后 DAST 自动解析该文件以找到其扫描目标. 您可以在我们的 Auto DevOps CI YAML 中看到一个 .

如果同时设置了两个值,则DAST_WEBSITE值优先.

随附的模板会在 CI / CD 管道中创建dast工作,并扫描项目的源代码中可能存在的漏洞.

结果将保存为DAST 报告工件 ,您可以稍后下载和分析. 由于实施限制,我们始终采用最新的 DAST 工件. 在后台, 用于在指定的 URL 上运行测试并扫描它是否存在漏洞.

默认情况下,DAST 模板将使用 DAST Docker 映像的最新主版本. 使用DAST_VERSION变量,您可以选择 DAST 更新的方式:

  • 通过固定到主要版本(例如1 )自动更新具有新功能和修复程序的 DAST.
  • 仅通过固定到次要版本(例如1.6 )来更新修补程序.
  • 通过固定到特定版本(例如1.6.4 )来防止所有更新.

在” 发行”页面上找到最新的 DAST 版本.

使用DAST.gitlab-ci.yml模板时, dast作业最后运行,如下例所示. 为确保 DAST 正在扫描最新代码,您的 CI 管道应在dast作业之前的dast作业dast更改部署到 Web 服务器.

  1. stages:
  2. - build
  3. - test
  4. - deploy
  5. - dast

请注意,如果您将管道配置为在每次运行中都部署到同一 Web 服务器,则在另一个管道仍在运行时运行管道可能会导致争用情况,其中一个管道会覆盖另一个管道的代码. 在 DAST 扫描期间,应从更改中排除要扫描的站点. 对该站点的唯一更改应来自 DAST 扫描仪. 请注意,在扫描过程中,用户,计划任务,数据库更改,代码更改,其他管道或其他扫描程序对站点所做的任何更改都可能导致结果不准确.

Hide sensitive information

在 GitLab 13.1 中引入 .

HTTP 请求和响应标头可能包含敏感信息,包括 cookie 和授权凭证. 默认情况下,以下标头被屏蔽:

  • Authorization.
  • Proxy-Authorization.
  • Set-Cookie (仅值).
  • Cookie (values only).

使用 ,可以列出要屏蔽其值的标头. 有关如何屏蔽标题的详细信息,请参阅” 自定义 DAST 设置” .

Authentication

在执行 DAST 检查之前,还可以对用户进行身份验证.

创建掩码变量以传递 DAST 将使用的凭据. 要为用户名和密码创建掩码变量,请参阅在 UI 中创建自定义变量 . 请注意,username 变量的密钥必须为DAST_USERNAME ,而 password 变量的密钥必须为DAST_PASSWORD .

与认证扫描相关的其他变量是:

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_WEBSITE: https://example.com
  5. DAST_AUTH_URL: https://example.com/sign-in
  6. DAST_USERNAME_FIELD: session[user] # the name of username field at the sign-in HTML form
  7. DAST_PASSWORD_FIELD: session[password] # the name of password field at the sign-in HTML form
  8. DAST_AUTH_EXCLUDE_URLS: http://example.com/sign-out,http://example.com/sign-out-2 # optional, URLs to skip during the authenticated scan; comma-separated, no spaces in between

危险: 切勿对生产服务器运行经过身份验证的扫描. 运行经过身份验证的扫描时,它可以执行经过身份验证的用户可以执行的任何功能. 这包括修改和删除数据,提交表单以及跟随链接之类的操作. 仅对测试服务器运行经过身份验证的扫描.

Full scan

可以将 DAST 配置为执行ZAP 全面扫描 ,其中包括针对同一目标网站的被动扫描和主动扫描:

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_FULL_SCAN_ENABLED: "true"

Domain validation

DAST 作业可以在任何地方运行,这意味着您可能会意外击中实时 Web 服务器并可能损坏它们. 您甚至可以减少生产环境. 因此,您应该使用域验证.

默认情况下,不需要域验证. 通过将环境变量 DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED设置为"true"可能需要它.

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_FULL_SCAN_ENABLED: "true"
  5. DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED: "true"

由于 ZAP 全面扫描会主动攻击目标应用程序,因此 DAST 会事先向目标(通常在DAST_WEBSITEenvironment_url.txt定义)发送 ping 命令.

  • 如果DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIREDfalse或未设置,则将继续进行扫描,除非对 ping 的响应包含值为denyGitlab-DAST-Permission标头.
  • 如果DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIREDtrue ,则扫描将退出除非对 ping 响应包括一个Gitlab-DAST-Permission用的头值allow .

以下是在 Rails,Django 和 Node(使用 Express)中向响应添加Gitlab-DAST-Permission标头的一些示例.

Ruby on Rails

这是在 Ruby on Rails 中添加 :

  1. class DastWebsiteTargetController < ActionController::Base
  2. def dast_website_target
  3. response.headers['Gitlab-DAST-Permission'] = 'allow'
  4. head :ok
  5. end
  6. end
Django

Here’s how you would add a :

  1. class DastWebsiteTargetView(View):
  2. def head(self, *args, **kwargs):
  3. response = HttpResponse()
  4. response['Gitlab-Dast-Permission'] = 'allow'
  5. return response
Node (with Express)

这是添加自定义标头的方法

  1. app.get('/dast-website-target', function(req, res) {
  2. res.append('Gitlab-DAST-Permission', 'allow')
  3. res.send('Respond to DAST ping')
  4. })
Domain validation header via a proxy

也可以通过代理添加Gitlab-DAST-Permission标头.

NGINX

以下配置允许 NGINX 充当反向代理并添加Gitlab-DAST-Permission

  1. # default.conf
  2. server {
  3. listen 80;
  4. server_name localhost;
  5. location / {
  6. proxy_pass http://test-application;
  7. add_header Gitlab-DAST-Permission allow;
  8. }
  9. }
Apache

Apache 还可以用作以添加Gitlab-DAST-Permission 标头 .

为此, httpd.conf添加到httpd.conf

包含完整的文件,该文件配置为充当远程代理并添加Gitlab-DAST-Permission标头.

API scan

in GitLab Ultimate 12.10.

使用 API​​规范作为扫描目标是一种为 URL 注入用于扫描 API 的有用方法. API 扫描中的漏洞规则与普通网站扫描中的漏洞规则不同.

Specification format

API 扫描支持 OpenAPI V2 和 OpenAPI V3 规范. 您可以使用JSONYAML定义这些规范.

Import API specification from a URL

如果可以通过 URL 访问 API 规范,则可以直接将该 URL 作为目标传递. 该规范不必与要测试的 API 托管在同一主机上.

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_API_SPECIFICATION: http://my.api/api-specification.yml

Import API specification from a file

如果您的存储库中有 API 规范,则可以直接提供规范的文件名作为目标. 规范文件应位于/zap/wrk目录中.

  1. dast:
  2. script:
  3. - mkdir -p /zap/wrk
  4. - cp api-specification.yml /zap/wrk/api-specification.yml
  5. - /analyze -t $DAST_WEBSITE
  6. variables:
  7. GIT_STRATEGY: fetch
  8. DAST_API_SPECIFICATION: api-specification.yml

Full scan

API 扫描支持完全扫描,可以使用DAST_FULL_SCAN_ENABLED环境变量来启用它. 完整的 API 扫描不支持域验证.

Host override

规范通常定义一个主机,其中包含一个域名和一个端口. 引用的主机可能与 API 的审阅实例的主机不同. 这可能导致导入不正确的 URL,或对不正确的主机进行扫描. 使用DAST_API_HOST_OVERRIDE环境变量来覆盖这些值.

例如,对于包含以下内容的 OpenAPI V3 规范:

  1. - url: https://api.host.com

如果 API 的测试版本在https://api-test.host.com上运行,则可以使用以下 DAST 配置:

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_API_SPECIFICATION: http://api-test.host.com/api-specification.yml
  5. DAST_API_HOST_OVERRIDE: api-test.host.com

请注意, DAST_API_HOST_OVERRIDE仅适用于 URL 导入的规范.

Authentication using headers

请求标头中的令牌通常用作验证 API 请求的方式. 您可以通过使用DAST_REQUEST_HEADERS环境变量来实现. 标头适用于 DAST 提出的每个请求.

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_API_SPECIFICATION: http://api-test.api.com/api-specification.yml
  5. DAST_REQUEST_HEADERS: "Authorization: Bearer my.token"

Customizing the DAST settings

弃用:从 GitLab 13.0 开始,不再支持onlyexcept的使用. 覆盖模板时,必须使用 .

可以使用.gitlab-ci.ymlvariables参数通过环境变量更改 DAST 设置. 这些变量记录在 .

例如:

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_WEBSITE: https://example.com
  5. DAST_SPIDER_MINS: 120

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

可以使用环境变量配置 DAST.

DAST command-line options

并非所有 DAST 配置都可以通过环境变量获得. 要找出所有可能的选项,请运行以下配置. 可用的命令行选项将被打印到作业日志中:

  1. include:
  2. template: DAST.gitlab-ci.yml
  3. dast:
  4. script:
  5. - /analyze --help

然后,您必须覆盖script命令以传递适当的参数. 例如,可以使用选项-D延迟被动扫描. 以下配置将被动扫描延迟了五分钟:

  1. include:
  2. template: DAST.gitlab-ci.yml
  3. dast:
  4. script:
  5. - export DAST_WEBSITE=${DAST_WEBSITE:-$(cat environment_url.txt)}
  6. - /analyze -D 300 -t $DAST_WEBSITE

Custom ZAProxy configuration

Cloning the project’s repository

DAST 作业在运行时不需要存在项目的存储库,因此默认情况下GIT_STRATEGY设置为none .

Debugging DAST jobs

A DAST job has two executing processes:

  • ZAP 服务器.
  • 启动,控制和停止 ZAP 服务器的一系列脚本.

可以使用DAST_DEBUG环境变量来启用脚本的调试模式. 这在对作业进行故障排除时会有所帮助,并且将输出指示扫描完成百分比的语句. 有关使用变量的详细信息,请参见覆盖 DAST 模板 .

可以使用DAST_ZAP_LOG_CONFIGURATION环境变量启用 ZAP 服务器的调试模式. 下表概述了可以设置的值的示例,以及它们对记录的输出的影响. 可以指定多个值,以分号分隔.

日志配置值 Effect
log4j.rootLogger=DEBUG 启用所有调试日志记录语句.
log4j.logger.org.apache.commons.httpclient=DEBUG 记录 ZAP 服务器所做的每个 HTTP 请求和响应.
log4j.logger.org.zaproxy.zap.spider.SpiderController=DEBUG 在目标的蜘蛛扫描期间找到的日志 URL.
log4j.logger.com.crawljax=DEBUG 启用 Ajax Crawler 调试日志记录语句.
log4j.logger.org.parosproxy.paros=DEBUG 启用 ZAP 服务器代理调试日志记录语句.
log4j.logger.org.zaproxy.zap=DEBUG 启用常规 ZAP 服务器代码的调试日志记录语句.

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

Requirements for offline DAST support

要在离线环境中使用 DAST,您需要:

  • GitLab 亚军与 .
  • 带有 DAST 容器映像的本地可用副本的 Docker 容器注册表,可在 .

Note: GitLab Runner has a default pull policy of always, meaning the Runner tries to pull Docker images from the GitLab container registry even if a local copy is available. GitLab Runner’s in an offline environment if you prefer using only locally available Docker images. However, we recommend keeping the pull policy setting to always if not in an offline environment, as this enables the use of updated scanners in your CI/CD pipelines.

对于 DAST,将以下默认 DAST 分析器映像从registry.gitlab.com导入到本地 Docker 容器注册表

  • registry.gitlab.com/gitlab-org/security-products/dast:latest

The process for importing Docker images into a local offline Docker registry depends on 您的网络安全政策. Please consult your IT staff to find an accepted and approved process by which external resources can be imported or temporarily accessed. Note that these scanners are with new definitions, so consider if you’re able to make periodic updates yourself.

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

Set DAST CI job variables to use local DAST analyzers

将以下配置添加到您的.gitlab-ci.yml文件. 您必须替换image以引用本地 Docker 容器注册表中托管的 DAST Docker 映像:

  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. dast:
  4. image: registry.example.com/namespace/dast:latest

DAST 作业现在应该使用 DAST 分析器的本地副本来扫描您的代码并生成安全报告,而无需访问 Internet.

或者,您可以使用变量SECURE_ANALYZERS_PREFIX覆盖dast映像的基本注册表地址.

On-Demand Scans

版本历史

  • 在 GitLab 13.2 中引入 .
  • 它部署在功能标记后面,默认情况下处于禁用状态.
  • 在 GitLab.com 上已禁用.
  • 每个项目都可以启用或禁用它.
  • 要在 GitLab 自管实例中使用它,请让 GitLab 管理员 .

在 DevOps 生命周期之外,可以根据需要针对目标网站运行被动 DAST 扫描. 这些扫描将始终与项目的默认分支或master分支关联,并且结果可以在项目仪表板中看到.

Enable or disable On-Demand Scans

按需扫描正在开发中,尚未准备好用于生产. 它部署在默认情况下禁用的功能标志的后面. 有权访问 GitLab Rails 控制台的 GitLab 管理员可以为您的实例启用它. 可以按项目启用或禁用按需扫描

要启用它:

  1. # Instance-wide
  2. Feature.enable(:security_on_demand_scans_feature_flag)
  3. # or by project
  4. Feature.enable(:security_on_demand_scans_feature_flag, Project.find(<project id>))

To disable it:

  1. # Instance-wide
  2. Feature.disable(:security_on_demand_scans_feature_flag)
  3. # or by project
  4. Feature.disable(:security_on_demand_scans_feature_flag, Project.find(<project id>))

Reports

默认情况下,DAST 工具以 JSON 格式输出报告文件. 但是,此工具还可以生成 Markdown,HTML 和 XML 的报告. 有关更多信息,请参阅DAST 报告的 .

List of URLs scanned

当 DAST 完成扫描时,合并请求页面将说明扫描的 URL 数量. 单击查看详细信息以查看 Web 控制台输出,其中包括扫描的 URL 列表.

JSON

警告: JSON 报表工件不是 DAST 的公共 API,并且其格式预计会在将来更改.

DAST 工具始终会发出一个名为gl-dast-report.json的 JSON 报告文件,并且可以在找到示例报告.

JSON 报表中有两种数据格式可以并排使用:

  • 专有的 ZAP 格式将最终弃用.
  • 一种通用格式,将来会成为默认格式.

Other formats

还可以用 Markdown,HTML 和 XML 生成报告. 这些可以使用以下配置作为工件发布:

  1. include:
  2. template: DAST.gitlab-ci.yml
  3. dast:
  4. variables:
  5. DAST_HTML_REPORT: report.html
  6. DAST_MARKDOWN_REPORT: report.md
  7. DAST_XML_REPORT: report.xml
  8. artifacts:
  9. paths:
  10. - $DAST_HTML_REPORT
  11. - $DAST_MARKDOWN_REPORT
  12. - $DAST_XML_REPORT
  13. - gl-dast-report.json

Security Dashboard

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

ZAP 首先在alpha类中创建规则. 经过与社区的测试期后,他们被提升为beta . 默认情况下,DAST 使用beta定义. 要请求alpha定义,请使用DAST_INCLUDE_ALPHA_VULNERABILITIES环境变量,如以下配置所示:

  1. include:
  2. template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_INCLUDE_ALPHA_VULNERABILITIES: true

Interacting with the vulnerabilities

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

Vulnerabilities database update

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

Optimizing DAST

默认情况下,DAST 将下载管道中先前作业定义的所有工件. 如果您的 DAST 作业不依赖environment_url.txt来定义被测 URL 或以前的作业中创建的任何其他文件,我们建议您不要下载工件. 为了避免下载工件,请将以下内容添加到您的gitlab-ci.yml文件中:

  1. dast: dependencies: []

默认情况下,DAST 依赖的 ZAProxy 被分配的内存总计为主机上总内存的 25%. 由于它在扫描期间将大部分信息保留在内存中,因此 DAST 在扫描大型应用程序时可能会用尽内存. 这将导致以下错误:

  1. [zap.out] java.lang.OutOfMemoryError: Java heap space
  1. include:
  2. - template: DAST.gitlab-ci.yml
  3. variables:
  4. DAST_ZAP_CLI_OPTIONS: "-Xmx3072m"

在此,DAST 被分配了 3072 MB. 将-Xmx之后的数字更改为所需的存储量.