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

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

github.com/mukul975安全35.2k155 次安装8 周前更新
代码仓库

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

该技能说明如何在 CI/CD 流水线中使用 OWASP ZAP 对运行中的 Web 应用和 API 执行 DAST,适合在发布前检查运行时漏洞。内容涵盖扫描类型、规则配置和部署门禁。

主要功能

  1. 01配置 ZAP 基线扫描
  2. 02执行完整主动扫描
  3. 03依据 OpenAPI 扫描 API
  4. 04设置规则级别与结果
  5. 05在 Docker Compose 中本地测试

适用场景

  1. 01在预发布环境部署后运行被动扫描
  2. 02依据 API 规范检查端点
  3. 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 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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 端点
SpiderZAP 的爬虫,通过跟随链接发现应用页面和端点
Active ScanZAP 向发现的端点发送攻击载荷以查找可利用漏洞的阶段
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 扫描,以捕获运行时漏洞。

方法:

  1. 在流水线中添加 DAST 任务,在预发部署成功后触发
  2. 先运行 ZAP 基线扫描以快速获取被动反馈(2-5 分钟)
  3. 随后使用应用的 OpenAPI 规范进行针对性 API 扫描
  4. 配置 rules.tsv,对严重发现(XSS、SQLi)设为 FAIL,对标头/cookie 设为 WARN
  5. 将 ZAP 报告作为流水线产物上传以供审查
  6. 如果检测到任何 FAIL 级别发现,则阻止生产部署
  7. 每周安排针对预发环境的全量扫描,以获得更深入的覆盖

陷阱: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