4. DAST 扫描环境搭建

4.1 原理概述

DAST(动态应用安全测试)的核心是模拟攻击者行为,向运行中的应用发送请求并分析响应。要保障扫描过程的隔离性、可重复性与可维护性,推荐将扫描工具封装为独立容器(如 Docker 容器)。独立容器环境只需暴露目标应用 URL,扫描器通过容器内网络层发起请求,实现扫描环境与应用环境的解耦。

关键设计原则:容器化 → 环境一致性 + 快速重建 + 无残留;通过环境变量动态注入目标 URL 与认证信息;登录态管理采用预录制 Cookie 或自动化脚本回放。
DAST 扫描环境架构 DAST 扫描容器 (ZAP / Arachni / Burp) 爬虫引擎 深度/广度配置 登录模拟模块 Cookie/Session 注入 扫描策略 规则/深度/并发 目标应用 http://target-app:8080 扫描报告 HTML / JSON / SARIF 说明:扫描容器内爬虫引擎通过配置的 URL 和认证态发现应用页面,扫描策略控制测试深度与强度,最终输出报告。

4.2 核心组件与配置清单

组件环境变量 / 参数说明
目标应用 URLDAST_TARGET_URL需被扫描应用的基地址,如 http://app:3000
登录凭证DAST_USERNAME / DAST_PASSWORD用于模拟登录表单或 API 认证
Cookie/SessionDAST_COOKIE / DAST_SESSION_HEADER预录的合法会话标识,跳过登录环节
爬取深度DAST_CRAWL_DEPTH整数,限制爬虫跟踪链接的层级(默认 2-3)
爬取页面上限DAST_MAX_PAGES整数,防止无限爬取(默认 500)

4.3 实现流程

  1. 准备扫描容器镜像:基于官方镜像(如 owasp/zap2docker-stable)构建自定义镜像,预装插件和脚本。
  2. 配置目标 URL:通过环境变量或命令行参数传入,确保容器与目标网络互通(同网桥或使用 --network host)。
  3. 注入登录态:若应用需要认证,可采用预录制 Cookie 注入或自动化表单登录。
  4. 设置爬取策略:配置爬取深度、广度、URL 排除规则(如登出、静态资源)。
  5. 执行扫描:运行容器,DAST 工具自动完成爬取 + 攻击检测,输出报告到挂载卷。

4.4 代码/配置示例

4.4.1 Dockerfile 扩展(基于 ZAP)

FROM owasp/zap2docker-stable:latest

# 复制自定义脚本
COPY scripts/ /zap/scripts/
# 设置默认工作目录
WORKDIR /zap

# 入口脚本处理参数
COPY entrypoint.sh /zap/entrypoint.sh
RUN chmod +x /zap/entrypoint.sh

ENTRYPOINT ["/zap/entrypoint.sh"]

4.4.2 entrypoint.sh(启动扫描)

#!/bin/bash
# 接收环境变量
TARGET_URL="${DAST_TARGET_URL}"
COOKIE="${DAST_COOKIE}"
DEPTH="${DAST_CRAWL_DEPTH:-2}"
MAX_PAGES="${DAST_MAX_PAGES:-500}"

# 构建 ZAP 指令
CMD="zap-full-scan.py -t $TARGET_URL -r report.html"
CMD+=" -d $DEPTH"               # 爬取深度
CMD+=" -m $MAX_PAGES"           # 最大页面数

# 如果提供了 Cookie,注入到请求头
if [ -n "$COOKIE" ]; then
  CMD+=" -z '--auth-cookie=$COOKIE'"
fi

# 执行扫描
eval $CMD

4.4.3 Docker Compose 多服务扫描

version: '3.8'
services:
  dast-scanner:
    build: .
    environment:
      - DAST_TARGET_URL=http://target-app:3000
      - DAST_CRAWL_DEPTH=3
      - DAST_MAX_PAGES=1000
      - DAST_COOKIE=session=abc123; Path=/
    volumes:
      - ./reports:/zap/reports
    networks:
      - scan-net
  target-app:
    image: your-app:latest
    ports:
      - "3000:3000"
    networks:
      - scan-net

networks:
  scan-net:
    driver: bridge

4.5 登录态模拟与 Cookie/Session 管理

方式适用场景配置示例
预录制 Cookie已知有效会话,免去登录耗时Cookie: JSESSIONID=xxx; csrf=yyy
脚本登录需要每次扫描前重新认证使用 ZAP 的 zap-cli session create 并执行登录流程
Header 注入基于 的 API 扫描Authorization: Bearer <>
最佳实践:不要在配置中硬编码 Seesion 值,使用 CI/CD 变量注入或外部 Secrect Manager;Cookie 有效期较短时,优先使用脚本登录并在扫描前刷新 Session。

4.6 爬取深度配置与影响

深度参数控制爬虫从入口页面出发所能跟随的链接层级。深度过大会引入大量无关页面(如管理后台、静态资产),增加扫描时间且可能触发反爬机制。推荐值:

  • 浅扫 (depth=1):仅扫描入口页面及直接链接,适合 API 或单页应用。
  • 标准 (depth=2):覆盖主要业务模块,平衡速度与覆盖率。
  • 深度 (depth=3+):需要较大时间预算,适用于最小监视场景。

除深度外,还需限制最大页面数(如 500)、排除模式(避免爬取登出链接、日志文件等)。

4.7 调试与常见错误

常见错误 1:容器无法访问目标 URL
检查网络模式:使用自定义网桥时确保服务名解析正确;若目标在宿主机,可设置 network_mode: "host" 或使用 host.docker.internal 作为目标主机。

常见错误 2:登录态过期导致扫描 403/302
在预录制 Cookie 前确认会话有效时间;若使用脚本登录,在任务输出中查看 --auth-failed 日志。

常见错误 3:爬取深度不足,遗漏关键页面
通过 ZAP 的 spider 日志检查已发现 URL 数量;可增加深度或使用浏览器录制(AJAX Spider)。

4.8 性能/稳定性优化

  • 限制并发请求:通过 ZAP 的 rules.prop 中的 threads 参数控制(默认 5,可降至 2 避免目标超载)。
  • 启用去重与过滤:配置排除模式(如图片、CSS、退出链接),减少重复扫描。
  • 资源限制:Docker 容器的 --memory=2g --cpus=1 防止扫描器挤占 CI 节点。
  • 分段扫描:对于大型应用,按照模块一次扫描深度≤2,并分步触发扫描(如 CI 的不同 job 各自扫描)。