4. DAST 扫描环境搭建
4.1 原理概述
DAST(动态应用安全测试)的核心是模拟攻击者行为,向运行中的应用发送请求并分析响应。要保障扫描过程的隔离性、可重复性与可维护性,推荐将扫描工具封装为独立容器(如 Docker 容器)。独立容器环境只需暴露目标应用 URL,扫描器通过容器内网络层发起请求,实现扫描环境与应用环境的解耦。
关键设计原则:容器化 → 环境一致性 + 快速重建 + 无残留;通过环境变量动态注入目标 URL 与认证信息;登录态管理采用预录制 Cookie 或自动化脚本回放。
4.2 核心组件与配置清单
| 组件 | 环境变量 / 参数 | 说明 |
|---|---|---|
| 目标应用 URL | DAST_TARGET_URL | 需被扫描应用的基地址,如 http://app:3000 |
| 登录凭证 | DAST_USERNAME / DAST_PASSWORD | 用于模拟登录表单或 API 认证 |
| Cookie/Session | DAST_COOKIE / DAST_SESSION_HEADER | 预录的合法会话标识,跳过登录环节 |
| 爬取深度 | DAST_CRAWL_DEPTH | 整数,限制爬虫跟踪链接的层级(默认 2-3) |
| 爬取页面上限 | DAST_MAX_PAGES | 整数,防止无限爬取(默认 500) |
4.3 实现流程
- 准备扫描容器镜像:基于官方镜像(如
owasp/zap2docker-stable)构建自定义镜像,预装插件和脚本。 - 配置目标 URL:通过环境变量或命令行参数传入,确保容器与目标网络互通(同网桥或使用
--network host)。 - 注入登录态:若应用需要认证,可采用预录制 Cookie 注入或自动化表单登录。
- 设置爬取策略:配置爬取深度、广度、URL 排除规则(如登出、静态资源)。
- 执行扫描:运行容器,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 各自扫描)。