本記事は、オープンソースAIペンテストツールNebulaの基本から応用までを徹底解説します。セットアップ手順、端末操作の流れ、CI/CDへの組み込み、プラグイン開発、さらにはチーム運用のノウハウまで、これ一つで網羅。AI時代のセキュリティ担当者必読の永久保存版です。
目次
- 1. Nebulaとは何か?
- 2. 機能詳細とアーキテクチャ
- 3. インストールと初期セットアップ
- 4. 基本的な使い方:ChatOpsスタイルで操作
- 5. 自律モードによる完全自動ペンテスト
- 6. Flask+Reactで作る社内スキャンプラットフォーム
- 7. GitHub Actions連携:夜間定期スキャンの自動化
- 8. モデルチューニングとマルチモデル比較
- 9. チーム運用とPenTestOps
- 10. ケーススタディ:実践レポート作成の自動化
- 11. FAQ:よくある質問と回答
- 12. まとめと今後の展望
- 付録A:Mermaid図で見るフロー全体像
- 付録B:サンプルコード全文
Nebulaとは何か?
AIとセキュリティの融合が進む現代、Nebulaは革新的なアプローチでペンテストを自動化します。AI搭載のペネトレーションテスト支援ツールとして、従来の手動スキャンや手作業によるレポート作成を劇的に短縮し、組織のセキュリティ評価を迅速化。Berylliumチームが開発・公開し、オープンソースとしてコミュニティに貢献しています。AIがReconから脆弱性検出、簡易的なエクスプロイト試行まで自律的に実行し、ログや発見事項を詳細に記録。セキュリティ実務者の業務負荷を大幅に軽減するとともに、ペネトレーションテストの品質を担保します。
機能詳細とアーキテクチャ
Nebulaは大規模言語モデル(LLM)と実在のペンテストツール群をシームレスに統合。Nmap、crackmapexec、OWASP ZAP、Niktoなどをバックエンドで連携し、LLMがコマンド出力を解釈して次のアクションを判断。CLIベースの操作ながら、自然言語コマンドでステップを指示可能。自律モードではRecon→スキャン→簡易認証試行→レポート生成までをワンストップで実行します。アーキテクチャはCLI+Pythonスクリプト+プラグイン機構で構成され、ユーザーはモデルやプラグインを追加・カスタマイズすることで、独自要件に柔軟に対応できます。
インストールと初期セットアップ
まずはPython環境を用意。推奨はPython 3.8以上。仮想環境を作成し、Nebulaをインストールします。
python3 -m venv nebula-env
source nebula-env/bin/activate
pip install --upgrade pip
pip install nebula-ai
初回実行時にLLMモデルをダウンロード。GPU・CPUモードを選択し、数GBのモデルデータを取得します。
基本的な使い方:ChatOpsスタイルで操作
CLIに「!」付きの自然言語コマンドを入力すると、対応するペンテストツールを実行。
nebula !
enumerate 192.168.1.10
NebulaがNmapスキャンをバックグラウンドで実施し、結果を解析して次のアクションを提案。続けて!
nebula !
find vulnerabilities on http://192.168.1.10
このように対話的に進めるだけで、Reconから脆弱性検出、簡易エクスプロイト試行までがスムーズに連鎖します。
自律モードによる完全自動ペンテスト
自律モードを有効化すると、許可範囲内でRecon→スキャン→簡易エクスプロイト→レポート生成までを自動実行。
nebula --autonomous-mode !
enumerate corp-net.example.com
自動実行ロジックはAIが判断し、最適なツールをシーケンシャルに呼び出します。人手介入ゼロでも最初から最後まで完結。
Flask+Reactで作る社内スキャンプラットフォーム
Webアプリに組み込む場合は、以下のアーキテクチャがおすすめ。
flowchart LR
subgraph Backend
A[Nebula CLI] --> B[Scan Service (Flask)]
B --> C[(Results DB)]
B --> D[Task Queue (Redis+RQ)]
end
subgraph Frontend
E[React + MUI Dashboard]
end
A --- B
B --- E
B --- F[Slack/Webhook]
バックエンドはFlask+RQ、フロントはReact+Material‑UI。Scan ServiceがNebula CLIをサブプロセスで呼び出し、WebSocketで進捗をプッシュ。
GitHub Actions連携:夜間定期スキャンの自動化
CI/CDに組み込む例(GitHub Actions):
name: Pentest Nightly
on:
schedule:
- cron: '0 2 * * *'
jobs:
pentest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: |
pip install nebula-ai
nebula --autonomous-mode ! enumerate prod.example.com
- name: Upload Reports
uses: actions/upload-artifact@v3
with:
name: pentest-reports
path: engagements/
定期実行で常に最新の脆弱性状況を社内に共有できます。
モデルチューニングとマルチモデル比較
Nebulaは複数のLLMをサポート。モデルによって出力品質が変化するため、用途に応じて選択可能。
nebula --model llama‑3.1‑8B‑Instruct ! enumerate target
nebula --model mistralai/Mistral-7B-Instruct-v0.2 ! enumerate target
複数モデルでスキャン結果を比較し、誤検知や見落としを減らす手法を紹介します。
チーム運用とPenTestOps
組織で運用する際のポイント:
- エンゲージメント管理:プロジェクトごとにフォルダ分け
- ログ・レポート共有:WikiやConfluenceに自動投稿
- Slack/Webhook連携:検出通知を即時配信
- 自動チケット起票:JIRA/GitHub Issuesへの連携
- 定性調査とのハイブリッド:AIで拾えないポイントは人手対応
PenTestOpsとして、ナレッジベースの整備や振り返りミーティングの自動スケジューリングまで含めた運用を提案します。
ケーススタディ:実践レポート作成の自動化
実際の検証結果をMarkdown形式で自動生成し、PandocでPDF化するワンライナー例:
pandoc engagements/CorpNet-*/notes.md -o report-$(date +%F).pdf
発見事項にはAIが注釈を付与済みで、コメントを手直しするだけで即時提出可能。
FAQ:よくある質問と回答
- Q: Nebulaは完全自動で安全ですか?
A: AI誤解釈リスクがあるため、最初は監督運用推奨。 - Q: 商用利用ライセンスは?
A: オープンソースMITライセンス。商用も可。 - Q: モデル変更はどこまで可能?
A: HuggingFace上のInstruct系モデルなら自由に指定可能。 - Q: チームでの同時実行は?
A: Nebula Pro版が並列実行・エンゲージメント共有機能を提供。
まとめと今後の展望
NebulaはAI技術を活用し、ペネトレーションテストの自動化を次のレベルへ引き上げるツールです。今後はLLMの高度化やリアルタイム協調機能、攻撃シミュレーション精度のさらなる向上が期待されます。本記事の手法をベースに、自社環境に合わせた最適化をぜひお試しください。
おまけ:次世代AIペンテストプラットフォーム構築
1. 全体アーキテクチャ設計

- Nebula CLI
- Scan Service (Flask)
- Python+FlaskでREST/WebSocket APIを提供し、バックグラウンドでNebula CLIを
subprocess
呼び出し。 - 進捗はリアルタイムでフロントエンドにプッシュ可能。
- Python+FlaskでREST/WebSocket APIを提供し、バックグラウンドでNebula CLIを
- Results DB
- スキャン結果・注釈ログを構造化して保存。PostgreSQLやSQLiteがシンプルで扱いやすい。
- Task Queue
- RQ(Redis Queue)などでジョブを非同期実行し、長時間実行でもWebサーバーをブロックしない。
- Frontend (React + Material‑UI)
- ダッシュボードからターゲット登録、スキャン状況確認、レポート閲覧が可能。
- WebSocketでログ/進捗をストリーミング表示。
- CI/CD & Alerts
- GitHub ActionsやGitLab CIに組み込み、夜間定期スキャンを自動化 Beryllium。
- SlackやTeamsへの通知もWebhookでシンプルに実装。
2. 実装例:FlaskによるScan Service
# app.py
import os, subprocess, uuid
from flask import Flask, request, jsonify
from flask_socketio import SocketIO, emit
from rq import Queue
from redis import Redis
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")
redis_conn = Redis()
task_queue = Queue(connection=redis_conn)
NEBULA_CMD = "nebula" # CLIコマンド名
def run_scan(job_id, target):
"""バックグラウンドでNebulaスキャンを実行し、進捗をSocketIOで通知。"""
cmd = [NEBULA_CMD, "--autonomous-mode", "!", f"enumerate {target}"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)
for line in proc.stdout:
socketio.emit(f"scan_progress_{job_id}", {"line": line.strip()})
proc.wait()
socketio.emit(f"scan_done_{job_id}", {"status": proc.returncode == 0})
@app.route("/api/scan", methods=["POST"])
def start_scan():
data = request.get_json()
target = data.get("target")
job_id = str(uuid.uuid4())
task_queue.enqueue(run_scan, job_id, target)
return jsonify({"job_id": job_id}), 202
if __name__ == "__main__":
socketio.run(app, host="0.0.0.0", port=5000)
- ポイント
task_queue.enqueue
で非同期にスキャンを実行。SocketIO
でクライアントにリアルタイムにログをプッシュ。- 成果物(ログ・レポート)はあらかじめ決めたディレクトリに保存し、DBにメタ情報を登録しておくと良いでしょう。
3. フロントエンド例:リアルタイムダッシュボード
// ScanDashboard.jsx
import React, { useState, useEffect } from "react";
import io from "socket.io-client";
import { Button, TextField, List, ListItem } from "@mui/material";
export default function ScanDashboard() {
const [target, setTarget] = useState("");
const [logs, setLogs] = useState([]);
const [jobId, setJobId] = useState(null);
const socket = io("http://localhost:5000");
const startScan = async () => {
const res = await fetch("/api/scan", {
method: "POST",
headers: { "Content-Type":"application/json" },
body: JSON.stringify({ target })
});
const { job_id } = await res.json();
setJobId(job_id);
setLogs([]);
socket.on(`scan_progress_${job_id}`, data => {
setLogs(prev => [...prev, data.line]);
});
socket.on(`scan_done_${job_id}`, data => {
setLogs(prev => [...prev, data.status ? "完了" : "エラー"]);
});
};
return (
<div>
<TextField label="ターゲット" value={target} onChange={e => setTarget(e.target.value)} />
<Button variant="contained" onClick={startScan}>スキャン開始</Button>
<List>
{logs.map((line, idx) => <ListItem key={idx}><code>{line}</code></ListItem>)}
</List>
</div>
);
}
- Material‑UI(MUI)でシンプルに構築。
- WebSocketでログ行を逐次受信し、リスト表示。
4. 拡張アイデア・高度化
- 結果の自動解析 & レポート生成
- NebulaのAIノート(
notes.md
)をMarkdown→HTML/PDFに変換し、社内ポータルに配信。
- NebulaのAIノート(
- マルチモデル比較
nebula --model mistralai/Mistral-7B-Instruct-v0.2
など複数モデルでスキャンを走らせ、検出結果の違いを可視化 GitHub。
- プラグイン機構
- スキャン後に社内独自ツール(例:SAST/DASTエンジン)をAPI連携。
- 自動チケット起票
- 脆弱性検出時にJIRAやGitHub Issuesを自動で作成し、開発フローに組み込む。
- ダッシュボード分析
- 各エンゲージメントのスコアリング(CVSSや社内基準)をDBに保持し、時系列で可視化。
これらを組み合わせることで、Nebulaを“単なるCLI”から、エンタープライズレベルのAI駆動型ペンテストプラットフォームへと昇華させることができます。