まったり技術ブログ

Webエンジニアのセキュリティブログ

【DevSecOps】セキュリティ診断結果を一元管理できる「DefectDojo」を試してみた

はじめに

 セキュリティ診断ツールの結果を一元管理したかったので、OSSで探したところ「DefectDojo」というソフトウェアで実現できそうだったので、動作検証を行いました。

 下の画像は DefectDojo の画面であり、「Dependency-Check」や「Gitleaks」、「Nmap」、「Prowler」などの用途が異なる各診断ツールの結果を1つのダッシュボードで管理できるようでした。

他ツール

 似たようなソフトウェアとして「Faraday」というものもあるそうです。これは今回は触れていません。

infobyte/faraday: Open Source Vulnerability Management Platform

DefectDojo

DefectDojo の説明は公式から引用です。

About DefectDojo | DefectDojo Documentation

 DefectDojo とは?
 
 DefectDojo は開発者向けセキュリティ運用(DevSecOps)プラットフォームです。セキュリティツール群の自動集約機能を備えており、DevSecOpsプロセスを効率化します。
これにより、セキュリティ関連業務を効率的に整理できるだけでなく、組織のセキュリティ状況を他の関係者に容易に報告できるようになります。
 
 DefectDojo の最終的な目的はセキュリティプロセスの自動化と統合開発環境の構築ですが、その中核となる機能は、セキュリティ脆弱性を追跡するためのバグトラッキングシステムであり、複数のセキュリティツールから生成されるレポートを取り込み、整理・標準化することを目的としています。

動作検証

環境構築

 まずは環境構築を行います。DefectDojo の動作検証が行えればよいので、特に設定を変更せずに Docker Compose で起動します。

# DefectDojo の起動
git clone https://github.com/DefectDojo/django-DefectDojo
cd django-DefectDojo
docker compose up

# ダッシュボードへログインするための admin アカウントの初期パスワードを表示
docker compose logs initializer | grep "Admin password:"
initializer-1  | Admin password: (ここにパスワードが表示)

 本番環境で構築するのであれば、いろいろ設定を変更したほうがよさそうです。
Running in Production | DefectDojo Documentation

起動後、アクセスするとログイン画面が表示されます。

検出結果の取り込み

DefectDojo で脆弱性は以下の階層で管理されているため、事前に「Product」と「Engagement」というものを作成します。

Product(テスト対象の製品・アプリケーション など)
    └── Engagement(テスト活動・実施日 など)
                  └── Test(個別スキャン・テスト)
                            └── Finding(個別の脆弱性検出)

Step 1. Product の作成

Product は「Products > Add Product」から作成することができます。

入力項目
Name Sample_Product_1

作成後は以下のようになります。

Step 2. Engagement の作成

 Engagement を作成するために [Engagements] > [Add New Interactive Engagement] へ遷移します。なにも入力せずに下部の「Done」を押下します。 

「2026-04-21 (作成日)」という名前の Engagement が作成されます。

Step 3. 検査結果(Finding) の登録

セキュリティツールの検査結果を登録します。例として SonarQube(静的テスト) の結果ファイルを DefectDojo に取り込みます。

作成した Engagement に 検査結果(Finding)を登録します。「Import Scan Results」を押下すると登録画面に遷移します。

登録画面で以下の情報を入力・選択します。入力後「Import」を押下することで検査結果が登録されます。

項目
Test Title SonarQube 1 を入力 任意のテストタイトル
Scan type SonarQube Scan を選択 検査ツール
Choose report file findings_over_api_hotspots.json のファイル選択 検査結果の出力ファイル

各検査ツールの結果出力ファイルのテストデータは以下で公開されています。
https://github.com/DefectDojo/django-DefectDojo/tree/2.57.2/unittests/scans

SonarQube で検出された脆弱性が DefectDojo に取り込まれたことが一覧画面から確認できます。

検出された脆弱性を押下することで詳細画面に遷移できます。

API経由で結果をインポート

 DefectDojo にはAPIが用意されているため画面からでなくても診断結果のインポートが可能となっています。そのためCIなどの環境からAPIを利用することで、検出した脆弱性を DefectDojo へ自動的に取り込むことが可能です。

用途別のセキュリティ検査ツールの結果ファイルをAPI経由で取り込んでみます。
(ここで利用している結果ファイルは全て DefectDojo のリポジトリにテストデータとして公開されています。)

Semgrep

SAST(静的テスト)である Semgrep の結果をインポートします。

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Semgrep JSON Report" \
  -F "file=@./unittests/scans/semgrep/repeated_findings.json" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Semgrep repeated_findings.xml"

ZAP

DAST(動的テスト)である ZAP の結果をインポートします。

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=ZAP Scan" \
  -F "file=@./unittests/scans/zap/3_zap_sampl_0_and_different_severities.xml" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Zap 3_zap_sampl_0_and_different_severities.xml"

Nmap

ポートスキャナである Nmap の結果をインポートします。

ポートスキャンの結果:

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Nmap Scan" \
  -F "file=@./unittests/scans/nmap/nmap_multiple_port.xml" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Nmap nmap_multiple_port.xml"

検出脆弱性を含んだ結果:

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Nmap Scan" \
  -F "file=@./unittests/scans/nmap/nmap_script_vulners.xml" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Nmap nmap_script_vulners.xml"

Dependency Check Scan

SCA(ソフトウェア構成分析)である Dependency Check の結果をインポートします。

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Dependency Check Scan" \
  -F "file=@./unittests/scans/dependency_check/multiple_vulnerabilities_has_multiple_findings.xml" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Dependency Check multiple_vulnerabilities_has_multiple_findings.xml"

Trivy Scan

コンテナイメージや設定ファイルの脆弱性スキャナである Trivy の結果をインポートします。

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Trivy Scan" \
  -F "file=@./unittests/scans/trivy/cvss_severity_source.json" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Trivy Scan cvss_severity_source.xml"

Gitleaks Scan

シークレット漏洩検出ツールである Gitleaks の結果をインポートします。

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Gitleaks Scan" \
  -F "file=@./unittests/scans/gitleaks/data_many.json" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Gitleaks data_many.xml"

Prowler Scan

クラウドのセキュリティ設定診断ツールである Prowler の結果をインポートします。

curl -X POST "http://127.0.0.1:8080/api/v2/reimport-scan/" \
  -H "Authorization: Token SECRET_TOKEN" \
  -F "scan_type=Prowler Scan" \
  -F "file=@./unittests/scans/prowler/example_output_aws.ocsf.json" \
  -F "product_name=Sample_Product_1" \
  -F "engagement_name=2026-04-21" \
  -F "auto_create_context=true" \
  -F "test_title=Prowler example_output_aws.ocsf.json"

インポート後の検出一覧画面

DefectDojo の脆弱性検出一覧では以下のように様々なツールを出力が統合されて出力されます。

外部サービスと連携

 DefectDojo は Jira といったチケット管理ツールと連携できるようで、新規脆弱性が検出されたら自動的にチケットを作成するといったことも実現できそうです。

 ですが、OSS版での連携は Jira だけとなっており、GitHub などの他ツールへの連携は有償であるPro版の利用が必要であるとのこと。

OSS版 Pro版
Jira
Azure DevOps ×
GitHub ×
GitLab Boards ×
ServiceNow ×

まとめ

  • DefectDojo を使うことで、SonarQube・Semgrep・ZAP・Nmap・Dependency Check・Trivy・Gitleaks・Prowler といった用途の異なる複数のセキュリティ診断ツールの結果を、単一のダッシュボードで一元管理できる。
  • Docker Compose で手軽に起動でき、API(/api/v2/reimport-scan/)経由でスキャン結果をインポートできるため、CI/CDパイプラインへの組み込みも現実的。
  • チケット管理ツールとの連携については、OSS版では Jira のみ対応しており、GitHub や GitLab Boards などへの連携は Pro版が必要。
  • なお DefectDojo を利用しなくても以下2つの情報は有用である。特に診断結果ファイルのサンプルは、検出時にどのような情報が含まれているのかを知ることができるため診断ツールの選定にも役立てられる。