关于 integrating-dast-with-owasp-zap-in-pipeline
该技能说明如何在 CI/CD 流水线中使用 OWASP ZAP 对运行中的 Web 应用和 API 执行 DAST,适合在发布前检查运行时漏洞。内容涵盖扫描类型、规则配置和部署门禁。
主要功能
- 01配置 ZAP 基线扫描
- 02执行完整主动扫描
- 03依据 OpenAPI 扫描 API
- 04设置规则级别与结果
- 05在 Docker Compose 中本地测试
适用场景
- 01在预发布环境部署后运行被动扫描
- 02依据 API 规范检查端点
- 03按发现结果阻止生产部署
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill integrating-dast-with-owasp-zap-in-pipeline安装后在 Claude Code 中输入/integrating-dast-with-owasp-zap-in-pipeline确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
在流水线中集成 DAST 与 OWASP ZAP
何时使用
- 当测试正在运行的 Web 应用是否存在 XSS、SQLi、CSRF 和错误配置等漏洞时
- 当仅靠 SAST 不够、需要运行时行为测试时
- 当合规要求在生产前对 Web 应用进行动态安全测试时
- 当测试 API(REST/GraphQL)的认证、授权和注入缺陷时
- 当在生产部署前于预发环境中建立持续 DAST 扫描时
不要使用于扫描源代码(使用 SAST)、扫描依赖项(使用 SCA)或扫描基础设施配置(使用 IaC 扫描工具)。
前置条件
- OWASP ZAP Docker 镜像或本地安装(zaproxy/zap-stable 或 zaproxy/action-*)
- 可从 CI/CD runner 访问的运行中目标应用(预发 URL 或 Docker 服务)
- ZAP 扫描规则配置(可选,用于调优)
- 用于 API 扫描的 OpenAPI/Swagger 规范(可选)
工作流
第 1 步:在 GitHub Actions 中配置 ZAP Baseline Scan
# .github/workflows/dast-scan.yml
name: DAST Security Scan
on:
deployment_status:
workflow_dispatch:
inputs:
target_url:
description: 'Target URL to scan'
required: true
jobs:
zap-baseline:
name: ZAP Baseline Scan
runs-on: ubuntu-latest
services:
webapp:
image: ${{ github.repository }}:${{ github.sha }}
ports:
- 8080:8080
options: --health-cmd="curl -f http://localhost:8080/health" --health-interval=10s --health-timeout=5s --health-retries=5
steps:
- uses: actions/checkout@v4
- name: ZAP Baseline Scan
uses: zaproxy/[email protected]
with:
target: 'http://webapp:8080'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a -j'
allow_issue_writing: false
- name: Upload ZAP Report
if: always()
uses: actions/upload-artifact@v4
with:
name: zap-baseline-report
path: report_html.html
第 2 步:配置 ZAP Full Scan 进行全面测试
zap-full-scan:
name: ZAP Full Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ZAP Full Scan
uses: zaproxy/[email protected]
with:
target: ${{ github.event.inputs.target_url || 'https://staging.example.com' }}
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a -j -T 60'
- name: Upload Reports
if: always()
uses: actions/upload-artifact@v4
with:
name: zap-full-report
path: |
report_html.html
report_json.json
第 3 步:使用 OpenAPI 规范配置 API Scan
zap-api-scan:
name: ZAP API Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: ZAP API Scan
uses: zaproxy/[email protected]
with:
target: 'https://staging.example.com/api/openapi.json'
format: openapi
rules_file_name: '.zap/api-rules.tsv'
cmd_options: '-a -j'
第 4 步:配置 ZAP 扫描规则
# .zap/rules.tsv
# Rule ID Action (IGNORE/WARN/FAIL) Description
10003 IGNORE # Vulnerable JS Library (handled by SCA)
10015 WARN # Incomplete or No Cache-control Header
10021 FAIL # X-Content-Type-Options Missing
10035 FAIL # Strict-Transport-Security Missing
10038 FAIL # Content Security Policy Missing
10098 IGNORE # Cross-Domain Misconfiguration (CDN)
40012 FAIL # Cross Site Scripting (Reflected)
40014 FAIL # Cross Site Scripting (Persistent)
40018 FAIL # SQL Injection
40019 FAIL # SQL Injection (MySQL)
40032 FAIL # .htaccess Information Leak
90033 FAIL # Loosely Scoped Cookie
第 5 步:使用 Docker Compose 运行 ZAP 进行本地测试
# docker-compose.zap.yml
version: '3.8'
services:
webapp:
build: .
ports:
- "8080:8080"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 10s
retries: 5
zap:
image: zaproxy/zap-stable:latest
depends_on:
webapp:
condition: service_healthy
command: >
zap-baseline.py
-t http://webapp:8080
-r /zap/wrk/report.html
-J /zap/wrk/report.json
-c /zap/wrk/rules.tsv
-I
volumes:
- ./zap-reports:/zap/wrk
- ./.zap/rules.tsv:/zap/wrk/rules.tsv
关键概念
| 术语 | 定义 |
|---|---|
| DAST | 动态应用安全测试 —— 通过发送请求并分析响应来测试正在运行的应用 |
| Baseline Scan | 快速被动扫描,在不进行主动攻击的情况下爬取应用,适用于 CI/CD |
| Full Scan | 主动扫描,包含针对 XSS、SQLi 和其他注入漏洞的攻击载荷 |
| API Scan | 使用 OpenAPI/Swagger 规范进行针对性扫描,以测试所有已记录的 API 端点 |
| Spider | ZAP 的爬虫,通过跟随链接发现应用页面和端点 |
| Active Scan | ZAP 向发现的端点发送攻击载荷以查找可利用漏洞的阶段 |
| Passive Scan | 在不发送攻击的情况下分析 HTTP 响应中的安全标头、cookie 和信息泄露 |
| Scan Policy | 定义启用哪些攻击类型及其强度级别的配置 |
工具与系统
- OWASP ZAP:用于 DAST 测试的开源 Web 应用安全扫描器
- 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 Scan Report
======================
Target: https://staging.example.com
Scan Type: Baseline + API
Date: 2026-02-23
Duration: 4m 32s
FINDINGS:
FAIL: 3
WARN: 7
INFO: 12
PASS: 45
FAILING ALERTS:
[HIGH] 40012 - Cross Site Scripting (Reflected)
URL: https://staging.example.com/search?q=<script>
Method: GET
Evidence: <script>alert(1)</script>
[MEDIUM] 10021 - X-Content-Type-Options Missing
URL: https://staging.example.com/api/v1/*
Evidence: Response header missing
[MEDIUM] 10035 - Strict-Transport-Security Missing
URL: https://staging.example.com/
Evidence: HSTS header not present
QUALITY GATE: FAILED (1 HIGH, 2 MEDIUM findings)
评论
支持 Markdown