L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Développement · SKILL.md

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

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

本技能涵盖在 CI/CD 管道中集成 OWASP ZAP(Zed Attack Proxy)进行动态应用安全测试。 内容包括配置基线、完整和 API 扫描以针对运行中的应用程序,解读 ZAP 发现,调整扫描策略, 以及在 GitHub Actions 和 GitLab CI 中建立 DAST 质量门禁。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: integrating-dast-with-owasp-zap-in-pipeline description: > 本技能涵盖在 CI/CD 管道中集成 OWASP ZAP(Zed Attack Proxy)进行动态应用安全测试。 内容包括配置基线、完整和 API 扫描以针对运行中的应用程序,解读 ZAP 发现,调整扫描策略, 以及在 GitHub Actions 和 GitLab CI 中建立 DAST 质量门禁。 domain: cybersecurity subdomain: devsecops tags: [devsecops, cicd, dast, owasp-zap, dynamic-testing, secure-sdlc] version: 1.0.0 author: mahipal license: Apache-2.0

在管道中集成 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 基线扫描

# .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/action-baseline@v0.12.0
        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 完整扫描进行全面测试

  zap-full-scan:
    name: ZAP Full Scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: ZAP Full Scan
        uses: zaproxy/action-full-scan@v0.12.0
        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 扫描

  zap-api-scan:
    name: ZAP API Scan
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: ZAP API Scan
        uses: zaproxy/action-api-scan@v0.12.0
        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
# 规则 ID	操作 (IGNORE/WARN/FAIL)	描述
10003	IGNORE	# 易受攻击的 JS 库(由 SCA 处理)
10015	WARN	# 缓存控制头不完整或缺失
10021	FAIL	# 缺少 X-Content-Type-Options
10035	FAIL	# 缺少 Strict-Transport-Security
10038	FAIL	# 缺少内容安全策略
10098	IGNORE	# 跨域配置错误(CDN)
40012	FAIL	# 跨站脚本攻击(反射型)
40014	FAIL	# 跨站脚本攻击(持久型)
40018	FAIL	# SQL 注入
40019	FAIL	# SQL 注入(MySQL)
40032	FAIL	# .htaccess 信息泄露
90033	FAIL	# 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动态应用安全测试 — 通过发送请求并分析响应来测试运行中的应用程序
基线扫描快速被动扫描,爬取应用程序而不进行主动攻击,适合 CI/CD
完整扫描包括 XSS、SQLi 和其他注入漏洞攻击载荷的主动扫描
API 扫描使用 OpenAPI/Swagger 规范测试所有已记录 API 端点的针对性扫描
爬虫ZAP 通过跟踪链接发现应用程序页面和端点的爬取器
主动扫描ZAP 向已发现端点发送攻击载荷以查找可利用漏洞的阶段
被动扫描分析 HTTP 响应中的安全头、Cookie 和信息泄露,无需发送攻击
扫描策略定义启用哪些攻击类型及其强度级别的配置

工具与系统

  • 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 扫描报告
======================
目标:https://staging.example.com
扫描类型:基线 + API
日期:2026-02-23
时长:4m 32s

发现:
  FAIL: 3
  WARN: 7
  INFO: 12
  PASS: 45

失败告警:
  [高危] 40012 - 跨站脚本攻击(反射型)
    URL:https://staging.example.com/search?q=<script>
    方法:GET
    证据:<script>alert(1)</script>

  [中危] 10021 - 缺少 X-Content-Type-Options
    URL:https://staging.example.com/api/v1/*
    证据:响应头缺失

  [中危] 10035 - 缺少 Strict-Transport-Security
    URL:https://staging.example.com/
    证据:HSTS 头不存在

质量门禁:失败(1 个高危,2 个中危发现)
Skills enregistrées