写点什么

GitLab DAST 全面指南:动态应用安全测试实战

作者:qife122
  • 2025-10-07
    福建
  • 本文字数:5453 字

    阅读完需:约 18 分钟

GitLab DAST 全面指南

现代企业完全依赖基于网络的平台进行客户互动、金融交易、数据处理和核心业务运营。随着数字化转型加速和远程或混合工作成为常态,Web 应用程序的攻击面急剧扩大,使其成为网络犯罪分子的主要目标。因此,保护 Web 应用程序变得比以往任何时候都更加关键。


虽然静态代码分析能捕获源代码中的漏洞,但它无法识别应用程序与现实环境、第三方服务和复杂用户工作流交互时出现的运行时安全问题。这正是动态应用安全测试(DAST)变得无价的地方。GitLab 的集成 DAST 解决方案为团队提供了在其 CI/CD 流水线中、按计划或按需进行自动化安全测试的能力,实现持续的安全验证而不中断开发工作流。

为什么需要 DAST?

实施 DAST 是因为它通过在实际操作环境中测试应用程序,提供了关键运行时安全验证,识别静态分析无法检测的漏洞。此外,GitLab DAST 可以无缝集成到左移安全工作中,并能增强合规性保证和风险管理。

运行时漏洞检测

DAST 擅长识别仅在应用程序运行时才显现的安全漏洞。与检查静态代码的静态分析工具不同,DAST 扫描器像外部攻击者一样与实时应用程序交互,发现以下问题:


  • 可能导致未经授权访问的身份验证和会话管理缺陷

  • 输入验证漏洞,包括 SQL 注入、跨站脚本(XSS)和命令注入

  • Web 服务器、数据库和应用程序框架中的配置弱点

  • 复杂用户交互中出现的业务逻辑缺陷

  • API 安全问题,包括不正确的身份验证、授权和数据暴露


DAST 与其他安全测试方法互补,提供全面的应用程序安全覆盖。当与静态应用安全测试(SAST)、软件组成分析(SCA)、手动渗透测试和许多其他扫描器类型结合使用时,DAST 填补了安全验证中的关键空白:


  • 模拟真实攻击场景的黑盒测试视角

  • 在实际部署配置中验证安全性的环境特定测试

  • 第三方组件测试,包括 API、库和外部服务

  • 整个应用程序堆栈的配置验证

无缝的左移安全集成

GitLab DAST 无缝集成到现有的 CI/CD 流水线中,使团队能够在开发生命周期早期识别安全问题。这种左移方法提供了几个关键好处:


  • 成本降低 — 在开发期间修复漏洞比在生产环境中解决它们要便宜得多。研究表明,生产环境中的修复成本可能高出 10 到 100 倍。

  • 更快上市时间 — 自动化安全测试消除了手动安全审查造成的瓶颈,使团队能够保持快速部署计划同时确保安全标准。

  • 开发人员赋能 — 通过提供关于安全问题的即时反馈,DAST 帮助开发人员建立安全意识并随时间改进编码实践。

合规性和风险管理

许多监管框架和行业标准要求定期对 Web 应用程序进行安全测试。DAST 帮助组织满足以下标准的合规要求:


  • 处理支付卡数据的应用程序的 PCI DSS

  • 服务组织的 SOC 2 安全控制

  • ISO 27001 信息安全管理要求


GitLab DAST 的自动化性质确保了审计师可以依赖的一致、可重复的安全测试,而详细报告提供了合规验证所需的文档。

实施 DAST

在实施 GitLab DAST 之前,请确保您的环境满足以下要求:


  • GitLab 版本和 Ultimate 订阅 — DAST 在 GitLab Ultimate 中可用,需要 GitLab 13.4 或更高版本以获得完整功能;但建议使用最新版本。

  • 应用程序可访问性 — 您的应用程序必须通过 HTTP/HTTPS 可访问,具有公开可访问的 URL 或在您的 GitLab Runner 网络内可访问。

  • 身份验证设置 — 如果您的应用程序需要身份验证,请准备测试凭据或为安全测试配置身份验证绕过机制。

基本实现

将 DAST 添加到流水线的最简单方法是在.gitlab-ci.yml 文件中包含 DAST 模板,并提供要扫描的网站:


include:  - template: DAST.gitlab-ci.yml
variables: DAST_WEBSITE: "https://your-application.example.com"
复制代码


此基本配置将:


  • 对您指定的网站运行 DAST 扫描

  • 在 GitLab 的安全仪表板中生成安全报告

  • 如果检测到高严重性漏洞,则使流水线失败

  • 将扫描结果存储为流水线工件


但是,建议为了获得 CI/CD 的全部好处,您可以首先部署应用程序,并设置 DAST 仅在应用程序部署后运行。应用程序 URL 可以动态创建,并且 DAST 作业可以使用 GitLab Job 语法完全配置。


stages:  - build  - deploy  - dast
include: - template: Security/DAST.gitlab-ci.yml
# 构建并将应用程序推送到GitLab的内置容器注册表build: stage: build variables: IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t $IMAGE . - docker push $IMAGE
# 将应用程序部署到您建议的目标,动态设置dast站点,需要构建完成deploy: stage: deploy script: - echo "DAST_WEBSITE=http://your-application.example.com" >> deploy.env - echo "Perform deployment here" environment: name: $DEPLOY_NAME url: http://your-application.example.com artifacts: reports: dotenv: deploy.env dependencies: - build
# 配置DAST在非主分支上运行主动扫描,在主分支上运行被动扫描,并要求在运行前完成部署dast: stage: dast rules: - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH variables: DAST_FULL_SCAN: "false" - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH variables: DAST_FULL_SCAN: "true" dependencies: - deploy
复制代码


您可以通过查看 Tanuki Shop 演示应用程序来学习示例,该应用程序生成以下流水线:

理解被动与主动扫描

在上面的示例中,我们为非默认分支启用了主动扫描:


- if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH  variables:    DAST_FULL_SCAN: "true"
复制代码


GitLab DAST 采用两种不同的扫描方法(被动和主动),每种方法服务于不同的安全测试需求。


被动扫描分析应用程序响应而不发送可能有害的请求。此方法:


  • 检查 HTTP 头、cookie 和响应内容中的安全错误配置

  • 识别信息泄露漏洞,如暴露的服务器版本或堆栈跟踪

  • 检测缺失的安全头(CSP、HSTS、X-Frame-options)

  • 分析 SSL/TLS 配置和证书问题


主动扫描发送精心设计的请求以触发漏洞。此方法:


  • 测试注入漏洞(SQL 注入、XSS、命令注入)

  • 尝试利用身份验证和授权缺陷

  • 验证输入清理和输出编码

  • 测试业务逻辑漏洞


注意:DAST 扫描器默认设置为被动。


DAST 有几个可以通过环境变量应用的配置选项。有关 DAST 所有可能配置选项的列表,请参阅 DAST 文档。

身份验证配置

DAST 需要在 CI/CD 作业中进行身份验证配置以实现完整的安全覆盖。身份验证使 DAST 能够模拟真实攻击并测试仅在登录后可访问的用户特定功能。DAST 作业通常通过在浏览器中提交登录表单进行身份验证,然后在继续使用保存的凭据爬取应用程序之前验证成功。失败的身份验证会停止作业。


支持的身份验证方法:


  • 单步登录表单

  • 多步登录表单

  • 对目标范围外 URL 的身份验证


以下是一个在 Tanuki Shop MR 中为单步登录表单的示例,该 MR 为非默认分支添加了管理员身份验证。


dast:  stage: dast  before_script:    - echo "DAST_TARGET_URL set to '$DAST_TARGET_URL'" # 从部署作业动态加载    - echo "DAST_AUTH_URL set to '$DAST_TARGET_URL'" # 从部署作业动态加载  rules:    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH      variables:        DAST_FULL_SCAN: "false"    - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH      variables:        DAST_FULL_SCAN: "true" # 运行被动和主动检查        DAST_AUTH_USERNAME: "admin@tanuki.local" # 在网站上身份验证的用户名        DAST_AUTH_PASSWORD: "admin123" # 在网站上身份验证的密码        DAST_AUTH_USERNAME_FIELD: "css:input[id=email]" # 描述在登录表单上用于输入用户名的元素的选择器        DAST_AUTH_PASSWORD_FIELD: "css:input[id=password]" # 描述在登录表单上用于输入密码的元素的选择器        DAST_AUTH_SUBMIT_FIELD: "css:button[id=loginButton]" # 描述在登录表单上点击提交的元素的选择器        DAST_SCOPE_EXCLUDE_ELEMENTS: "css:[id=navbarLogoutButton]" # 扫描时忽略的选择器逗号分隔列表        DAST_AUTH_REPORT: "true" # 生成详细说明身份验证过程中所采取步骤的报告        DAST_REQUEST_COOKIES: "welcomebanner_status:dismiss,cookieconsent_status:dismiss" # 添加到每个请求的cookie名称和值        DAST_CRAWL_GRAPH: "true" # 生成扫描爬取阶段访问的导航路径的SVG图  dependencies:    - deploy-kubernetes
复制代码


您可以通过查看作业日志来查看身份验证是否成功:


一旦此作业完成,它会提供一个身份验证报告,其中包括登录页面的屏幕截图:


您还可以在我们的 DAST 演示组中查看有关带身份验证的 DAST 的更多示例。要了解如何根据您的特定要求执行带身份验证的 DAST,请参阅 DAST 身份验证文档。

在 MR 中查看结果

GitLab 的 DAST 通过直接在合并请求中显示结果,将安全扫描无缝集成到您的开发工作流中:


这些结果包括 MR 中的全面漏洞数据,以帮助开发人员在代码合并前识别和解决安全问题。以下是 DAST 通常报告的内容:

漏洞详情

  • 漏洞名称和类型(例如,SQL 注入、XSS、CSRF)

  • 严重性级别(严重、高、中、低、信息)

  • 适用时的 CVSS 分数

  • 常见弱点枚举(CWE)标识符

  • 发现的置信度级别

位置信息

  • 检测到漏洞的 URL/端点

  • 使用的 HTTP 方法(GET、POST 等)

  • 显示易受攻击交互的请求/响应详情

  • 易受攻击的参数名称

  • 证明漏洞的证据

技术上下文

  • 漏洞描述和潜在影响

  • 显示如何利用漏洞的概念证明

  • 触发发现的请求/响应对

  • 扫描器详情(哪个 DAST 工具检测到它)

修复指导

  • 修复漏洞的解决方案建议

  • 安全标准参考(OWASP 等)

  • 修复步骤的文档链接

在 GitLab 漏洞报告中查看结果

对于管理默认(或生产)分支中的漏洞,GitLab 漏洞报告提供了一个集中仪表板,用于监控整个项目或组织中所有安全发现(在默认分支中)。此综合视图聚合了所有安全扫描结果,提供过滤和排序功能,以帮助安全团队优先处理修复工作。


当选择一个漏洞时,您将被带到其漏洞页面:


就像在合并请求中一样,漏洞页面提供全面的漏洞数据,如上所示。从这里,您可以通过为漏洞分配状态来进行分类:


  • 需要分类(默认)

  • 已确认

  • 已驳回(可接受风险、误报、缓解控制、测试中使用、不适用)

  • 已解决


当漏洞状态更改时,审计日志包括谁更改了它、何时更改以及更改原因的注释。此综合系统允许安全团队在其整个生命周期内有效优先处理、跟踪和管理漏洞,具有清晰的问责制和详细的风险上下文。

按需和计划性 DAST

GitLab 通过按需和计划性 DAST 扫描提供了超越标准 CI/CD 流水线集成的灵活扫描选项。按需扫描允许安全团队和开发人员在需要时手动启动 DAST 测试,而无需等待代码提交或流水线触发。此能力对于临时安全评估、事件响应场景或测试常规流水线扫描可能未覆盖的特定应用程序功能特别有价值。


按需扫描可以使用自定义参数、目标 URL 和扫描配置文件进行配置,使其成为对特定应用程序组件或新部署功能进行重点安全测试的理想选择。计划性 DAST 扫描提供自动化的、基于时间的安全测试,独立于开发工作流运行。这些扫描可以配置为每天、每周或在自定义间隔运行,确保对生产应用程序的持续安全监控。


要了解如何在项目中实施按需或计划性扫描,请参阅 DAST 按需扫描文档。

合规工作流中的 DAST

GitLab 的安全策略框架允许组织在所有项目中强制执行一致的安全标准,同时为不同的团队和环境保持灵活性。安全策略支持对 DAST 扫描要求进行集中治理,确保关键应用程序获得适当的安全测试,而无需单个项目配置。通过在组或实例级别定义安全策略,安全团队可以为特定项目类型、部署环境或风险分类强制要求 DAST 扫描。


扫描/流水线执行策略可以配置为基于特定条件自动触发 DAST 扫描,例如对受保护分支的合并请求、计划间隔或部署事件。例如,策略可能要求在生产部署前对所有应用程序进行完整的主动 DAST 扫描,同时仅允许对开发分支进行被动扫描。这些策略可以包括自动应用于所有覆盖项目的自定义变量、身份验证配置和排除规则,减少开发团队的负担并确保安全合规。


合并请求批准策略通过强制执行可能影响安全的代码更改的人工审查,提供了额外的安全治理层。这些策略可以配置为在 DAST 扫描检测到新漏洞时、当安全发现超过定义的阈值时、或当更改影响安全关键组件时要求安全团队批准。例如,当 DAST 发现包括高严重性漏洞时,策略可能自动要求指定安全工程师的批准,同时允许较低风险发现继续进行标准代码审查过程。


要了解有关 GitLab 安全策略的更多信息,请参阅策略文档。此外,为了合规性,GitLab 提供了安全清单和合规中心,这可以让您监督 DAST 是否在您的环境中运行以及在哪里需要它。


要了解有关这些功能的更多信息,请访问我们的软件合规解决方案页面。

总结

GitLab DAST 代表了一个将动态安全测试集成到现代开发工作流中的强大解决方案。通过在 CI/CD 流水线中实施 DAST,您的团队获得了自动检测运行时漏洞、维护安全标准合规性以及构建更安全应用程序的能力,而不会牺牲开发速度。


成功实施 DAST 的关键在于从基本配置开始,并随着安全成熟度的增长逐渐扩展到更复杂的扫描配置文件。从简单的网站扫描开始,然后逐步添加身份验证、自定义排除和高级报告以匹配您的特定安全要求。


请记住,当 DAST 与其他安全测试方法结合使用时最为有效。将其与静态分析、依赖项扫描和手动安全审查一起使用,以创建全面的安全测试策略。GitLab DAST 的自动化性质确保安全测试成为开发过程中一致、可重复的部分,而不是事后考虑。


要了解有关 GitLab 安全的更多信息,请查看我们的安全测试解决方案页面。要开始使用 GitLab DAST,请立即注册 GitLab Ultimate 的免费试用。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)


公众号二维码


办公AI智能小助手


公众号二维码


网络安全技术点滴分享


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
GitLab DAST 全面指南:动态应用安全测试实战_gitlab_qife122_InfoQ写作社区