SuperAPI AI 工具集

integrating-dast-with-owasp-zap-in-pipeline

安全与审计

查看项目

更新于 10-15 14:00

技能介绍

用途

本技能用于将 OWASP ZAP(Zed Attack Proxy)集成到 CI/CD 流水线(GitHub Actions、GitLab CI)中,对运行中的 Web 应用执行动态应用安全测试(DAST)。适用场景包括:测试运行中的 Web 应用是否存在 XSS、SQLi、CSRF 和错误配置等漏洞;当仅靠 SAST 不足、需要运行时行为测试时;合规要求在生产前对 Web 应用进行动态安全测试时;测试 API(REST/GraphQL)的认证、授权和注入缺陷时;在预发布环境建立持续 DAST 扫描时。不适用于扫描源代码(应使用 SAST)、扫描依赖(应使用 SCA)或扫描基础设施配置(应使用 IaC 扫描工具)。

主要能力

  • 基线扫描(Baseline Scan):快速被动扫描,爬取应用但不发起主动攻击,适合 CI/CD。
  • 全量扫描(Full Scan):包含针对 XSS、SQLi 等注入漏洞的攻击载荷的主动扫描。
  • API 扫描(API Scan):使用 OpenAPI/Swagger 规范对已记录的 API 端点进行针对性扫描。
  • 扫描规则配置:通过 rules.tsv 文件按规则 ID 设置 IGNORE/WARN/FAIL 动作。
  • 报告输出:生成 HTML 与 JSON 报告,并作为流水线产物上传。
  • 质量门禁:根据 FAIL 级别发现阻止生产部署。

使用方式

前置条件:OWASP ZAP Docker 镜像或本地安装(zaproxy/zap-stable 或 zaproxy/action-*);CI/CD runner 可访问的运行中目标应用(预发布 URL 或 Docker 服务);可选的 ZAP 扫描规则配置;可选的用于 API 扫描的 OpenAPI/Swagger 规范。

步骤 1:在 GitHub Actions 中配置 ZAP 基线扫描。示例工作流文件 .github/workflows/dast-scan.yml 定义 deployment_status 与 workflow_dispatch 触发,使用 zaproxy/action-baseline@v0.12.0,指定 target、rules_file_name、cmd_options(-a -j),并上传 report_html.html。

步骤 2:配置 ZAP 全量扫描。使用 zaproxy/action-full-scan@v0.12.0,cmd_options 为 -a -j -T 60,上传 report_html.html 与 report_json.json。

步骤 3:配置基于 OpenAPI 规范的 API 扫描。使用 zaproxy/action-api-scan@v0.12.0,target 指向 openapi.json,format 为 openapi,指定 api-rules.tsv。

步骤 4:配置扫描规则。在 .zap/rules.tsv 中按“规则 ID、动作、描述”格式设置,例如 10003 IGNORE、10015 WARN、10021 FAIL、10035 FAIL、10038 FAIL、10098 IGNORE、40012 FAIL、40014 FAIL、40018 FAIL、40019 FAIL、40032 FAIL、90033 FAIL。

步骤 5:使用 Docker Compose 本地测试。docker-compose.zap.yml 定义 webapp 与 zap 服务,zap 依赖 webapp 健康检查,命令为 zap-baseline.py 并指定 -t、-r、-J、-c、-I,挂载 ./zap-reports 与 ./.zap/rules.tsv。

关键概念

DAST:动态应用安全测试,通过发送请求并分析响应来测试运行中的应用。基线扫描:快速被动扫描,爬取应用但不主动攻击,适合 CI/CD。全量扫描:包含 XSS、SQLi 等注入漏洞攻击载荷的主动扫描。API 扫描:使用 OpenAPI/Swagger 规范测试所有已记录的 API 端点。Spider:ZAP 的爬虫,通过跟踪链接发现页面和端点。主动扫描:向发现的端点发送攻击载荷以寻找可利用漏洞。被动扫描:分析 HTTP 响应中的安全头、Cookie 和信息泄露,不发送攻击。扫描策略:定义启用哪些攻击类型及其强度级别的配置。

工具与系统

OWASP ZAP:开源 Web 应用安全扫描器,用于 DAST 测试。zaproxy/action-baseline:用于 ZAP 被动基线扫描的 GitHub Action。zaproxy/action-full-scan:用于 ZAP 主动全量扫描的 GitHub Action。zaproxy/action-api-scan:用于支持 OpenAPI 的 API 聚焦扫描的 GitHub Action。Nuclei:基于模板检测的替代漏洞扫描器,可集成到 CI/CD。

常见场景

场景:将 DAST 集成到预发布部署流水线。背景:团队在部署到生产前先部署到预发布环境,需要在阶段之间自动进行 DAST 扫描以捕获运行时漏洞。方法:在流水线中添加 DAST 作业,在预发布部署成功后触发;先运行 ZAP 基线扫描获取快速被动反馈(2-5 分钟);随后使用应用的 OpenAPI 规范进行针对性 API 扫描;配置 rules.tsv 对关键发现(XSS、SQLi)设为 FAIL,对头/Cookie 问题设为 WARN;将 ZAP 报告作为流水线产物上传以供审查;若检测到任何 FAIL 级别发现则阻止生产部署;每周对预发布环境安排全量扫描以获得更深覆盖。注意事项:ZAP 全量扫描可能耗时 30 分钟以上,并可能以攻击流量压垮预发布服务器。在 CI 中使用基线扫描,全量扫描按计划运行。未经协调对生产运行 DAST 可能触发 WAF 拦截和事件告警。

输出格式

ZAP DAST 扫描报告包含目标、扫描类型、日期、持续时间,以及 FAIL/WARN/INFO/PASS 计数、失败告警详情(含规则 ID、URL、方法、证据)和质量门禁结果。

限制

本技能不适用于扫描源代码(应使用 SAST)、扫描依赖(应使用 SCA)或扫描基础设施配置(应使用 IaC 扫描工具)。全量扫描耗时较长且可能对目标环境造成较大负载。对生产环境运行 DAST 需协调,否则可能触发 WAF 拦截和事件告警。