动态应用程序安全测试(DAST)

如果您将 Web 应用程序部署到新环境中,您的应用程序可能会受到新类型的攻击。例如,您的应用程序服务器的错误配置或对安全控制的错误假设可能无法从源代码中看到。

动态应用程序安全测试 (DAST) 在已部署环境中检查应用程序是否存在此类漏洞。DAST 使用开源工具 OWASP Zed Attack Proxy 进行分析。

在 DAST 创建其报告后,极狐GitLab 会对其进行评估以发现源分支和目标分支之间的漏洞。合并请求中注明了相关发现。

比较逻辑仅使用为目标分支的 base 提交执行的最新流水线。在其他提交上运行流水线对合并请求没有影响。

DAST 应用分析

DAST 可以通过两种方式分析应用程序:

  • 仅被动扫描(DAST 默认)。DAST 执行 ZAP 的基线扫描并且不会主动攻击您的应用程序。
  • 被动和主动扫描。 DAST 可以配置执行主动扫描,攻击您的应用程序并生成更广泛的安全报告。当与 Review Apps 结合使用时,它会非常有用。
note一个流水线可能包含多个作业,包括 SAST 和 DAST 扫描。如果任何作业因任何原因未能完成,安全仪表盘不会显示 DAST 扫描程序输出。例如,如果 DAST 作业完成但 SAST 作业失败,则安全仪表盘不会显示 DAST 结果。失败时,分析器会输出退出码。

先决条件

  • 极狐GitLab Runner 可用,带有在 Linux/amd64 上的 docker 执行器
  • 已部署的目标应用程序。有关更多详细信息,请阅读部署选项
  • DAST 在 dast 阶段运行,必须手动将其添加到您的 .gitlab-ci.yml

部署选项

根据目标应用程序的复杂性,有一些关于如何部署和配置 DAST 模板的选项。

Review Apps

Review Apps 是部署 DAST 目标应用程序最复杂的方法。

Docker 服务

如果您的应用程序使用 Docker 容器,则您可以选择使用 DAST 进行部署和扫描。 在 Docker 构建作业完成并将镜像添加到容器镜像库后,您可以将镜像用作服务

通过使用 .gitlab-ci.yml 中的服务定义,您可以使用 DAST 分析器扫描服务。

stages:
  - build
  - dast

include:
  - template: DAST.gitlab-ci.yml

# Deploys the container to the GitLab container registry
deploy:
  services:
  - name: docker:dind
    alias: dind
  image: docker:20.10.16
  stage: build
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest

dast:
  services: # use services to link your app container to the dast job
    - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
      alias: yourapp

variables:
  DAST_FULL_SCAN_ENABLED: "true" # do a full scan
  DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler

大多数应用程序依赖于多种服务,例如数据库或缓存服务。默认情况下,服务字段中定义的服务不能相互通信。要允许服务之间的通信,请启用 FF_NETWORK_PER_BUILD 功能标志

variables:
  FF_NETWORK_PER_BUILD: "true" # enable network per build so all services can communicate on the same network

services: # use services to link the container to the dast job
  - name: mongo:latest
    alias: mongo
  - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    alias: yourapp

DAST 作业顺序

使用 DAST.gitlab-ci.yml 模板时,最后运行 dast 阶段,如下例所示。为确保 DAST 扫描最新代码,请在 dast 阶段之前的阶段部署您的应用程序。

  stages:
    - build
    - test
    - deploy
    - dast

如果您的流水线配置为在每次运行中部署到同一 Web 服务器,请注意,在另一个流水线仍在运行时运行一个流水线,可能会导致一个流水线覆盖另一个流水线的代码。在 DAST 扫描期间,应将要扫描的站点排除在更改之外。对站点的唯一更改应该来自 DAST 扫描程序。

在扫描期间从以下任何一项更改站点都可能导致结果不准确:

  • 用户
  • 计划任务
  • 数据库更改
  • 代码更改
  • 其他流水线
  • 其他扫描器

DAST 运行选项

您可以使用 DAST 来检查您的 Web 应用程序:

  • 自动,由合并请求启动。
  • 手动,按需启动。

这些运行选项之间的一些区别:

自动扫描 按需扫描
DAST 扫描由合并请求启动。 DAST 扫描是在 DevOps 生命周期之外手动启动的。
CI/CD 变量来自 .gitlab-ci.ymlUI 中提供了 CI/CD 变量。
所有 DAST CI/CD 变量 可用。 部分 DAST CI/CD 变量 可用。
DAST.gitlab-ci.yml 模板。 DAST-On-Demand-Scan.gitlab-ci.yml 模板。

启动自动 DAST 运行

要使 DAST 自动运行,请执行以下任一操作:

包含 DAST 模板

  • 此模板升级到 DAST_VERSION: 2 于 14.0 版本。
  • 此模板升级到 DAST_VERSION: 3 于 15.0 版本。

如果要手动将 DAST 添加到应用程序,则 DAST 作业在 CI/CD 模板文件中定义。极狐GitLab 的升级提供了对模板的更新,使您可以从任何改进和添加中受益。

要包含 DAST 模板:

  1. 选择您要使用的 CI/CD 模板:

    caution最新版本的模板可能包含重大更改。除非您需要仅在最新模板中提供的功能,否则请使用稳定模板。
  1. 在 CI 阶段配置中添加一个 dast 阶段:

     stages:
       - dast
    
  2. 根据您的极狐GitLab 版本将模板添加到极狐GitLab:

    • 在 11.9 及更高版本中,通过将以下内容添加到您的 .gitlab-ci.yml 文件中,包含模板:

      include:
        - template: <template_file.yml>
      
      variables:
        DAST_WEBSITE: https://example.com
      
    • 在 11.8 及更早版本中,将模板的内容添加到您的 .gitlab_ci.yml 文件中。

  3. 使用以下方法之一定义要由 DAST 扫描的 URL:

    • 设置 DAST_WEBSITE CI/CD 变量。如果设置,此值优先。

    • 在项目根目录的 environment_url.txt 文件中添加 URL,对于在动态环境中进行测试很有用。要针对在极狐GitLab CI/CD 流水线期间动态创建的应用程序运行 DAST,在 DAST 扫描之前运行的作业必须将应用程序的域保存在 environment_url.txt 文件中。DAST 会自动解析 environment_url.txt 文件来找到其扫描目标。

      例如,在 DAST 之前运行的作业中,您可以包含类似于以下内容的代码:

      script:
        - echo http://${CI_PROJECT_ID}-${CI_ENVIRONMENT_SLUG}.domain.com > environment_url.txt
      artifacts:
        paths: [environment_url.txt]
        when: always
      

      您可以在我们的 Auto DevOps CI YAML 文件中查看示例。

包含的模板在您的 CI/CD 流水线中创建一个 dast 作业,并扫描您项目正在运行的应用程序来查找可能的漏洞。

结果保存为 DAST 报告产物,您可以稍后下载和分析。由于实施限制,我们始终采用可用的最新 DAST 产物。

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

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

使用 UI 配置 DAST

您可以使用 UI 启用或配置 DAST 设置。生成的设置已格式化,因此可以方便地将它们粘贴到 .gitlab-ci.yml 文件中。

  1. 在顶部栏上,选择 菜单 > 项目 并找到您的项目。
  2. 在左侧边栏上,选择 安全与合规 > 配置
  3. 动态应用程序安全性测试(DAST) 部分中,选择 启用 DAST配置 DAST
  4. 选择所需的 扫描器配置文件,或选择 创建扫描器配置文件 并保存扫描器配置文件。有关详细信息,请参阅扫描器配置文件
  5. 选择所需的 站点配置文件,或选择 创建站点配置文件 并保存站点配置文件。有关详细信息,请参阅站点配置文件
  6. 选择 生成代码片段。将打开一个窗口,其中包含与您选择的选项相对应的 YAML 片段。
  7. 执行以下操作之一:
    1. 要将代码片段复制到剪贴板,请选择 仅复制代码
    2. 要将代码段添加到项目的 .gitlab-ci.yml 文件中,请选择 复制代码并打开 .gitlab-ci.yml 文件。流水线编辑器打开。
      1. 将代码片段粘贴到 .gitlab-ci.yml 文件中。
      2. 选择 Lint 选项卡,确认编辑的 .gitlab-ci.yml 文件有效。
      3. 选择 编辑 选项卡,然后选择 提交更改

当代码片段提交到 .gitlab-ci.yml 文件时,流水线会包含一个 DAST 作业。

爬取依赖于 JavaScript 的 Web 应用程序

有一个新的基于浏览器的爬虫,它是 DAST 的一个附加组件,它使用浏览器来爬取 Web 应用程序的内容。此爬虫替代了标准的 DAST Spider 和 Ajax Crawler,并使用与正常 DAST 扫描相同的身份验证机制。

基于浏览器的爬虫通过像用户一样浏览网页来爬取网站。这种方法适用于大量使用 JavaScript 的 Web 应用程序,例如单页应用程序。

完整扫描

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

include:
  - template: DAST.gitlab-ci.yml

variables:
  DAST_FULL_SCAN_ENABLED: "true"
  DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler

URL 扫描

  • 引入于 13.4 版本。
  • 优化于 13.11 版本。

URL 扫描允许您指定 DAST 扫描网站的哪些部分。

定义要扫描的 URL

可以通过以下任一方法指定要扫描的 URL:

  • 使用 DAST_PATHS_FILE CI/CD 变量来指定包含路径的文件的名称。
  • 使用 DAST_PATHS 变量列出路径。
使用 DAST_PATHS_FILE CI/CD 变量

引入于 13.6 版本。

要在文件中定义要扫描的 URL,请创建一个每行一个路径的纯文本文件。

page1.html
/page2.html
category/shoes/page1.html

要扫描该文件中的 URL,请将 CI/CD 变量 DAST_PATHS_FILE 设置为该文件的路径。 该文件可以通过检入项目仓库或由在 DAST 之前运行的作业作为产物生成。

默认情况下,DAST 扫描不会克隆项目仓库。通过将 GIT_STRATEGY 设置为 fetch 来指示 DAST 作业克隆项目。将相对于 CI_PROJECT_DIR 的文件路径提供给 DAST_PATHS_FILE

include:
  - template: DAST.gitlab-ci.yml

variables:
  GIT_STRATEGY: fetch
  DAST_PATHS_FILE: url_file.txt  # url_file.txt lives in the root directory of the project
  DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler
使用 DAST_PATHS CI/CD 变量

引入于 13.4 版本。

要在 CI/CD 变量中指定要扫描的路径,请将路径的逗号分隔列表添加到 DAST_PATHS 变量。请注意,您只能扫描单个主机的路径。

include:
  - template: DAST.gitlab-ci.yml

variables:
  DAST_PATHS: "/page1.html,/category1/page1.html,/page3.html"
  DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler

使用 DAST_PATHSDAST_PATHS_FILE 时,请注意以下事项:

  • 使用 DAST_PATHS_FILEDAST_PATHS 时必须定义 DAST_WEBSITE。其中列出的路径使用 DAST_WEBSITE 构建要扫描的 URL。
  • 定义 DAST_PATHSDAST_PATHS_FILE 时禁用爬虫。
  • DAST_PATHS_FILEDAST_PATHS 不能一起使用。
  • DAST_PATHS 变量的限制约为 130kb。如果您有一个更大的列表或路径,请使用 DAST_PATHS_FILE

完整扫描

要对列出的路径执行完整扫描,请使用 DAST_FULL_SCAN_ENABLED CI/CD 变量。

列出已扫描的 URL

当 DAST 完成扫描时,合并请求页面会说明扫描的 URL 数量。 选择 查看详情,查看包含扫描 URL 列表的 Web 控制台输出。

DAST Widget

查看 DAST 检测到的漏洞的详情

引入于 13.1 版本。

DAST 检测到的漏洞发生在实时 Web 应用程序中。解决这些类型的漏洞需要特定的信息,DAST 提供调查和纠正根本原因所需的信息。

要查看 DAST 检测到的漏洞的详细信息:

  1. 要查看检测到的所有漏洞,请执行以下任一操作:
    • 转到您的项目并选择 安全与合规
    • 转到合并请求并选择 安全 选项卡。
  2. 选择漏洞描述。提供以下详细信息:

    字段 描述
    Description 漏洞描述。
    Project 检测到漏洞的命名空间和项目。
    Method 用于检测漏洞的 HTTP 方法。
    URL 检测到漏洞的 URL。
    Request Headers 请求头。
    Response Status 从应用程序收到的响应状态。
    Response Headers 从应用程序收到的响应头。
    Evidence 发现的数据证据证实了该漏洞。通常是请求或响应的片段,这可用于帮助验证发现是否存在漏洞。
    Identifiers 漏洞的标识符。
    Severity 漏洞的严重性。
    Scanner Type 漏洞报告的类型。
    Links 指向检测到的漏洞的更多详细信息的链接。
    Solution 建议的漏洞解决方案的详细信息(可选)。

自定义 DAST 设置

您可以使用 CI/CD 变量和命令行选项自定义 DAST 的行为。使用 CI/CD 变量会覆盖 DAST 模板中包含的值。

使用 CI/CD 变量自定义 DAST

caution从 13.0 版本开始,不再支持使用 onlyexcept。您必须改用 rules

可以使用 .gitlab-ci.yml 中的 variables 参数通过 CI/CD 变量更改 DAST 设置。有关所有 DAST CI/CD 变量的详细信息,请阅读可用 CI/CD 变量

例如:

include:
  - template: DAST.gitlab-ci.yml

variables:
  DAST_WEBSITE: https://example.com
  DAST_SPIDER_MINS: 120
  DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler

因为模板是之前评估的流水线配置,所以最后提及的变量优先。

启用或禁用规则

DAST 用于扫描漏洞的规则的完整列表可以在 ZAP 文档中找到。

DAST_EXCLUDE_RULES 禁用具有特定 ID 的规则。

DAST_ONLY_INCLUDE_RULES 将扫描中使用的规则集限制为具有特定 ID 的规则。

DAST_EXCLUDE_RULESDAST_ONLY_INCLUDE_RULES 是互斥的,并且带有两个配置退出的 DAST 扫描出现错误。

默认情况下,一些规则被禁用,因为它们要么需要很长时间才能运行,要么经常产生误报。

DAST_EXCLUDE_RULESDAST_ONLY_INCLUDE_RULES 的列表必须用双引号 (") 括起来,否则它们将被认为是数值。

隐藏敏感信息

引入于 13.1 版本。

HTTP 请求和响应头可能包含敏感信息,包括 cookie 和授权凭据。默认情况下,以下头被隐藏:

  • Authorization
  • Proxy-Authorization
  • Set-Cookie(只有值)。
  • Cookie(只有值)。

使用 DAST_MASK_HTTP_HEADERS CI/CD 变量,您可以列出要隐藏其值的标头。

使用双向 TLS

引入于 14.8 版本。

双向 TLS 允许目标应用程序服务器验证请求是否来自已知来源。基于浏览器的扫描不支持双向 TLS。

要求

  • Base64 编码的 PKCS12 证书
  • base64 编码的 PKCS12 证书的密码

要启用双向 TLS:

  1. 如果 PKCS12 证书尚未经过 base64 编码,请将其转换为 base64 编码。出于安全原因,我们建议在本地对证书进行编码,使用网络托管的转换服务。例如,要在 macOS 或 Linux 上对证书进行编码:

    base64 <path-to-pkcs12-certificate-file>
    
  2. 创建一个名为 DAST_PKCS12_CERTIFICATE_BASE64隐藏变量,并将 base64 编码的 PKCS12 证书的值存储在该变量中。
  3. 创建一个掩码变量 DAST_PKCS12_PASSWORD 并将 PKCS12 证书的密码存储在该变量中。

可用的 CI/CD 变量

这些 CI/CD 变量特定于 DAST。它们可用于根据您的要求自定义 DAST 的行为。

caution在将这些更改合并到默认分支之前,应在合并请求中测试极狐GitLab 安全扫描工具的所有自定义设置。不这样做可能会产生意想不到的结果,包括大量误报。
CI/CD 变量 类型 描述
DAST_ADVERTISE_SCAN boolean 设置为 true,向每个发送的请求添加 Via 标头,宣传该请求是作为 DAST 扫描的一部分发送的。引入于 14.1 版本。
DAST_AGGREGATE_VULNERABILITIES boolean 漏洞聚合默认设置为 true。要禁用此功能并查看每个漏洞单独设置为 false。引入于 14.0 版本。
DAST_API_HOST_OVERRIDE 1 string 用于覆盖 API 规范文件中定义的域。仅在从 URL 导入 API 规格时支持。示例:example.com:8080
DAST_API_SPECIFICATION 1 URL or string caution 删除于 15.0 版本。替换为 DAST_API_OPENAPI。要导入的 API 规格,可以托管在 URL 上,或者存在于 /zap/wrk 目录中的文件名上。如果省略,则必须指定变量DAST_WEBSITE
DAST_AUTH_REPORT 2 boolean 与导出 gl-dast-debug-auth-report.html 产物结合使用,以帮助调试身份验证问题。
DAST_AUTH_EXCLUDE_URLS 2 URLs caution 删除于 14.0 版本。替换为 DAST_EXCLUDE_URLS。在经过身份验证的扫描期间要跳过的 URL;逗号分隔。正则表达式语法可用于匹配多个 URL。例如,.* 匹配任意字符序列。不支持 API 扫描。
DAST_AUTH_URL 1,2 URL 目标网站上包含登录 HTML 表单的页面的 URL。DAST_USERNAMEDAST_PASSWORD 与登录表单一起提交以创建经过身份验证的扫描。不支持 API 扫描。示例:https://login.example.com
DAST_AUTH_VERIFICATION_LOGIN_FORM 2 boolean 提交登录表单后,通过检查是否缺少登录表单来验证身份验证是否成功。
DAST_AUTH_VERIFICATION_SELECTOR 2 selector 提交登录表单后,通过检查选择器的存在来验证身份验证是否成功。示例:css:.user-photo
DAST_AUTH_VERIFICATION_URL 1,2 URL 一个只有登录用户才能访问的 URL,DAST 可以使用它来确认成功的身份验证。如果提供,则 DAST 在无法访问 URL 时退出。 示例:"http://example.com/loggedin_page"。引入于 13.8 版本。
DAST_AUTO_UPDATE_ADDONS boolean ZAP add-ons 固定到 DAST Docker 镜像中的特定版本。设置为 true,在扫描开始时下载最新版本。默认值:false
DAST_BROWSER_PATH_TO_LOGIN_FORM 1,2 selector 在尝试将 DAST_USERNAMEDAST_PASSWORD 输入登录表单之前单击的选择器的逗号分隔列表。示例:"css:.navigation-menu,css:.login-menu-item"。引入于 14.1 版本。
DAST_DEBUG 1 boolean 启用调试消息输出。默认值:false。引入于 13.1 版本。
DAST_EXCLUDE_RULES string 设置为以逗号分隔的漏洞规则 ID 列表,在扫描期间将其排除在运行之外。规则 ID 是数字,可以从 DAST 日志或 ZAP 项目中找到。例如,HTTP Parameter Override 的规则 ID 为 10026。设置了 DAST_ONLY_INCLUDE_RULES 时不能使用。注意: 在早期版本中,排除的规则被执行,但它们产生的漏洞被抑制。引入于 12.10 版本。
DAST_EXCLUDE_URLS 1,2 URLs 在经过身份验证的扫描期间要跳过的 URL;逗号分隔。正则表达式语法可用于匹配多个 URL。例如,.* 匹配任意字符序列。不支持 API 扫描。例如,http://example.com/sign-out
DAST_FIRST_SUBMIT_FIELD 2 string 单击时提交多页登录过程的用户名表单的元素的 idname。例如,css:button[type='user-submit']
DAST_FULL_SCAN_DOMAIN_VALIDATION_REQUIRED boolean caution 删除于 14.0 版本。设置为 true,在运行 DAST 完整扫描时要求进行域验证。不支持 API 扫描。默认值:false
DAST_FULL_SCAN_ENABLED 1 boolean 设置为 true 来运行 ZAP 完整扫描,而不是 ZAP 基线扫描。默认值:false
DAST_HTML_REPORT string 扫描结束时写入的 HTML 报告的文件名。引入于 13.1 版本。
DAST_INCLUDE_ALPHA_VULNERABILITIES boolean 设置为 true,包括 alpha 被动和主动扫描规则。默认值:false。引入于 13.1 版本。
DAST_MARKDOWN_REPORT string 扫描结束时写入的 Markdown 报告的文件名。引入于 13.1 版本。
DAST_MASK_HTTP_HEADERS string 要隐藏的请求和响应头的逗号分隔列表(13.1 版本)。必须包含要隐藏的所有头。请参阅默认隐藏的头列表
DAST_MAX_URLS_PER_VULNERABILITY number 针对单个漏洞报告的最大 URL 数。DAST_MAX_URLS_PER_VULNERABILITY 默认设置为 50。列出所有设置为 0 的 URL。引入于 13.12 版本。
DAST_ONLY_INCLUDE_RULES string 设置为以逗号分隔的漏洞规则 ID 列表,将扫描配置为仅运行它们。规则 ID 是数字,可以从 DAST 日志或 ZAP 项目中找到。设置了 DAST_EXCLUDE_RULES 时不能使用。引入于 13.12 版本。
DAST_PASSWORD 1,2 string 在网站中进行身份验证的密码。示例:P@55w0rd!
DAST_PASSWORD_FIELD 1,2 string 登录 HTML 表单中密码字段的选择器。示例:id:password
DAST_PATHS string 设置为 DAST 扫描的以逗号分隔的 URL 列表。例如,/page1.html,/category1/page3.html,/page2.html。引入于 13.4 版本。
DAST_PATHS_FILE string 包含要扫描的 DAST_WEBSITE 中的路径的文件路径。该文件必须是纯文本,每行一个路径。引入于 13.6 版本。
DAST_PKCS12_CERTIFICATE_BASE64 string 用于需要双向 TLS 的站点的 PKCS12 证书。必须编码为 base64 文本。
DAST_PKCS12_PASSWORD string DAST_PKCS12_CERTIFICATE_BASE64 中使用的证书密码。
DAST_REQUEST_HEADERS 1 string 设置为请求头名称和值的逗号分隔列表。Headers 会添加到 DAST 发出的每个请求中。例如,Cache-control: no-cache,User-Agent: DAST/1.0
DAST_SKIP_TARGET_CHECK boolean 设置为 true,防止 DAST 在扫描前检查目标是否可用。默认值:false。引入于 13.8 版本。
DAST_SPIDER_MINS 1 number 蜘蛛扫描的最大持续时间(以分钟为单位)。设置为 0 表示无限制。默认值:一分钟,或在扫描为完整扫描时不受限制。引入于 13.1 版本。
DAST_SPIDER_START_AT_HOST boolean 设置为 false,防止 DAST 在扫描之前将目标重置为其主机。当为 true 时,非主机目标 http://test.site/some_path 在扫描前被重置为 http://test.site。默认值:true。引入于 13.6 版本。
DAST_SUBMIT_FIELD 2 string 单击时提交登录表单或多页登录过程的密码表单的元素的idname。例如,css:button[type='submit']
DAST_TARGET_AVAILABILITY_TIMEOUT 1 number 等待目标可用性的时间限制(以秒为单位)。
DAST_USE_AJAX_SPIDER 1 boolean 设置为 true 以在传统 spider 的基础上使用 AJAX spider,这对于爬取需要 JavaScript 的站点很有用。默认值:false。引入于 13.1 版本。
DAST_USERNAME 1,2 string 在网站中进行身份验证的用户名。示例:admin
DAST_USERNAME_FIELD 1,2 string 登录 HTML 表单中用户名字段的选择器。示例:name:username
DAST_XML_REPORT string 扫描结束时写入的 XML 报告的文件名。引入于 13.1 版本。
DAST_WEBSITE 1 URL 要扫描的网站的 URL。如果省略,则必须指定变量 DAST_API_SPECIFICATION
DAST_ZAP_CLI_OPTIONS string ZAP 服务器命令行选项。例如,-Xmx3072m 将设置 Java 最大内存分配池大小。引入于 13.1 版本。
DAST_ZAP_LOG_CONFIGURATION string 设置为 ZAP 服务器的附加 log4j 属性的分号分隔列表。示例:logger.httpsender.name=org.parosproxy.paros.network.HttpSender;logger.httpsender.level=debug;logger.sitemap.name=org.parosproxy.paros.model.SiteMap;logger.sitemap.level=debug ;
SECURE_ANALYZERS_PREFIX URL 设置下载分析器的 Docker 仓库 base 地址。
  1. 可用于按需 DAST 扫描。
  2. 用于身份验证。

使用命令行选项自定义 DAST

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

include:
  template: DAST.gitlab-ci.yml

dast:
  script:
    - /analyze --help

然后,您必须覆盖 script 命令以传入适当的参数。例如,alpha 中的漏洞定义可以包含在 -a 中。以下配置包括这些定义:

include:
  template: DAST.gitlab-ci.yml

dast:
  script:
    - export DAST_WEBSITE=${DAST_WEBSITE:-$(cat environment_url.txt)}
    - /analyze -a -t $DAST_WEBSITE

自定义 ZAProxy 配置

ZAProxy 服务器包含许多有用的可配置值。 -config 的许多键/值仍未记录,但有一个未经测试的可能的键列表。 请注意,这些选项不受 DAST 支持,使用时可能会中断 DAST 扫描。以下是如何使用 TOKEN 重写 Authorization 头值的示例:

include:
  template: DAST.gitlab-ci.yml

variables:
  DAST_ZAP_CLI_OPTIONS: "-config replacer.full_list(0).description=auth -config replacer.full_list(0).enabled=true -config replacer.full_list(0).matchtype=REQ_HEADER -config replacer.full_list(0).matchstr=Authorization -config replacer.full_list(0).regex=false -config replacer.full_list(0).replacement=TOKEN"

认证

note我们强烈建议您将扫描器配置为对应用程序进行身份验证。如果您不这样做,它就无法检查大多数应用程序的安全风险,因为您的大多数应用程序可能在没有身份验证的情况下无法访问。我们还建议您定期确认扫描器的身份验证是否仍在工作,因为应用程序的身份验证更改会随着时间的推移而中断。

创建隐藏的 CI/CD 变量,传递 DAST 使用的凭据。 要为用户名和密码创建隐藏变量,请参阅在 UI 中创建自定义变量。 用户名变量的键必须是 DAST_USERNAME,密码变量的键必须是 DAST_PASSWORD

在 DAST 通过应用程序进行身份验证后,将从 Web 浏览器收集所有 cookie。 对于每个 cookie,都会创建一个匹配的会话令牌以供 ZAP 使用,可确保 ZAP 被应用程序识别为经过正确身份验证。

身份验证支持单表单登录、多步骤登录表单,以及对配置的目标 URL 之外的 URL 进行身份验证。

caution从不对生产服务器运行经过身份验证的扫描。运行经过身份验证的扫描时,它可以执行经过身份验证的用户可以执行的任何功能,包括修改和删除数据、提交表单和关注链接等操作。仅对测试服务器运行经过身份验证的扫描。

使用登录表单的自动检测登录

通过提供 DAST_USERNAMEDAST_PASSWORDDAST_AUTH_URL,DAST 会尝试通过确定登录表单是否包含用户名或密码字段,来对目标应用程序进行身份验证。

自动检测“尽力而为”,根据被扫描的应用程序,可能会提供弹性登录体验或无法验证用户身份的体验。

登录流程:

  1. DAST_AUTH_URL 被加载到浏览器中,并定位页面上的任何表单。
    1. 如果表单包含用户名和密码字段,则在相应字段中输入 DAST_USERNAMEDAST_PASSWORD,单击表单提交按钮并登录用户。
    2. 如果表单仅包含用户名字段,则假定登录表单是多步的。
      1. DAST_USERNAME 输入到用户名字段并单击表单提交按钮。
      2. 后续页面加载预期存在表单并包含密码字段的位置。如果找到,则输入 DAST_PASSWORD,单击表单提交按钮并登录用户。

使用登录表单的显式选择登录

通过提供 DAST_USERNAME_FIELDDAST_PASSWORD_FIELDDAST_SUBMIT_FIELD 以及自动登录所需的字段,DAST 会尝试通过根据提供的选择器定位登录表单来对目标应用程序进行身份验证。 大多数应用程序都受益于这种身份验证方法。

登录流程:

  1. DAST_AUTH_URL 被加载到浏览器中,并定位页面上的任何表单。
    1. 如果没有定义 DAST_FIRST_SUBMIT_FIELD,则在 DAST_USERNAME_FIELD 中输入 DAST_USERNAME,在 DAST_PASSWORD_FIELD 中输入 DAST_PASSWORD,点击 DAST_SUBMIT_FIELD,用户登录。
    2. 如果定义了DAST_FIRST_SUBMIT_FIELD,则假设登录表单是多步的。
      1. DAST_USERNAME 输入到 DAST_USERNAME_FIELD 字段并单击 DAST_FIRST_SUBMIT_FIELD
      2. 随后的页面加载,其中 DAST_PASSWORD 被输入到 DAST_PASSWORD_FIELD 字段,DAST_SUBMIT_FIELD 被点击并且用户登录。

验证登录成功

提交登录表单后,DAST 将确定登录是否成功。身份验证尝试失败会导致扫描停止。

提交登录表单后,在以下情况下确定身份验证不成功:

  • 返回一个 400500 系列 HTTP 响应状态码。
  • 尚未设置确定为足够随机的新 cookie/浏览器存储值。

除了这些检查之外,用户还可以配置自己的验证检查。 以下每一项检查都可以相互结合使用,如果默认情况下没有配置,则检查登录表单的存在。

根据 URL 进行验证

配置 DAST_AUTH_VERIFICATION_URL 时,浏览器选项卡后登录表单提交中显示的 URL 直接与 CI/CD 变量中的 URL 进行比较。 如果这些不完全相同,则认为身份验证不成功。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler
    ...
    DAST_AUTH_VERIFICATION_URL: "https://example.com/user/welcome"

根据元素的存在进行验证

当配置了 DAST_AUTH_VERIFICATION_SELECTOR 时,会在浏览器选项卡显示的页面中,搜索 CI/CD 变量中选择器描述的元素。 如果没有找到元素,则认为身份验证不成功。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler
    ...
    DAST_AUTH_VERIFICATION_SELECTOR: "css:.welcome-user"

根据登录表单的存在进行验证

当配置了 DAST_AUTH_VERIFICATION_LOGIN_FORM 时,会在浏览器选项卡显示的页面中,搜索被检测为登录表单的表单。 如果发现任何此类表格,则认为身份验证不成功。

例如:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler
    ...
    DAST_AUTH_VERIFICATION_LOGIN_FORM: "true"

查看登录表单

许多 Web 应用程序在弹出窗口中向用户显示登录表单。 对于这些应用程序,导航到表单需要:

  • 起始 URL。
  • 要选择以显示模式窗口的元素列表。

当存在 DAST_BROWSER_PATH_TO_LOGIN_FORM 时,如本例所示:

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_WEBSITE: "https://my.site.com"
    DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler
    ...
    DAST_AUTH_URL: "https://my.site.com/admin"
    DAST_BROWSER_PATH_TO_LOGIN_FORM: "css:.navigation-menu,css:.login-menu-item"

DAST 执行以下操作:

  1. 加载 DAST_AUTH_URL 页面,例如 https://my.site.com/admin
  2. 页面加载后,DAST 选择由 DAST_BROWSER_PATH_TO_LOGIN_FORM 中描述的选择器找到的元素。此示例打开导航菜单并选择登录菜单,以显示登录窗口。
  3. 为了继续验证过程,DAST 在登录表单上填写用户名和密码。

配置认证调试输出

在 CI/CD 流水线中运行 DAST 时,通常很难理解身份验证失败的原因。 为了帮助用户调试身份验证问题,可以生成调试报告并将其保存为作业产物。 此 HTML 报告包含登录过程中的所有步骤,以及 HTTP 请求和响应、文档对象模型 (DOM) 和屏幕截图。

dast-auth-report

导出身份验证调试报告的示例配置可能如下所示:

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler
    ...
    DAST_AUTH_REPORT: "true"
  artifacts:
    paths: [gl-dast-debug-auth-report.html]
    when: always

选择器

CI/CD 变量使用选择器来指定显示在浏览器页面上的元素的位置。选择器的格式为 type:search string。爬虫使用基于类型的搜索字符串搜索选择器。

选择器类型 示例 描述
css css:.password-field 搜索具有提供的 CSS 选择器的 HTML 元素。出于性能原因,选择器应尽可能具体。
id id:element 使用提供的元素 ID 搜索 HTML 元素。
name name:element 使用提供的元素名称搜索 HTML 元素。
xpath xpath://input[@id="my-button"]/a 使用提供的 XPath 搜索 HTML 元素。请注意,XPath 搜索的性能预计会低于其他搜索。
None provided a.click-me 默认使用 CSS 选择器进行搜索。

使用 Google Chrome 查找选择器

Chrome DevTools 元素选择器工具是查找选择器的有效方法。

  1. 打开 Chrome 并导航到您要查找选择器的页面,例如您网站的登录页面。
  2. 在 macOS 中使用键盘快捷键 Command + Shift + c 或在 Windows 中使用 Ctrl + Shift + c,在 Chrome DevTools 中打开 Elements 选项卡。
  3. 选择 Select an element in the page to select it 工具。 search-elements
  4. 选择页面上您想知道选择器的字段。
  5. 工具激活后,突出显示您希望查看详细信息的字段。 highlight
  6. 突出显示后,您可以看到元素的详细信息,包括适合选择器的属性。

在此示例中,id="user_login" 似乎是一个不错的候选对象。您可以通过设置 DAST_USERNAME_FIELD: "id:user_login" 将其用作 DAST 用户名字段的选择器。

选择正确的选择器

选择器的明智选择会导致对应用程序的更改具有弹性的扫描。

按照优先顺序,建议选择作为选择器:

  • id 字段。通常在页面上是唯一的,并且很少更改。
  • name 字段。通常在页面上是唯一的,并且很少更改。
  • 特定于字段的 class 值,例如用户名字段上的 username 类的选择器 "css:.username"
  • data-username 字段在用户名字段上有任何值时,存在字段特定的数据属性,例如选择器,"css:[data-username]"
  • 多个 class 层次结构值,例如选择器 "css:.login-form .username",当有多个具有类 username 的元素但只有一个嵌套在具有类 login-form 的元素中时。

使用选择器定位特定字段时,我们建议您避免搜索:

  • 任何动态生成的 idnameattributeclassvalue
  • 通用类名,例如 column-10dark-grey
  • XPath 搜索,因为它们的性能不如其他选择器搜索。
  • 无范围搜索,例如以 css:*xpath://* 开头的搜索。

前沿漏洞定义

ZAP 首先在 alpha 类中创建规则。在社区测试一段时间后,他们被提升为 beta。DAST 默认使用 beta 定义。要请求 alpha 定义,请使用 DAST_INCLUDE_ALPHA_VULNERABILITIES CI/CD 变量,如以下配置所示:

include:
  template: DAST.gitlab-ci.yml

variables:
  DAST_INCLUDE_ALPHA_VULNERABILITIES: "true"

克隆项目的仓库

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

按需扫描

  • 引入于 13.2 版本。
  • 优化于 13.3 版本。
  • 保存的扫描功能引入于 13.9 版本。
  • 选择分支选项引入于 13.10 版本。
  • DAST 分支选择功能标志删除于 13.11 版本。
  • DAST 配置文件管理的审计引入于 14.1 版本。

按需 DAST 扫描在 DevOps 生命周期之外运行。仓库中的更改不会触发扫描。您必须手动启动它,或者安排它运行。

按需 DAST 扫描:

按需扫描模式

按需扫描可以在主动或被动模式下运行:

  • 被动模式是默认模式,运行 ZAP 基线扫描。
  • 主动模式运行 ZAP 全面扫描,这可能对正在扫描的站点有害。为了最大限度地降低意外损坏的风险,运行主动扫描需要已验证的站点配置文件

查看按需 DAST 扫描

要查看项目正在运行的已完成和计划的按需 DAST 扫描,请转到左侧栏中的 安全与合规 > 按需扫描

  • 要查看正在运行和已完成的扫描,请选择 所有
  • 要仅查看正在运行的扫描,请选择 运行中
  • 要查看完成的扫描,请选择 已完成。已完成的扫描是成功、失败或被取消的扫描。
  • 要查看计划扫描,请选择 已计划。显示已设置计划的按需扫描,不包含在 所有 选项卡中。
  • 要查看保存的按需扫描配置文件,请选择 扫描库。 这些不包含在 所有 选项卡中。

取消按需扫描

要取消挂起或正在运行的按需扫描,请在按需扫描列表中选择 取消 ()。

重试按需扫描

要重试失败或成功但出现警告的扫描,请在按需扫描列表中选择 重试 ()。

查看按需扫描的结果

要查看完成的扫描结果,请在按需扫描列表中选择 查看结果

编辑按需扫描

要编辑按需扫描的设置,请在 已计划 选项卡中选择 编辑 ()。

设置按需 DAST 扫描

先决条件:

您可以立即运行按需扫描,在预定的日期和时间或以指定的频率运行一次:

  • 每天
  • 每周
  • 每个月
  • 每 3 个月
  • 每 6 个月
  • 每年

要立即运行按需扫描,请执行以下任一操作:

要在计划的日期或频率运行按需扫描,请阅读计划按需扫描

立即创建并运行按需扫描

  1. 在您的项目主页中,转到左侧边栏中的 安全与合规 > 按需扫描
  2. 选择 新建扫描
  3. 填写 扫描名称描述 字段。
  4. 在 13.10 及更高版本中,从分支下拉列表中选择所需的分支。
  5. 扫描器配置文件 中,从下拉列表中选择一个扫描器配置文件。
  6. 站点配置文件 中,从下拉列表中选择站点配置文件。
  7. 要立即运行按需扫描,请选择 保存并运行扫描。否则,请稍后选择 保存扫描,然后运行

按需 DAST 扫描运行,项目的仪表盘显示结果。

运行保存的按需扫描

要运行保存的按需扫描:

  1. 在顶部栏上,选择 菜单 > 项目 并找到您的项目。
  2. 在左侧边栏上,选择 安全与合规 > 按需扫描
  3. 选择 扫描库 选项卡。
  4. 在扫描行中,选择 运行扫描

    如果扫描中保存的分支不再存在,则必须先编辑扫描,选择新的分支,保存编辑后的扫描。

按需 DAST 扫描运行,项目的仪表盘显示结果。

计划按需扫描

  • 引入于 14.3 版本。功能标志为 dast_on_demand_scans_scheduler,默认禁用。
  • 在 SaaS 上启用于 14.4 版本。
  • 在私有化部署版上启用于 14.4 版本。
  • 功能标志 dast_on_demand_scans_scheduler 删除于 14.5 版本。

要计划扫描:

  1. 在顶部栏上,选择 菜单 > 项目 并找到您的项目。
  2. 在左侧边栏上,选择 安全与合规 > 按需扫描
  3. 选择 新建扫描
  4. 填写 扫描名称描述 文本框。
  5. 在 13.10 及更高版本中,从分支下拉列表中,选择所需的分支。
  6. 扫描器配置文件 部分,从下拉列表中选择一个扫描器配置文件。
  7. 站点配置文件 部分,从下拉列表中选择站点配置文件。
  8. 选择 计划扫描
  9. 开始时间 部分,选择时区、日期和时间。
  10. 重复 下拉列表中,选择您想要的频率:
    • 要运行一次扫描,请选择 从不
    • 对于重复扫描,请选择任何其他选项。
  11. 要立即运行按需扫描,请选择 保存并运行扫描。要根据您设置的计划运行它,请选择 保存扫描

列出保存的按需扫描

列出已保存的按需扫描:

  1. 从您的项目主页,转到 安全与合规 > 按需扫描
  2. 选择 扫描库 选项卡。

查看按需扫描的详细信息

要查看按需扫描的详细信息:

  1. 从您的项目主页,转到 安全与合规 > 按需扫描
  2. 选择 扫描库 选项卡。
  3. 在已保存扫描的行中选择 更多操作 (),然后选择 编辑

编辑按需扫描

要编辑按需扫描:

  1. 从您的项目主页,转到 安全与合规 > 按需扫描
  2. 选择 扫描库 选项卡。
  3. 在已保存扫描的行中选择 更多操作 (),然后选择 编辑
  4. 编辑表格。
  5. 选择 保存扫描

删除按需扫描

要删除按需扫描:

  1. 从您的项目主页,转到 安全与合规 > 按需扫描
  2. 选择 扫描库 选项卡。
  3. 在已保存扫描的行中选择 更多操作 (),然后选择 删除
  4. 选择 删除 确认删除。

站点配置文件

站点配置文件定义了要由 DAST 扫描的已部署应用程序、网站或 API 的属性和配置详细信息。可以在 .gitlab-ci.yml 和按需扫描中引用站点配置文件。

站点配置文件包含:

  • 配置文件名称:您分配给要扫描的站点的名称。虽然在 .gitlab-ci.yml 或按需扫描中引用了站点配置文件,但它不能被重命名。
  • 站点类型:要扫描的目标类型,网站或 API 扫描。
  • 目标 URL:运行 DAST 的 URL。
  • 排除的 URLs:要从扫描中排除的 URL 的逗号分隔列表。
  • 请求头:以逗号分隔的 HTTP 请求头列表,包括名称和值。这些头会添加到 DAST 发出的每个请求中。
  • 验证(用于网站)
    • 验证 URL:目标网站上包含登录 HTML 表单的页面的 URL。用户名和密码与登录表单一起提交以创建经过身份验证的扫描。
    • 用户名:用于对网站进行身份验证的用户名。
    • 密码:用于对网站进行身份验证的密码。
    • 用户名表单字段:登录 HTML 表单中的用户名字段的名称。
    • 密码表单字段:登录 HTML 表单中的密码字段名称。
    • 提交表单字段:单击时提交登录 HTML 表单的元素的 idname
  • 验证(用于 API 扫描)
    • 用户名:用于对 API 进行身份验证的用户名。
    • 密码:用于对 API 进行身份验证的密码。

选择 API 站点类型时,将使用主机覆盖,来确保被扫描的 API 与目标位于同一主机上。这样做是为了降低针对错误 API 运行主动扫描的风险。

配置后,请求头和密码字段在存储到数据库之前使用 aes-256-gcm 加密。 只能使用有效的机密文件读取和解密此数据。

站点配置文件验证

  • 站点配置文件验证引入于 13.8 版本。
  • Meta tag 验证引入于 14.2 版本。

站点配置文件验证降低了针对错误网站运行主动扫描的风险。必须先验证站点,然后才能对其运行主动扫描。现场验证方法如下:

  • 文本文件验证需要将文本文件上传到目标站点。文本文件被分配了一个项目唯一的名称和内容。验证过程检查文件的内容。
  • Header 验证需要将头 Gitlab-On-Demand-DAST 添加到目标站点,并具有项目独有的值。验证过程检查头是否存在,并检查其值。
  • Meta tag 验证需要将名为 gitlab-dast-validation 的 Meta tag 添加到目标站点,并具有项目独有的值。确保将其添加到页面的 <head> 部分。验证过程检查元标记是否存在,并检查其值。

所有这些方法在功能上都是等效的。使用任何可行的方法。

在 14.2 及更高版本,站点配置文件验证发生在使用极狐GitLab Runner 的 CI 作业中。

创建站点配置文件

要创建站点配置文件:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中选择 管理
  3. 选择 新建 > 站点配置文件
  4. 填写字段,然后选择 保存配置文件

站点配置文件已创建。

编辑站点配置文件

如果站点配置文件链接到安全策略,则用户无法从此页面编辑配置文件。有关详细信息,请参阅扫描执行策略

编辑经过验证的站点配置文件的文件、标题或 Meta tag 时,该站点的验证状态将被撤销。

要编辑站点配置文件:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中选择 管理
  3. 选择 站点配置文件 选项卡。
  4. 在配置文件行中选择 更多操作 () 菜单,然后选择 编辑
  5. 编辑字段,然后选择 保存配置文件

删除站点配置文件

如果站点配置文件链接到安全策略,则用户无法从此页面删除配置文件。 有关详细信息,请参阅扫描执行策略

要删除站点配置文件:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中选择 管理
  3. 选择 站点配置文件 选项卡。
  4. 在配置文件行中,选择 更多操作 () 菜单,然后选择 删除
  5. 选择 删除 确认删除。

验证站点配置文件

需要验证站点才能运行主动扫描。

要验证站点配置文件:

  1. 在顶部栏上,选择 菜单 > 项目 并找到您的项目。
  2. 在左侧边栏上,选择 安全与合规 > 配置
  3. 动态应用程序安全测试 (DAST) 部分中,选择 管理配置文件
  4. 选择 站点配置文件 选项卡。
  5. 在配置文件行中,选择 验证
  6. 选择验证方法。
    1. 对于 文本文件验证
      1. 下载步骤 2 中列出的验证文件。
      2. 将验证文件上传到主机、步骤 3 中的位置或您喜欢的任何位置。
      3. 如果需要,请在步骤 3 中编辑文件位置。
      4. 选择 验证
    2. 对于 Header 验证
      1. 步骤 2 中选择剪贴板图标。
      2. 编辑要验证的站点 header,并粘贴剪贴板内容。
      3. 选择 步骤 3 中的输入框,输入 header 的位置。
      4. 选择 验证
    3. 对于 Meta tag 验证
      1. 步骤 2 中选择剪贴板图标。
      2. 编辑要验证的站点内容,并粘贴剪贴板内容。
      3. 选择 步骤 3 中的输入框,输入元标记的位置。
      4. 选择 验证

该站点已经过验证,并且可以对其运行主动扫描。站点配置文件的验证状态仅在手动撤销或编辑其文件、标题或元标记时才被撤销。

重试失败的验证

管理配置文件页面的站点配置文件选项卡上列出了失败的站点验证尝试。

要重试站点配置文件的失败验证:

  1. 在顶部栏上,选择 菜单 > 项目 并找到您的项目。
  2. 在左侧边栏上,选择 安全与合规 > 配置
  3. 动态应用程序安全测试 (DAST) 部分中,选择 管理配置文件
  4. 选择 站点配置文件 选项卡。
  5. 在配置文件行中,选择 重试验证

撤销站点配置文件的验证状态

caution当站点配置文件的验证状态被撤销时,共享相同 URL 的所有站点配置文件的验证状态也会被撤销。

要撤销站点配置文件的验证状态:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中选择 管理
  3. 在经过验证的配置文件旁边,选择 撤销验证

站点配置文件的验证状态已撤销。

已验证的站点配置文件 header

以下是有关如何在应用程序中提供所需站点配置文件 header 的代码示例。

用于按需扫描的 Ruby on Rails 示例

以下是在 Ruby on Rails 应用程序中添加自定义 header 的方法:

class DastWebsiteTargetController < ActionController::Base
  def dast_website_target
    response.headers['Gitlab-On-Demand-DAST'] = '0dd79c9a-7b29-4e26-a815-eaaf53fcab1c'
    head :ok
  end
end

用于按需扫描的 Django 示例

以下是如何在 Django 中添加自定义 header

class DastWebsiteTargetView(View):
    def head(self, *args, **kwargs):
      response = HttpResponse()
      response['Gitlab-On-Demand-DAST'] = '0dd79c9a-7b29-4e26-a815-eaaf53fcab1c'

      return response

用于按需扫描的 Node(使用 Express)示例

以下是如何在 Node 中添加自定义 header(使用 Express)

app.get('/dast-website-target', function(req, res) {
  res.append('Gitlab-On-Demand-DAST', '0dd79c9a-7b29-4e26-a815-eaaf53fcab1c')
  res.send('Respond to DAST ping')
})

扫描器配置文件

  • 引入于 13.4 版本。
  • 添加于 13.5 版本:扫描模式、AJAX spider、debug 消息。

扫描器配置文件定义了安全扫描器的配置细节。可以在 .gitlab-ci.yml 和按需扫描中引用扫描器配置文件。

扫描器配置文件包含:

  • 配置文件名称: 您为扫描仪配置文件指定的名称。例如,“Spider_15”。虽然在 .gitlab-ci.yml 或按需扫描中引用了扫描器配置文件,但它不能被重命名。
  • 扫描模式:被动扫描监视发送到目标的所有 HTTP 消息(请求和响应)。主动扫描攻击目标以发现潜在漏洞。
  • Spider 超时:允许 Spider 遍历站点的最大分钟数。
  • 目标超时:DAST 在开始扫描之前等待站点可用的最大秒数。
  • AJAX Spider:除了传统的 Spider 之外,还运行 AJAX Spider 来抓取目标站点。
  • 调试消息:在 DAST 控制台输出中包含调试消息。

创建扫描器配置文件

要创建扫描仪配置文件:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中,选择 管理
  3. 选择 新建 > 扫描器配置文件
  4. 填写表格。有关每个字段的详细信息,请参阅扫描器配置文件
  5. 选择 保存配置文件

编辑扫描器配置文件

如果扫描器配置文件链接到安全策略,则用户无法从此页面编辑配置文件。 有关详细信息,请参阅扫描执行策略

要编辑扫描器配置文件:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中,选择 管理
  3. 选择 扫描器配置文件 选项卡。
  4. 在扫描器行中,选择 更多操作 () 菜单,然后选择 编辑
  5. 编辑表格。
  6. 选择 保存配置文件

删除扫描器配置文件

如果扫描器配置文件链接到安全策略,则用户无法从此页面删除配置文件。有关详细信息,请参阅扫描执行策略

要删除扫描器配置文件:

  1. 从您项目的主页,转到 安全与合规 > 配置
  2. DAST 配置文件 行中,选择 管理
  3. 选择 扫描器配置文件 选项卡。
  4. 在扫描器行中,选择 更多操作 () 菜单,然后选择 删除
  5. 选择 删除

审计

引入于 14.1 版本。

DAST 配置文件、DAST 扫描程序配置文件和 DAST 站点配置文件的创建、更新和删除包含在审计日志中。

报告

DAST 工具会输出一个 gl-dast-report.json 报告文件,其中包含扫描及其结果的详细信息。 该文件包含在作业的产物中。JSON 是默认格式,但您可以以 Markdown、HTML 和 XML 格式输出报告。要指定替代格式,请使用 CI/CD 变量。您还可以使用 CI/CD 变量来配置作业,输出 gl-dast-debug-auth-report.html 文件,有助于调试身份验证问题。

cautionJSON 报告产物不是 DAST 的公共 API,其格式预计会在未来发生变化。

优化 DAST

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

dast:
   dependencies: []