What it does. Deploy DefectDojo as a centralized vulnerability management dashboard that ingests findings from 200+ security scanners, deduplicates results, tracks remediation metrics, and integrates with CI/CD, Jira ticketing, and Slack notifications via its REST API. Use when consolidating scanner output into one dashboard or automating vulnerability ticketing and executive reporting. Part of mukul975/Anthropic-Cybersecurity-Skills (817 security skills) (mukul975/Anthropic-Cybersecurity-Skills).
Install
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill building-vulnerability-dashboard-with-defectdojo, or copy the skill folder into ~/.claude/skills/building-vulnerability-dashboard-with-defectdojo/.
- Raw file:
curl -sL https://raw.githubusercontent.com/mukul975/Anthropic-Cybersecurity-Skills/HEAD/skills/building-vulnerability-dashboard-with-defectdojo/SKILL.md
SKILL.md (verbatim)
1 placeholder credential was shortened (for example to api_key=YOUR_KEY) to pass the site's secret filter.
name: building-vulnerability-dashboard-with-defectdojo
description: Deploy DefectDojo as a centralized vulnerability management dashboard that ingests findings from 200+ security scanners, deduplicates results, tracks remediation metrics, and integrates with CI/CD, Jira ticketing, and Slack notifications via its REST API. Use when consolidating scanner output into one dashboard or automating vulnerability ticketing and executive reporting.
domain: cybersecurity
subdomain: vulnerability-management
tags:
- defectdojo
- vulnerability-management
- dashboard
- deduplication
- scanner-integration
- devsecops
- jira
version: '1.0'
author: mahipal
license: Apache-2.0
nist_csf:
- ID.RA-01
- ID.RA-02
- ID.IM-02
- ID.RA-06
mitre_attack:
- T1190
- T1203
- T1068
Building Vulnerability Dashboard with DefectDojo
Overview
DefectDojo is an open-source application vulnerability management platform that aggregates findings from 200+ security tools, deduplicates results, tracks remediation progress, and provides executive dashboards. It serves as a central hub for vulnerability management, integrating with CI/CD pipelines, Jira for ticketing, and Slack for notifications. DefectDojo supports OWASP-based categorization and provides REST API for automation.
When to Use
- When deploying or configuring building vulnerability dashboard with defectdojo capabilities in your environment
- When establishing security controls aligned to compliance requirements
- When building or improving security architecture for this domain
- When conducting security assessments that require this implementation
Prerequisites
- Docker and Docker Compose
- 4GB+ RAM, 2+ CPU cores, 20GB+ disk
- PostgreSQL 12+ (included in Docker deployment)
- Python 3.9+ for API integration scripts
- Jira instance (optional, for ticket integration)
Deployment
Docker Compose Deployment
# Clone DefectDojo repository
git clone https://github.com/DefectDojo/django-DefectDojo.git
cd django-DefectDojo
# Start with Docker Compose (production mode)
./dc-up-d.sh
# Alternative: manual Docker Compose
docker compose up -d
# Check service status
docker compose ps
# View initial admin credentials
docker compose logs initializer 2>&1 | grep "Admin password"
# Access DefectDojo at http://localhost:8080
Environment Configuration
# Key environment variables in docker-compose.yml
DD_DATABASE_ENGINE=django.db.backends.postgresql
DD_DATABASE_HOST=postgres
DD_DATABASE_PORT=5432
DD_DATABASE_NAME=defectdojo
DD_DATABASE_USER=defectdojo
DD_DATABASE_PASSWORD=<secure_password>
DD_ALLOWED_HOSTS=*
DD_SECRET_KEY=<random_64_char_key>
DD_CREDENTIAL_AES_256_KEY=<random_128_bit_key>
DD_SOCIAL_AUTH_GOOGLE_OAUTH2_ENABLED=True
Organizational Structure
Hierarchy
Product Type (Business Unit)
└── Product (Application/Service)
└── Engagement (Assessment/Sprint)
└── Test (Scanner Run)
└── Finding (Individual Vulnerability)
Setup via API
import requests
DD_URL = "http://localhost:8080/api/v2"
API_KEY = YOUR_KEY
HEADERS = {"Authorization": f"Token {API_KEY}", "Content-Type": "application/json"}
# Create Product Type
resp = requests.post(f"{DD_URL}/product_types/", headers=HEADERS, json={
"name": "Web Applications",
"description": "Customer-facing web application portfolio"
})
product_type_id = resp.json()["id"]
# Create Product
resp = requests.post(f"{DD_URL}/products/", headers=HEADERS, json={
"name": "Customer Portal",
"description": "Main customer-facing web application",
"prod_type": product_type_id,
"sla_configuration": 1,
})
product_id = resp.json()["id"]
# Create Engagement
resp = requests.post(f"{DD_URL}/engagements/", headers=HEADERS, json={
"name": "Q1 2024 Security Assessment",
"product": product_id,
"target_start": "2024-01-01",
"target_end": "2024-03-31",
"engagement_type": "CI/CD",
"status": "In Progress",
})
engagement_id = resp.json()["id"]
Scanner Integration
Import Scan Results via API
# Upload Nessus scan results
curl -X POST "${DD_URL}/reimport-scan/" \
-H "Authorization: Token ${API_KEY}" \
-F "scan_type=Nessus Scan" \
-F "file=@nessus_report.csv" \
-F "product_name=Customer Portal" \
-F "engagement_name=Q1 2024 Security Assessment" \
-F "auto_create_context=true" \
-F "deduplication_on_engagement=true"
# Upload OWASP ZAP results
curl -X POST "${DD_URL}/reimport-scan/" \
-H "Authorization: Token ${API_KEY}" \
-F "scan_type=ZAP Scan" \
-F "file=@zap_report.xml" \
-F "product_name=Customer Portal" \
-F "engagement_name=Q1 2024 Security Assessment" \
-F "auto_create_context=true"
# Upload Trivy container scan
curl -X POST "${DD_URL}/reimport-scan/" \
-H "Authorization: Token ${API_KEY}" \
-F "scan_type=Trivy Scan" \
-F "file=@trivy_results.json" \
-F "product_name=Customer Portal" \
-F "engagement_name=Q1 2024 Security Assessment" \
-F "auto_create_context=true"
Supported Scanner Types (Partial List)
| Scanner |
Type String |
Format |
| Nessus |
Nessus Scan |
CSV/XML |
| OpenVAS |
OpenVAS CSV |
CSV |
| Qualys |
Qualys Scan |
XML |
| OWASP ZAP |
ZAP Scan |
XML/JSON |
| Burp Suite |
Burp XML |
XML |
| Trivy |
Trivy Scan |
JSON |
| Semgrep |
Semgrep JSON Report |
JSON |
| Snyk |
Snyk Scan |
JSON |
| SonarQube |
SonarQube Scan |
JSON |
| Checkov |
Checkov Scan |
JSON |
CI/CD Integration (GitHub Actions)
# .github/workflows/security-scan.yml
name: Security Scan
on: [push]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Semgrep
run: |
pip install semgrep
semgrep --config auto --json -o semgrep_results.json .
- name: Upload to DefectDojo
run: |
curl -X POST "${{ secrets.DD_URL }}/api/v2/reimport-scan/" \
-H "Authorization: Token ${{ secrets.DD_API_KEY }}" \
-F "scan_type=Semgrep JSON Report" \
-F "file=@semgrep_results.json" \
-F "product_name=${{ github.event.repository.name }}" \
-F "engagement_name=CI/CD" \
-F "auto_create_context=true"
Jira Integration
# Configure Jira integration in DefectDojo settings
jira_config = {
"url": "https://company.atlassian.net",
"username": "jira-bot@company.com",
"password": "jira_api_token",
"default_issue_type": "Bug",
"critical_mapping_severity": "Blocker",
"high_mapping_severity": "Critical",
"medium_mapping_severity": "Major",
"low_mapping_severity": "Minor",
"finding_text": "**Vulnerability**: {{ finding.title }}\n**Severity**: {{ finding.severity }}\n**CVE**: {{ finding.cve }}\n**Description**: {{ finding.description }}",
"accepted_mapping_resolution": "Done",
"close_status_key": 6,
}
Metrics and Dashboards
Key Metrics API Queries
# Get finding counts by severity
resp = requests.get(f"{DD_URL}/findings/?limit=0&active=true",
headers=HEADERS)
findings = resp.json()
# Get SLA breach counts
resp = requests.get(f"{DD_URL}/findings/?limit=0&active=true&sla_breached=true",
headers=HEADERS)
# Get product-level metrics
resp = requests.get(f"{DD_URL}/products/{product_id}/",
headers=HEADERS)
product_data = resp.json()
References
Other files in this skill
assets/template.md (verbatim)
DefectDojo Configuration Template
Product Hierarchy Setup
Product Types (Business Units)
| Product Type |
Description |
| Web Applications |
Customer-facing web applications |
| Mobile Applications |
iOS and Android apps |
| Internal Tools |
Employee-facing internal applications |
| Infrastructure |
Network and cloud infrastructure |
| APIs |
REST and GraphQL API services |
Scanner Type Mappings
| Scanner |
DefectDojo Scan Type |
File Format |
| Nessus |
Nessus Scan |
.csv or .nessus |
| OWASP ZAP |
ZAP Scan |
.xml or .json |
| Burp Suite |
Burp XML |
.xml |
| Trivy |
Trivy Scan |
.json |
| Semgrep |
Semgrep JSON Report |
.json |
| Snyk |
Snyk Scan |
.json |
| SonarQube |
SonarQube Scan |
.json |
| Checkov |
Checkov Scan |
.json |
| Bandit |
Bandit Scan |
.json |
| OpenVAS |
OpenVAS CSV |
.csv |
| Qualys |
Qualys Scan |
.xml |
SLA Configuration
| Severity |
Days to Remediate |
| Critical |
7 |
| High |
30 |
| Medium |
90 |
| Low |
120 |
| Info |
No SLA |
Jira Integration Settings
Jira URL: https://company.atlassian.net
Project Key: SEC
Issue Type: Bug
Priority Mapping:
Critical -> Blocker
High -> Critical
Medium -> Major
Low -> Minor
Auto-close: Yes (when finding is closed in DefectDojo)
CI/CD Integration Snippet
# Generic CI/CD step for DefectDojo upload
- name: Upload scan results to DefectDojo
env:
DD_URL: ${{ secrets.DEFECTDOJO_URL }}
DD_API_KEY: ${{ secrets.DEFECTDOJO_API_KEY }}
run: |
curl -X POST "${DD_URL}/api/v2/reimport-scan/" \
-H "Authorization: Token ${DD_API_KEY}" \
-F "scan_type=${SCAN_TYPE}" \
-F "file=@${SCAN_FILE}" \
-F "product_name=${PRODUCT_NAME}" \
-F "auto_create_context=true" \
-F "close_old_findings=true"
references/api-reference.md (verbatim)
API Reference: Vulnerability Dashboard with DefectDojo
Authentication
# Token-based auth
curl -H "Authorization: Token $DEFECTDOJO_TOKEN" \
"http://localhost:8080/api/v2/findings/"
Core Endpoints
| Method |
Endpoint |
Description |
| GET |
/api/v2/findings/ |
List vulnerability findings |
| GET |
/api/v2/products/ |
List products |
| GET |
/api/v2/engagements/ |
List engagements |
| GET |
/api/v2/tests/ |
List tests |
| POST |
/api/v2/import-scan/ |
Import scanner results |
| POST |
/api/v2/reimport-scan/ |
Re-import/update results |
Finding Query Parameters
| Parameter |
Type |
Description |
| severity |
string |
Critical, High, Medium, Low, Info |
| active |
boolean |
Only active findings |
| verified |
boolean |
Only verified findings |
| duplicate |
boolean |
Include duplicates |
| product |
integer |
Filter by product ID |
| limit |
integer |
Results per page |
| offset |
integer |
Pagination offset |
Import Scan
curl -X POST "http://localhost:8080/api/v2/import-scan/" \
-H "Authorization: Token $TOKEN" \
-F "product=1" \
-F "engagement=1" \
-F "scan_type=Nessus Scan" \
-F "file=@nessus_export.csv" \
-F "active=true" \
-F "verified=false"
Supported Scan Types (partial)
| Scanner |
scan_type Value |
| Nessus |
Nessus Scan |
| Qualys |
Qualys Scan |
| Burp Suite |
Burp REST API |
| OWASP ZAP |
ZAP Scan |
| Trivy |
Trivy Scan |
| Snyk |
Snyk Scan |
| Semgrep |
Semgrep JSON Report |
| Nuclei |
Nuclei Scan |
| Checkov |
Checkov Scan |
| SARIF |
SARIF |
Python Client
import requests
class DefectDojoClient:
def __init__(self, url, token):
self.url = url.rstrip("/")
self.headers = {"Authorization": "Token " + token}
def get_findings(self, **params):
return requests.get(
f"{self.url}/api/v2/findings/",
headers=self.headers, params=params
).json()
references/standards.md (verbatim)
Standards and References - DefectDojo Vulnerability Dashboard
Primary References
DefectDojo Project
Supported Scanner Integrations
OWASP Application Security Verification Standard (ASVS)
NIST SP 800-53 Rev 5 - RA-5
- Title: Vulnerability Monitoring and Scanning
- Relevance: DefectDojo supports centralized vulnerability tracking as required by RA-5
PCI DSS v4.0 - Requirement 6
- Relevance: DefectDojo tracks application security findings for PCI compliance
Deployment Requirements
| Component |
Minimum |
Recommended |
| CPU |
2 cores |
4 cores |
| RAM |
4 GB |
8 GB |
| Disk |
20 GB |
50 GB+ |
| PostgreSQL |
12+ |
15+ |
| Docker |
20.10+ |
Latest stable |
| Docker Compose |
2.0+ |
Latest stable |
references/workflows.md (verbatim)
Workflows - DefectDojo Vulnerability Dashboard
Workflow 1: Initial Setup and Configuration
Steps
- Clone DefectDojo repository and deploy with Docker Compose
- Configure admin account and change default password
- Create Product Types aligned with business units
- Create Products for each application/service
- Configure Jira integration for ticket management
- Configure Slack/Teams webhook for notifications
- Set up SLA policies for each severity level
- Create API keys for scanner integration
Workflow 2: CI/CD Scanner Integration
Steps
- Add scan step to CI/CD pipeline (GitHub Actions, GitLab CI, Jenkins)
- Run security scanner (Semgrep, Trivy, ZAP, etc.)
- Upload scan results to DefectDojo via reimport-scan API
- DefectDojo deduplicates findings against existing data
- New findings trigger Jira ticket creation
- Closed findings auto-close associated Jira tickets
- Pipeline receives pass/fail status based on finding severity
Workflow 3: Vulnerability Triage
Steps
- Security analyst reviews new findings in DefectDojo dashboard
- For each finding: verify, assign severity, set risk acceptance status
- Valid findings: push to Jira for remediation tracking
- False positives: mark as false positive with justification
- Risk accepted: document compensating controls and set expiration
- Track remediation progress through DefectDojo metrics
Workflow 4: Executive Reporting
Steps
- Pull metrics via DefectDojo API for reporting period
- Calculate: total findings, new vs closed, SLA compliance rate
- Generate product-level and business-unit-level summaries
- Track mean time to remediate by severity
- Export dashboard data for executive presentation
Back to mukul975/Anthropic-Cybersecurity-Skills (817 security skills) or Agent skills.