ネットワークのセキュリティ監査や管理において、定期的なスキャンとその結果の比較は非常に重要です。ネットワーク構成の変更、新たに追加されたデバイス、意図せず開かれたポートなどを把握することは、セキュリティ体制を維持する上で不可欠です。ここで活躍するのが、Nmap スイートに含まれる強力なツール ndiff
です。
このブログ記事では、ndiff
の基本的な使い方から、出力の解釈、さらには具体的な活用シナリオまで、詳しく解説していきます。ネットワークの変化点を効率的に把握し、セキュリティ運用を強化しましょう! 💪
ndiff とは? 🤔
ndiff
は、2つの Nmap スキャン結果 (XML形式ファイル) を比較し、その差分を分かりやすく表示するためのコマンドラインツールです。Nmap は非常に高機能なネットワークスキャナですが、その出力は詳細であるため、複数のスキャン結果を手動で比較するのは困難な作業です。ndiff
はこの比較作業を自動化し、以下のような変更点を明確に示してくれます。
- ホストの状態変化 (例: 起動中から停止へ、またはその逆)
- ポートの状態変化 (例: 開いているポートが閉じられた、またはその逆)
- サービスバージョンの変化 (Nmap の
-sV
オプションで検出) - OS検出結果の変化 (Nmap の
-O
オプションで検出) - Nmap スクリプティングエンジン (NSE) の出力変化
- ホスト名の変化 (リバースDNSなど)
ndiff
は、標準的な diff
ユーティリティと同様に、2つのファイルを比較しますが、Nmap の XML 出力形式に特化しているため、ネットワークスキャンの文脈で意味のある差分を抽出できます。
開発の歴史を少し紐解くと、ndiff
は 2008年の Google Summer of Code プロジェクトとして Michael Pattrick 氏によって開始されました。当初は Perl や C++ で開発されましたが、Windows や Zenmap (Nmap の GUI フロントエンド) との互換性を考慮し、最終的に David Fifield 氏によって Python で書き直されました。Nmap バージョン 4.85BETA1 以降に統合されています。
ndiff の入手方法とインストール
ndiff
は Nmap スイートの一部として提供されています。そのため、Nmap をインストールすれば、通常は ndiff
も一緒にインストールされます。
主要な Linux ディストリビューション (Debian/Ubuntu, Fedora, Kali Linux など) では、パッケージマネージャを使って Nmap をインストールできます。
Debian/Ubuntu/Kali Linux の場合:
sudo apt update
sudo apt install nmap
Kali Linux の場合、ndiff
パッケージは Python 3 と python3-lxml
に依存しています。
Fedora/CentOS/RHEL の場合:
sudo dnf install nmap
Windows や macOS の場合は、Nmap の公式サイトからインストーラーをダウンロードしてインストールするのが一般的です。
インストール後、ターミナルやコマンドプロンプトで ndiff --version
を実行して、バージョン情報が表示されれば正常にインストールされています。
ndiff の基本的な使い方
ndiff
の基本的な構文は非常にシンプルです。比較したい2つの Nmap XML ファイルを指定するだけです。
ndiff <scan1.xml> <scan2.xml>
ここで、<scan1.xml>
は比較元 (古い方) のスキャン結果ファイル、<scan2.xml>
は比較先 (新しい方) のスキャン結果ファイルです。これらのファイルは、Nmap のスキャン時に -oX
オプションを使って生成する必要があります。
Nmap で XML ファイルを出力する例:
# 1回目のスキャン
sudo nmap -sS -A -T4 192.168.1.0/24 -oX scan_before.xml
# (時間が経過した後、または設定変更後に) 2回目のスキャン
sudo nmap -sS -A -T4 192.168.1.0/24 -oX scan_after.xml
上記のようにして生成された scan_before.xml
と scan_after.xml
を比較するには、以下のコマンドを実行します。
ndiff scan_before.xml scan_after.xml
出力の解釈方法
ndiff
のデフォルトの出力形式は、人間が読みやすいテキスト形式です。これは標準的な diff
コマンドの unified 形式に似ており、変更があった行の先頭に記号が付与されます。
-
(マイナス記号): この行は最初のスキャン (scan1.xml
) には存在したが、2番目のスキャン (scan2.xml
) には存在しないことを示します (例: ホストがダウンした、ポートが閉じた)。+
(プラス記号): この行は2番目のスキャン (scan2.xml
) には存在するが、最初のスキャン (scan1.xml
) には存在しなかったことを示します (例: 新しいホストが発見された、新しいポートが開いた)。- (スペース): この行は両方のスキャンで変更がないことを示します (ただし、デフォルトでは変更がない行は表示されません。
-v
オプションで表示可能)。
行が変更された場合 (例: ポートの状態が filtered
から open
に変わった、サービスのバージョンが変わったなど)、通常は -
で始まる古い状態の行と、+
で始まる新しい状態の行が連続して表示されます。
出力例:
-Nmap 7.91 scan initiated Tue Mar 25 10:00:00 2025 as: nmap -sS -oX scan_before.xml 192.168.1.10
+Nmap 7.91 scan initiated Tue Mar 25 11:00:00 2025 as: nmap -sS -oX scan_after.xml 192.168.1.10
192.168.1.10: Host is up.
+192.168.1.15:
+Host is up.
+Not shown: 998 closed ports
+PORT STATE SERVICE
+22/tcp open ssh
+80/tcp open http
192.168.1.20: Host is up.
-PORT STATE SERVICE
-80/tcp open http
-443/tcp filtered https
+PORT STATE SERVICE
+80/tcp open http
+443/tcp open https
+3306/tcp open mysql
この例から読み取れること:
- スキャン実行時刻が異なっています (
-
と+
の Nmap 行)。 +
: IPアドレス192.168.1.15
が新たに出現し、ポート 22 (ssh) と 80 (http) が開いています。-
/+
: IPアドレス192.168.1.20
では、以前はポート 443 (https) がfiltered
状態でしたが、open
状態に変わりました。さらに、新たにポート 3306 (mysql) がopen
状態になりました。
このように、ndiff
はネットワーク上の変化点を一目で把握できるようにしてくれます。
主要なオプション
ndiff
には、出力形式や表示内容を調整するためのオプションがいくつか用意されています。
オプション | 説明 |
---|---|
-h , --help |
ヘルプメッセージを表示して終了します。 |
-v , --verbose |
変更があったホストやポートだけでなく、すべてのホストとポートを出力に含めます。変更がない行は先頭にスペースが付きます。完全な比較を行いたい場合に便利です。 |
--text |
出力形式を人間が読みやすいテキスト形式にします (これがデフォルトです)。 |
--xml |
出力形式を機械が読みやすい XML 形式にします。他のプログラムやスクリプトで ndiff の結果を処理したい場合に便利です。XML 出力は Nmap の XML スキーマをベースにしており、差分を示すための追加要素 (<hostdiff> , <portdiff> , <a> , <b> など) が含まれます。 |
例えば、変更点だけでなく、変更がなかった部分も含めてすべての情報を表示したい場合は、以下のように -v
オプションを使用します。
ndiff -v scan_before.xml scan_after.xml
スクリプトで結果を処理するために XML 形式で出力したい場合は、以下のようにします。
ndiff --xml scan_before.xml scan_after.xml > diff_result.xml
活用シナリオ ✨
ndiff
は様々な場面で役立ちます。
1. 定期的なネットワーク監視
最も一般的なユースケースは、ネットワークの定期的な監視です。毎日、毎週、または毎月 Nmap スキャンを実行し、前回のスキャン結果と ndiff
で比較することで、以下のような変化を迅速に検出できます。
- ネットワークに接続された新しいデバイス(例:不正なデバイスの接続)
- ネットワークから切断された、または応答しなくなったデバイス
- 新たに開かれたポート(例:意図しないサービスの起動、ファイアウォール設定の誤り)
- 閉じられたポート(例:必要なサービスが停止している)
- サービスや OS のバージョンの変化
cron (Linux/macOS) やタスクスケジューラ (Windows) を使って Nmap スキャンと ndiff
の実行を自動化し、差分があった場合に管理者に通知するような仕組みを構築することも可能です。
# 例: 週次スキャンと差分チェックの自動化 (cronの場合)
0 3 * * 0 /usr/bin/nmap -oX /opt/scans/scan_$(date +\%Y\%m\%d).xml 192.168.1.0/24 &> /dev/null
5 3 * * 0 /usr/bin/ndiff /opt/scans/scan_$(date -d '1 week ago' +\%Y\%m\%d).xml /opt/scans/scan_$(date +\%Y\%m\%d).xml | mail -s "Weekly Network Changes" admin@example.com
2. セキュリティ監査と変更管理
セキュリティ監査の一環として、特定時点でのネットワーク状態を記録し、後の監査で比較することができます。また、ファイアウォールのルール変更、サーバー設定の変更、新しいアプリケーションのデプロイなど、計画的な変更を行った際に、変更前後のスキャン結果を ndiff
で比較することで、変更が意図通りに行われたか、予期せぬ副作用が発生していないかを確認できます。
3. 侵入テスト (ペネトレーションテスト)
侵入テストの初期段階で行う情報収集 (リコネサンス) において、複数回のスキャン結果を比較することで、ターゲット環境の変化を捉えることができます。例えば、テスト中に新たに有効になったサービスや、設定が変更された箇所を発見する手がかりになることがあります。
4. トラブルシューティング
ネットワークやサービスの接続問題が発生した場合、問題発生前と発生後のスキャン結果を比較することで、原因究明の手がかりを得られることがあります。例えば、特定のポートが閉じてしまった、ホストが応答しなくなったなどの変化が確認できるかもしれません。
5. Zenmap での利用
Nmap の公式 GUI フロントエンドである Zenmap では、保存されたスキャン結果を視覚的に比較する機能があり、内部的に ndiff
が利用されています。GUI で操作したい場合は Zenmap を使うのも良い選択肢です。
注意点とヒント 💡
-
XML 出力は必須:
ndiff
は Nmap の XML 出力 (-oX
) を比較対象とします。他の形式 (ノーマル出力-oN
, grepable 出力-oG
など) は使用できません。 -
スキャンオプションの一貫性: 比較する2つのスキャンは、できるだけ同じ Nmap オプションを使用して実行することが推奨されます。異なるオプションを使用すると (例: 片方だけで
-F
(Fast scan) を使う、スキャンするポート範囲が違うなど)、意図しない差分が多く検出される可能性があります。もちろん、オプションの違いによる結果の変化を見たい場合は、意図的に異なるオプションでスキャンすることもあります。 -
大規模ネットワークでの利用: 非常に大規模なネットワークのスキャン結果 (多数のホストやポートを含む XML ファイル) を比較する場合、
ndiff
の処理に時間がかかったり、メモリを多く消費したりする可能性があります。 - 動的 IP 環境: DHCP などで IP アドレスが頻繁に変わる環境では、IP アドレスに基づいた比較だけでは変化点を正確に捉えられない場合があります。ホスト名や MAC アドレスなど、他の情報も考慮に入れる必要があるかもしれません (Nmap のスキャンオプションでこれらの情報を取得するように設定します)。
-
ノイズの考慮: ネットワークの状態は常に変動する可能性があります (例: 一時的な遅延によるポート状態の変化、OS 検出のわずかな違いなど)。
ndiff
の結果を解釈する際には、ある程度の「ノイズ」が含まれる可能性があることを考慮し、重要な変化点に焦点を当てることが重要です。
まとめ
ndiff
は、Nmap スキャン結果の比較を効率化し、ネットワーク上の変化点を明確に把握するための非常に便利なツールです。定期的なネットワーク監視、セキュリティ監査、変更管理、トラブルシューティングなど、様々な場面でその力を発揮します。
Nmap と ndiff
を組み合わせることで、ネットワークの状態変化に対する可視性が向上し、より迅速かつ的確な対応が可能になります。ぜひ、日々のネットワーク管理やセキュリティ運用に ndiff
を活用してみてください。🚀
Ndiff Reference Guide: https://nmap.org/book/ndiff-man.html
コメント