
ローカルホスト型・エアギャップ対応のVAPTプラットフォームで、8つの並列スキャンモジュールを実行し、CVSS v3.1に基づいて発見事項を決定的にスコアリングし、ローカルLLMによるAI生成の修復アドバイス(オプション)付きのPDFレポートを生成します。
Built by maverickaayush.
ローカルでホストされ、エアギャップ環境でも動作するVAPTツール:認可済みのターゲットドメインを指定すると、8つのスキャンモジュールを並列実行し、すべての発見事項を決定的にスコアリング(CVSS v3.1)し、オプションでローカルLLMによる平易な英語の説明を追加し、PDFレポートとライブWebダッシュボードを生成します。外部API呼び出しは一切なし - すべてがお客様自身のネットワーク上で動作します。
ONUSの2つの実行方法:
- セルフホスト(このリポジトリ):
docker compose up→ ドメインを入力 → 認可チェックボックスにチェック → スキャン。アカウント登録もサインインもメール認証も不要 - シングルオペレーター運用を前提としており、以下のすべてはこの経路を対象にしています。- ホスト型: マネージドインスタンスが tryonus.tech で稼働中です。プロダクション専用機能(アカウント / OAuthサインイン、スキャンキュー、ユーザーごとの履歴)が追加されており、これらはこのリポジトリではデフォルトでオフになっているため、セルフホストはシンプルなままです。セルフホストとホスト型の比較 を参照してください。
セルフホストのデフォルト経路は意図的にシンプルになっています:サインアップもメール認証もOAuthも不要。ホスト型専用機能(認証、スキャンキュー)はデフォルトでオフになる設定フラグの背後にあり(REQUIRE_AUTH=false、HOSTED_QUEUE_ENABLED=false。設定 を参照)、docker-compose.yml には設定されていません - つまり、ONUSをローカルで実行してもログインの背後に置かれることはありません。ゼロセットアップをお好みですか?tryonus.tech のホスト型サイトをご利用ください。
| 新規スキャン | ライブスキャン状況 |
|---|---|
![]() | ![]() |
| レポートダッシュボード | スキャン発見 |
|---|---|
![]() | ![]() |
domain → [recon | webscan | ssl_tls | headers | owasp | tech_fingerprint | nuclei | enumeration] (parallel, Celery)
→ any module failed/timed out? → pause for operator retry/continue/cancel
→ aggregator (dedup + OWASP-map + sort)
→ confidence verification (passive re-observation)
→ deterministic CVSS scoring
→ Ollama (Qwen 2.5 7B) AI analysis
→ WeasyPrint PDF + PostgreSQL
→ dashboard / PDF download
6つのレイヤー:Next.jsフロントエンド → FastAPI → Celery/Redis → 8つの並列スキャンモジュール → Ollama(Qwen 2.5 7B)→ WeasyPrint PDF + ダッシュボード。詳細は ARCHITECTURE.md(スキーマ、契約、ガードレール)と docs/QUICK_REF.md(一般的な変更のためのクイックリファレンス)を参照してください。
mem_limit: 4g)、Postgres、Redis、API、ワーカー、フロントエンドが並行して動作します。上記の前提条件を参照:約8GBのディスクと約6GBのRAMが必要で、初回ビルドには10〜15分かかります。
cp .env.example .env
cp backend/subfinder-config/provider-config.yaml.example backend/subfinder-config/provider-config.yaml
docker compose up -d
docker compose ps # wait for zap to report healthy (~2 min)
http://localhost:3000 を開き、ドメインを入力し、認可チェックボックスにチェックを入れて、スキャンを開始します。
サインインもサインアップもメール認証も不要。 セルフホスト版ONUSはデフォルトでシングルオペレーター用です - ダッシュボードを開いてからスキャンするまでの間にアカウント手順はありません。
Ollamaをインストールしなくても動作します。 CVSS/深刻度/優先度のスコアリングは常に決定的です(analysis/cvss_scorer.py)- Ollamaが動作していない場合、発見事項にはAI生成の説明文ではなくルールベースの説明テンプレートが適用されます。これを有効にするには、下記の「オプション:AI生成の説明文を有効にする」を参照してください。
このツールの実行にAPIキーは一切不要です。 ラップされているすべてのスキャンツール(nmap、ZAP、Nikto、testssl.sh、Nuclei、Amass、Naabu、httpx、WhatWeb、WAFW00F、FFUF)とOllama自体が、キーなしで動作します。上記のsubfinder設定コピー手順が唯一の任意の例外です - 空のテンプレートのままでも問題なく、subfinderはフリー/パブリックソースのみで実行されます。サブドメイン列挙を強化するには、開始前にそのファイルに最大2つの無料ティアキーを追加できます:GitHubパーソナルアクセストークンと ProjectDiscovery Chaos APIキー - provider-config.yaml.example 内のコメントを参照してください。
Ollamaはホスト上でネイティブに(Docker内ではなく)実行されるため、ホストのGPUを直接使用できます。コンテナは host.docker.internal を介して接続します。
ollama pull qwen2.5:7b127.0.0.1 のみにバインドされており、Dockerのブリッジネットワークからは到達できません):
sudo systemctl edit ollama
[Service] セクションに追加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload && sudo systemctl restart ollama
curl http://localhost:11434/api/tagsdocker compose restart backend workercomposeファイルには、独自の認可済みターゲットを用意しなくてもスキャナーを試せるように、意図的に脆弱な12の練習用アプリ(Juice Shop、DVWA、bWAPP、Mutillidae、NodeGoat、ModSecurity WAFの背後にあるDVWP/WordPress、Metasploitable2、WebGoat)も定義されています。これらはComposeプロファイルの背後にあり、デフォルトではビルド/起動されません:
docker compose --profile targets up -d
警告:これらは意図的に脆弱で、中には実際にバックドアが仕込まれたサービスもあります(Metasploitable2には稼働中のvsftpdバックドアが含まれています)。targets プロファイルは、インターネットや共有ネットワークから到達できないマシンでのみ実行してください - パブリッククラウドインスタンスや露出したホストでは絶対に実行しないでください。
これらのほとんどはプリビルドイメージから実行され、追加のものは不要です。nodegoat と dvwp-wordpress の2つは、このリポジトリにベンダリングされていないソースからビルドされるため、最初にクローンする必要があります:
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
起動後の公開ポート:Juice Shop :3001、DVWA :8081、bWAPP :8083、Mutillidae :8084、NodeGoat :8085、DVWP(WAF経由、TLS):8444、WebGoat :8082。Metasploitable2はホストポートを公開しません(実際のバックドア付き/未認証のネットワークサービスを公開するため、Dockerの内部ネットワーク経由で backend/worker からのみ到達可能)。
.env(.env.example からコピー)で設定する環境変数:
上記の POSTGRES_PASSWORD/SECRET_KEY のデフォルトはデモ用のみです - ローカル/個人インスタンスでは問題ありませんが、他の誰かが到達できる場所にデプロイする前に両方を変更してください。これは単なる推奨ではなく、強制されるようになりました:ONUS_ENV=production を設定するか(またはホスト型認証をオンにすると)、どちらかがデフォルト/プレースホルダーのままの場合、バックエンドは起動を拒否します。強力なキーは python -c "import secrets; print(secrets.token_urlsafe(48))" で生成してください。
ホスト型専用機能はデフォルトでオフです。 REQUIRE_AUTH(アカウント / OAuthサインイン)と HOSTED_QUEUE_ENABLED(スキャンキュー)はどちらもデフォルトで false で、docker-compose.yml には設定されていないため、セルフホスト版ONUSがログインやキューの背後に置かれることはありません。意図的にマルチユーザーのホスト型デプロイを構築する場合を除き、オフのままにしてください - これらをオンにしているのはマネージドの tryonus.tech インスタンスだけです。
ONUSにはデフォルトでアナリティクスはありません - 何も読み込まれず、ブラウザからデータが送信されることもありません。お客様自身のデプロイで匿名の製品使用状況メトリクスを収集するには、Google Analytics 4のMeasurement IDを1つ設定します:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
これはフロントエンドのビルド時変数なので、フロントエンドのビルド環境で設定します(Vercel/ホストの環境変数、またはローカルの npm run build の場合は frontend/.env.local)。設定すると、GAは本番ビルドでのみ読み込まれ、ページビューといくつかの製品イベント(例:scan_started、scan_completed、report_downloaded)を追跡します。カスタムイベントは frontend/lib/analytics.ts の型付きヘルパーを使用します - trackEvent('scan_started')。
プライバシー: 匿名でカーディナリティの低い使用状況イベントのみが送信されます - スキャンしたドメイン、スキャン結果、発見事項、レポート内容、認可状態、個人データは決して送信されません。NEXT_PUBLIC_GA_ID を未設定のままにしておくと、ONUSはこれまでとまったく同じように動作します。アナリティクスは完全にオプトインです。
FastAPIはインタラクティブなSwaggerドキュメントを自動生成します - バックエンドが起動したら、http://localhost:8000/docs を開いてください。
docker compose down
docker compose logs -f backend worker
pip install -r backend/requirements-dev.txt
pytest backend/tests
本稿執筆時点で655件の自動化バックエンドテストがあります。単体/統合テストスイートに加えて、ツールは開発中にエンドツーエンドで実際に使用されています:9つの意図的に脆弱な練習用アプリケーション(DVWA、Juice Shop、Mutillidae、NodeGoat、bWAPP、WebGoat、Metasploitable2、WAFの背後にあるDVWP/WordPress)と1つの認可済みパブリックターゲット(testphp.vulnweb.com)に対して、79件の実スキャンが実行され、124件のPDFレポートが生成されました - 仮定の数字ではありません。明示的にテストを認可されたターゲットのみをスキャンしてください - 開発中に使用した練習用ターゲットについては docs/test_findings.md を参照してください。
ARCHITECTURE.md - 完全なアーキテクチャ、スキーマ、および変更が絶対に壊してはならない契約事項。重要な変更を行う前にこれを読んでください。docs/QUICK_REF.md - 実行コマンド、フォルダの役割、「この変更はどこで行うか」。docs/scanners.md - 各スキャンモジュールのタイミング/フラグ設計の根拠。docs/ai.md - Ollamaのタイムアウト/コンテキスト調整、スコアリングをLLMから完全に移行した理由。docs/docker.md - Dockerの逸脱に関する注意点とビルドの落とし穴。docs/troubleshooting.md - 任意のモジュール/ステージを単独で手動テストする方法。docs/roadmap.md - 歴史的なビルド順序(ビルドは完了済み)。CONTRIBUTING.md - 開発環境のセットアップ、テスト、PRの期待事項。MIT - LICENSE を参照してください。
明示的な書面による認可なしにターゲットをスキャンすることは、IT法2000(インド)および同等の国際法規に違反します。このツールはすべてのスキャンで認可の確認を必須とし、説明責任のためオペレーターとタイムスタンプを記録します。
| セルフホスト(このリポジトリ) | ホスト型(tryonus.tech) |
|---|
| セットアップ | docker compose up | 不要 - サイトを開くだけ |
| サインイン | なし - シングルオペレーター | アカウント / Google / GitHub OAuth |
| スキャンフロー | ドメイン → 認可チェックボックス → スキャン | サインイン後に同じ |
| 追加機能 | - | スキャンキュー、ユーザーごとの履歴、ホスト型メール |
| 実行環境 | お客様自身のネットワーク、エアギャップ | マネージドクラウド |
| 変数 | デフォルト | 目的 |
|---|
POSTGRES_PASSWORD | vapt_secure_2025 | データベースのパスワード |
SECRET_KEY | change_me_to_a_long_random_string | バックエンドのシークレットキー |
ALLOWED_HOSTS | localhost,127.0.0.1 | FastAPIの許可ホスト |
OLLAMA_URL | http://host.docker.internal:11434 | バックエンド/ワーカーがOllamaに到達する場所 |
SCAN_TIMEOUT_MULTIPLIER | 1.5 | 各モジュールのツール/Celeryタイムアウトをスケーリング - 実世界のターゲットはラボのターゲットより遅いため、ラボ調整済みのタイミングには 1.0 に下げます |
MAX_CONCURRENT_SCANS | 3 | 並行スキャンの上限(リソース枯渇/ターゲットへのポライトネス保護、DB接続プールのサイズも決定) |
ONUS_ENV | development | development(セルフホストのlocalhost - 弱いシークレットは警告のみ)または production(弱い SECRET_KEY/Postgresパスワードは起動失敗となる) |