返回首页

DefectDojo:开源漏洞管理平台部署与多扫描器集成

:开源漏洞管理平台部署与多扫描器集成

漏洞管理是安全运营的核心环节。随着企业资产规模增长,手动跟踪漏洞变得不可持续。商业漏洞管理平台如 VRM、Kenna 、Tenable.io动辄数万美元年费,对中小企业来说是一笔不小的开支。本文将手把手教你部署开源漏洞管理平台DefectDojo,并集成多个主流扫描器,构建一套完整的企业级漏洞管理流水线。

一、商业漏洞管理平台定价对比

平台 定价 核心功能 适用规模
ServiceNow VRM $50,000+/年(企业级) 风险量化、工单集成、自动化修复建议 大型企业(1000+员工)
Kenna Security( 不公开,据报$30,000+/年 风险评分引擎、威胁情报关联、预测分析 中大型企业
Tenable.io 按资产计费,约$3,000-$30,000+/年 漏洞扫描、合规检查、资产发现 各规模企业
Rapid7 InsightVM $2,500+/年起 实时监控、合规报告、自动化工作流 中大型企业

这些商业平台的共同特点是:风险量化评分自动化修复建议企业级工单系统集成。但DefectDojo作为开源方案,在扫描器集成数量和报告管理方面已经非常成熟。

二、开源替代方案介绍

2.1 DefectDojo

DefectDojo是最成熟的开源漏洞管理平台,由项目孵化。支持50+安全扫描器集成,具备完整的漏洞生命周期管理、风险管理、报告导出等功能。Django后端+React前端,社区活跃。

2.2 Archery(洞态IAST配套)

Archery是国产开源SQL审核平台,洞态IAST是配套的交互式安全测试工具。对中文用户非常友好,界面简洁,部署简单。

2.3 Faraday(社区版)

Faraday提供集成化的工作空间,支持多用户协作,内置漏洞数据库。社区版免费但有功能限制。

2.4 Vuln Whisperer

Vuln Whisperer是一个漏洞数据聚合工具,能将多个扫描器的结果统一格式化,适合作为DefectDojo的数据源。

三、功能对比表

功能 ServiceNow VRM Kenna Tenable.io DefectDojo Archery
扫描器集成 ✅ 多种 ✅ 多种 ⚠️ Tenable系 ✅ 50+ ⚠️ 有限
漏洞生命周期
风险量化 ✅ CVSS+ ✅ 自研 ✅ CVSS ⚠️ CVSS基础 ⚠️ 基础
报告导出 ✅ PDF/CSV ✅ PDF/CSV/XML
接口 ✅ REST ✅ REST+GraphQL ✅ REST
工单集成 ✅ Jira/ServiceNow ✅ Jira/GitHub
中文支持 ⚠️ ⚠️ ⚠️ ✅ 原生
自动化修复建议 ⚠️
价格 $50K+ $30K+ $3K+ 免费 免费

四、DefectDojo 完整部署步骤

4.1 环境要求

  • Docker 20.10+
  • Docker Compose 2.0+
  • 最低4GB内存,推荐8GB
  • 50GB磁盘空间

4.2 使用Docker Compose部署(推荐)

# 克隆仓库
git clone https://github.com/DefectDojo/django-DefectDojo.git
cd django-DefectDojo

# 切换到最新稳定版
git checkout $(git describe --tags $(git rev-list --tags --max-count=1))

# 复制环境配置文件
cp .env.template .env

# 编辑.env文件,设置关键密码
# DD_ADMIN_PASSWORD 设置为强密码
# DD_SECRET_KEY 设置为随机生成的密钥

# 生成随机密钥
python3 -c "import secrets; print(secrets.token_urlsafe(64))"
# 将输出粘贴到 DD_SECRET_KEY 的值

# 启动所有服务
docker compose up -d

# 等待服务启动(首次约需3-5分钟)
docker compose logs -f initializer
# 看到 "Initialization completed" 表示就绪

4.3 生产环境配置优化

docker-compose.override.yml 中覆盖默认配置:

version: "3.8"
services:
  celeryworker:
    environment:
      DD_CELERY_WORKER_AUTOSCALE_MAX: 8
      DD_CELERY_WORKER_AUTOSCALE_MIN: 2

  uwsgi:
    environment:
      DD_UWSGI_NUM_OF_PROCESSES: 8
      DD_UWSGI_THREADS: 4

4.4 反向代理配置

server {
    listen 443 ssl;
    server_name defectdojo.yourcompany.com;

    ssl_certificate /etc/ssl/certs/defectdojo.crt;
    ssl_certificate_key /etc/ssl/private/defectdojo.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

五、扫描器集成配置

5.1 集成/Tenable扫描结果

# 1. 在DefectDojo中添加扫描器
# Settings -> Tools -> Add Tool Configuration
# Name: Tenable Nessus
# Type: Scanner
# URL: https://nessus.yourcompany.com
# API Key: 你的Nessus API Token

# 2. 自动导入Nessus扫描结果
curl -X POST "https://defectdojo.yourcompany.com/api/v2/import-scan/" \
  -H "Authorization: Token your-dd-api-token" \
  -F "scan_type=Nessus Scan" \
  -F "file=@scan_results.nessus" \
  -F "engagement=1" \
  -F "verified=true"

# 3. 设置定时自动导入(crontab)
echo "0 */6 * * * /opt/scripts/import-nessus.sh" | crontab -

5.2 集成

# 运行Nuclei扫描并导入DefectDojo
nuclei -u https://target.com -o nuclei_results.json -json

curl -X POST "https://defectdojo.yourcompany.com/api/v2/import-scan/" \
  -H "Authorization: Token your-dd-api-token" \
  -F "scan_type=Nuclei Scan" \
  -F "file=@nuclei_results.json" \
  -F "engagement=1"

5.3 集成Semgrep(SAST)

# 运行Semgrep代码扫描
semgrep --config=auto --json -o semgrep_results.json /path/to/code

# 导入DefectDojo
curl -X POST "https://defectdojo.yourcompany.com/api/v2/import-scan/" \
  -H "Authorization: Token your-dd-api-token" \
  -F "scan_type=Semgrep JSON Report" \
  -F "file=@semgrep_results.json" \
  -F "engagement=1"

5.4 集成Trivy(容器安全)

# 扫描Docker镜像
trivy  -f json -o trivy_results.json your-app:latest

# 导入DefectDojo
curl -X POST "https://defectdojo.yourcompany.com/api/v2/import-scan/" \
  -H "Authorization: Token your-dd-api-token" \
  -F "scan_type=Trivy Scan" \
  -F "file=@trivy_results.json" \
  -F "engagement=1"

5.5 集成ZAP(DAST)

# 运行ZAP扫描
docker run -v $(pwd):/zap/wrk/ ghcr.io/zaproxy/zaproxy:stable \
  zap-full-scan.py -t https://target.com -r zap_report. -J zap_report.json

# 导入DefectDojo
curl -X POST "https://defectdojo.yourcompany.com/api/v2/import-scan/" \
  -H "Authorization: Token your-dd-api-token" \
  -F "scan_type=ZAP Scan" \
  -F "file=@zap_report.json" \
  -F "engagement=1"

5.6 Jira集成配置

在DefectDojo中配置Jira连接:Settings -> Tools -> Add Tool Configuration。Type选择JIRA,填入Atlassian URL、邮箱和API Token。然后在Product设置中关联Jira项目,启用Push All Issues,配置Project Key为SEC。

六、自动化漏洞管理流水线

6.1 集成脚本

#!/bin/bash
# /opt/scripts/vuln-pipeline.sh

DD_URL="https://defectdojo.yourcompany.com"
DD_TOKEN="your-dd-api-token"
ENGAGEMENT_ID="1"

# Step 1: 运行Trivy容器扫描
trivy image -f json -o /tmp/trivy.json ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}

# Step 2: 运行Semgrep SAST
semgrep --config=auto --json -o /tmp/semgrep.json ./src

# Step 3: 运行Nuclei DAST
nuclei -u https://staging.yourcompany.com -json -o /tmp/nuclei.json

# Step 4: 批量导入DefectDojo
for scan_type_file in "Trivy Scan:/tmp/trivy.json" "Semgrep JSON Report:/tmp/semgrep.json" "Nuclei Scan:/tmp/nuclei.json"; do
    IFS=":" read -r stype sfile <<< "$scan_type_file"
    curl -s -X POST "${DD_URL}/api/v2/import-scan/" \
        -H "Authorization: Token ${DD_TOKEN}" \
        -F "scan_type=${stype}" \
        -F "file=@${sfile}" \
        -F "engagement=${ENGAGEMENT_ID}" \
        -F "auto_create_context=true"
done

# Step 5: 检查是否有漏洞
CRITICAL_COUNT=$(curl -s "${DD_URL}/api/v2/findings/?severity=Critical&active=true" \
    -H "Authorization: Token ${DD_TOKEN}" | python3 -c "import sys,json; print(json.load(sys.stdin)['count'])")

if [ "$CRITICAL_COUNT" -gt 0 ]; then
    echo "Found ${CRITICAL_COUNT} Critical vulnerabilities, blocking deployment"
    exit 1
fi

echo "Security check passed"

6.2 漏洞自动关闭

通过DefectDojo的Reimport API,在新扫描导入时自动标记已修复的漏洞为Mitigated状态。只需在import-scan时设置close_old_findings=true参数:

curl -X POST "${DD_URL}/api/v2/reimport-scan/" \
  -H "Authorization: Token ${DD_TOKEN}" \
  -F "scan_type=Trivy Scan" \
  -F "file=@new_trivy.json" \
  -F "test=42" \
  -F "close_old_findings=true"

七、与商业方案的差距与弥补

DefectDojo缺少的核心能力:

  1. 风险量化评分:商业工具如Kenna有自研的预测性风险评分引擎。弥补方案:接入EPSS评分数据,结合CVSS和资产重要性自建评分模型。
  2. 自动化修复建议:ServiceNow能自动生成修复工单并推荐补丁。弥补方案:利用 API对漏洞描述进行分析,自动生成修复建议文本。
  3. 威胁情报关联:商业平台内置威胁情报源。弥补方案:集成OTX、MISP等开源威胁情报平台,通过自定义脚本将情报数据导入DefectDojo。

八、总结

DefectDojo作为开源漏洞管理平台,在扫描器集成(50+)和报告管理方面已经非常成熟,完全可以替代$50,000+/年的ServiceNow VRM。主要的差距在风险量化和自动化修复建议方面,但通过集成EPSS、LLM等工具可以有效弥补。对于中小团队来说,DefectDojo + Jira的组合是一套性价比极高的漏洞管理方案。将商业工具的预算投入到安全工程师的能力提升和流程优化上,才是真正的降本增效。

评论