なぜ手動監査はスケールしないのか
新しいLinuxサーバーを立ち上げるのは気分が良いものですが、最初のセキュリティ監査に直面した瞬間にその喜びは冷めてしまいます。ある日の深夜、わずか数時間の間に5,000回以上のSSHログイン試行が失敗しているログを見てから、私は運に頼るのをやめました。手動での監査は非常に過酷です。管理するマシンが2〜3台を超えると、ヒューマンエラーは単なる可能性ではなく、数学的な必然となります。だからこそ、私はNucleiを日常の技術スタックに統合しました。
Nucleiは、HTTP、DNS、TCPなどのプロトコルを介してリクエストを送信する、高速なテンプレートベースのスキャナーです. 複雑なUIに翻弄される重厚なエンタープライズツールとは異なり、Nucleiはセキュリティを「コード」として扱います。コミュニティによって支えられており、新しいCVE(共通脆弱性識別子)が発表されてから数時間以内に脆弱性テンプレートがリリースされることも珍しくありません。現在、このプロジェクトには、単純なバージョンチェックから複雑なマルチステップの脆弱性攻撃まで、7,000以上の検証済みテンプレートが用意されています。
クイックスタート:5分以内に最初のスキャンを実行する
LinuxマシンへのNucleiの導入は非常に簡単です。Go言語で書かれているため、ポータブルな単一のバイナリとして動作します。
ステップ1:インストール
すでにGoのツールチェーンが設定されているシステムでは、以下のコマンドを使用します:
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei @latest
より直接的な方法を好む場合は、公式のスクリプトが面倒な作業を代行してくれます:
curl -sL https://raw.githubusercontent.com/projectdiscovery/nuclei/master/install.sh | bash
ステップ2:テンプレートライブラリの同期
Nucleiの賢さはテンプレートに依存します。最新のコミュニティ検証済みチェック項目をダウンロードするには、以下を実行します:
nuclei -update-templates
ステップ3:スキャンの実行
ツールをドメインまたはIPに向けて、明らかな脆弱性を探します:
nuclei -u http://your-server-ip.com
出力結果は深刻度(Severity)ごとに色分けされます。サーバーが機密情報を漏洩させていないか、あるいは「Medium(中)」、「High(高)」、「Critical(緊急)」とマークされた古いソフトウェアを実行していないかが、すぐに判明します。
仕組みを理解する:テンプレートとロジック
Nucleiの本当の強みは、その透明性にあります。従来の技術スキャナーは「ブラックボックス」であることが多いですが、Nucleiでは任意のYAMLファイルを開いて、テストがどのように機能するかを正確に確認できます。各テンプレートは、特定のリクエストと、レスポンス内の脆弱性を特定する「マッチャー(matcher)」を定義しています。
チェック内容の分析
~/nuclei-templates/ ディレクトリに移動して、cves や exposed-panels などのカテゴリを調べてみましょう。典型的なチェック内容は以下のようになっています:
id: exposed-git-directory
info:
name: 露出したGitディレクトリ
severity: medium
requests:
- method: GET
path:
- "{{BaseURL}}/.git/config"
matchers:
- type: word
words:
- "[core]"
このシンプルなロジックにより、自社の特定のポリシーに合わせたカスタムルールを数分で作成できます。公開されているバグをスキャンするだけでなく、独自のアーキテクチャ標準を強制することも可能です。
スマートなフィルタリング
毎回7,000以上のテストを実行するのは過剰です。重大なリモートコード実行(RCE)の欠陥のみに関心がある場合は、深刻度タグを使用します:
nuclei -u https://example.com -severity critical,high
特にサーバーの要塞化(ハードニング)を監査したい場合は、設定ミスのディレクトリをターゲットにします:
nuclei -u https://example.com -t misconfiguration/
高度なワークフロー:プロのように自動化する
手動コマンドはテストのためのものです。プロフェッショナルな環境には自動化が必要です。私はシンプルなcronジョブを使用して毎週スキャンを実行し、結果をチームに転送しています。
複数のターゲットの処理
社内IPやステージング用のサブドメインを多数管理している場合は、それらを targets.txt にリストアップします:
nuclei -l targets.txt -o results.txt
データパイプライン用のJSON出力
本格的なレポート作成には、検出結果をJSON形式でエクスポートします。これにより、jq を使用して結果をフィルタリングしたり、中央のダッシュボードにデータを供給したりできます。
nuclei -u https://example.com -json -o results.json
CI/CDの統合
NucleiをGitHub Actionsに統合することで、すべてのデプロイが本番環境に反映される前にスキャンされるようになります。これにより、ステージング環境の脆弱性が本番環境に到達する前にキャッチできます。基本的なステップは以下の通りです:
- name: Nucleiスキャンの実行
uses: projectdiscovery/nuclei-action @main.py
with:
target: https://example.com
実践的な運用のためのヒント
データは重要ですが、ノイズは敵です。数十の本番環境でNucleiを運用してきた経験から、 「セキュリティ疲れ」を避けるために以下の調整をお勧めします:
- ハードウェアへの配慮: Nucleiは非常に高速です。デフォルト設定では、小規模な1vCPUのVPSを簡単に圧倒してしまう可能性があります。
-rate-limit 10を使用して、CPU使用率を抑えてください。 - 誤検知(False Positives)の除外: 特定のテンプレートがスタック上で誤報を発する場合は、
.nuclei-ignoreファイルに追加してレポートをクリーンに保ちます。 - 帯域外(Out-of-Band)検出: Log4jのような一部のバグは、標準的なレスポンスには現れません。Nucleiは
interactshを使用して、これらの「ブラインド」脆弱性を自動的にキャッチします。 - 毎日の更新: 毎朝
nuclei -update-templatesを実行するようにcronジョブを設定してください。これにより、わずか数時間前に発見されたエクスプロイトに対しても保護されます。
インフラセキュリティは常に変化する目標です。スキャンを自動化することで、後手に回るのをやめ、自信を持って構築を開始できます。データが消えたという午前3時の通知を待つよりも、ロボットに裏口をチェックさせる方がはるかに賢明です。

