深夜2時。本番環境アラート。原因不明のトラフィック急増。
監視ダッシュボードが一斉に点灯する。サーバーから不審なアウトバウンド接続が発生している。何が待ち受けていて、何が外部に露出していて、トラフィックがどこに向かっているのか、まったくわからない。最初に取る行動は?Nmapを起動することだ。
まったく同じ状況を、私は何度も経験してきた。答えにたどり着く最速の手段が、何が開いていて、何が動いていて、何があってはならないかを正確に把握することだったインシデントで、冷や汗をかきながら対処してきた。Nmapは毎回、何時間もの推測作業を省いてくれた。
このガイドでは、私が実際に使っている方法でNmapを解説する。プレッシャーのかかる現場で、本物のコマンドを使い、素早い判断に必要なコンテキストを添えて。
現実の問題:何が外部に露出しているかわからない
ほとんどのセキュリティインシデントは同じように始まる。「このサーバーで開いているポートは何か?」と誰かが尋ねるが、明確な答えが返ってこない。チーム間でサーバーが引き継がれていたのかもしれない。開発者が深夜のデプロイ中に docker run -p 0.0.0.0:5432:5432 を実行して、そのまま忘れていたのかもしれない。別の設定でサービスが再起動されていたのかもしれない。
可視性がなければ、手探りで飛んでいるようなものだ。攻撃者があなたの担当アドレス空間を積極的にスキャンしているなか、何も見えない状態は危険すぎる。
これは技術的な失敗ではなく、プロセスの欠如だ。誰も攻撃対象領域をマッピングしていなかった。Nmapはそれを数分で解決する。
Nmapが実際に行うこと
Nmap(Network Mapper)は、ターゲットに細工したパケットを送信し、その応答を解析する。応答から、どのポートが開いているか、どのサービスが動作しているか、どのOSがインストールされているか、既知の脆弱性が存在するかを推定する。
ほぼすべてのワークフローで登場するスキャン技術が3つある:
- TCP SYNスキャン(-sS) — SYNを送信してSYN-ACKを待つ。ハンドシェイクを完了させない。高速でステルス性が高く、rootで実行する際のデフォルト。
- TCP Connectスキャン(-sT) — 完全なTCPハンドシェイクを完了させる。低速で検出されやすいが、root権限なしで動作する。
- UDPスキャン(-sU) — 低速で信頼性に欠けるが、DNS(ポート53)、SNMP(161)、TFTP(69)など、UDPでのみ動作するサービスには不可欠。
違いを理解することで、特定のネットワークでどれだけのノイズを出してもよいかが決まる。
手法の比較:基本スキャン vs. フル監査
オプション1:クイックポートチェック(高速・低ノイズ)
ポートが開いているか閉じているかを確認するだけでよい場合:
# 上位1000ポートをスキャン(デフォルト)
nmap 192.168.1.10
# 特定のポートをスキャン
nmap -p 22 192.168.1.10
# ポート範囲をスキャン
nmap -p 1-1024 192.168.1.10
# 全65535ポートをスキャン
nmap -p- 192.168.1.10
「開いているかどうか」の答えが30秒以内に得られる。無駄なし、余計なノイズなし。
オプション2:サービスとバージョン検出(より詳細なコンテキスト)
開放ポートだけでは、ほとんど何もわからない。重要なのは、そのポートで何が動いていて、どのバージョンかだ。古いバージョンは既知のCVEを意味し、既知のCVEは実際に動くエクスプロイトを意味する。
# 開放ポートのサービスバージョンを検出
nmap -sV 192.168.1.10
# アグレッシブ検出と組み合わせる(より正確だがノイズが増える)
nmap -sV --version-intensity 5 192.168.1.10
バージョン検出は、私が使ってきたどのツールよりも多くの「なぜこのサーバーは変な動作をするのか」という問題を発見してきた。ポート6379で認証なしで動作する設定ミスのRedis — バージョン文字列がRedis 4.0.9として返ってきて、インターネットに露出し、パスワードが設定されていない。これは即座にクリティカルな発見だ。
オプション3:OS検出とフルフィンガープリント
# OS検出(root/sudo権限が必要)
sudo nmap -O 192.168.1.10
# フルアグレッシブスキャン:バージョン、OS、スクリプト、トレースルート
sudo nmap -A 192.168.1.10
-Aは何でもありのオプションだ。バージョン検出、OS推定、デフォルトNSEスクリプト、トレースルート — すべてを一度に実行する。騒々しいが徹底的。自分が所有しているが完全にドキュメント化していないマシンを監査する際にまさに欲しいものだ。
オプション4:NSEスクリプトを使った脆弱性スキャン
NmapのスクリプティングエンジンNSEは、単なるポートスキャナーを超えた領域だ。SSL証明書の有効期限からSMBの脆弱性まで、数百のスクリプトがNmapに同梱されている。
# デフォルトの安全なスクリプトを実行
nmap -sC 192.168.1.10
# 脆弱性スクリプトを実行
nmap --script vuln 192.168.1.10
# 特定の脆弱性をチェック(例:EternalBlue / MS17-010)
nmap --script smb-vuln-ms17-010 192.168.1.10
# SSL/TLS設定をチェック
nmap --script ssl-enum-ciphers -p 443 192.168.1.10
# HTTPディレクトリの公開状態をチェック
nmap --script http-enum 192.168.1.10
先ほど触れた深夜2時のインシデントで、不審なホストに対して--script vulnを実行すると、既知のエクスプロイト経路を持つ未パッチのSMBサービスが検出された。1回のスキャンで、混乱したトラフィック急増が明確なインシデントレポートに変わった。
インシデント対応スキャン手順
予期しない事態に対応する際、徹底さよりも速度とシグナルの明確さが重要だ。私が実際に使っている手順を紹介する:
ステップ1:高速偵察(60秒以内)
# 最速の有意義なスキャン — 上位100ポート、バージョン検出
sudo nmap -F -sV 192.168.1.10
サービス名付きの最も一般的な上位100ポート。インシデント発生後の最初のコーヒーを飲む前に、明らかにおかしいことを発見するには十分だ。
ステップ2:全ポートマップ(2〜5分)
# 全ポート、SYNスキャン(ステルス)、出力を保存
sudo nmap -sS -p- -oN scan_full.txt 192.168.1.10
-oNで保存しておく。どうせインシデントレポートにこの出力が必要になる — スキャン実行中に今すぐキャプチャしておこう。
ステップ3:開放ポートの詳細調査
# どのポートが開いているかわかったら、そのポートのみにスクリプトを実行
sudo nmap -sV -sC --script vuln -p 22,80,443,3306 192.168.1.10
特定のポートをターゲットにすることでスキャンを高速に保てる。また、閉じたポートにスクリプトが繰り返しアクセスすることによる誤検知も減らせる。
ステップ4:サブネット全体の探索(必要な場合)
# /24内のすべての稼働ホストを発見するためのPingスイープ
nmap -sn 192.168.1.0/24
# 全稼働ホストを素早くスキャン(grepでフィルタリング)
nmap -sV -F 192.168.1.0/24 -oG - | grep "open"
知っておくべき出力フォーマット
# 通常のテキスト出力
nmap -oN results.txt target
# XML出力(Metasploitやカスタムパーサーなどのツールで利用可能)
nmap -oX results.xml target
# Grep可能な出力(高速フィルタリング)
nmap -oG results.gnmap target
# 3つすべてを同時に出力
nmap -oA results target
法的・倫理的な境界線
Nmapは診断ツールだが、許可なくネットワークをスキャンすることはほとんどの法域で違法だ。自分が所有しているか、明示的な書面による許可を持っているシステムのみをスキャンすること。本番ネットワークでは、まずチームと調整する — アグレッシブなスキャンはIDSアラートをトリガーし、レガシーサービスを圧迫し、予期しない負荷スパイクを引き起こす可能性がある。
専用のラボ環境で安全に練習しよう。VulnHubやMetasploitableを実行するローカルVMは、法的リスクなしにスキルを磨くための正当なターゲットを提供してくれる。
Nmapをルーティンに組み込む
私がNmapを好きになった実際のインシデントは、ドラマチックな深夜2時のものではなかった。忘れられたテストサーバーを発見したルーティン監査だった — デフォルト認証情報、外部から到達可能、まだ稼働中。何も侵害されていなかった。しかし、簡単に侵害されていた可能性があった。
数週間ごとにインフラの素早いスイープをスケジュールしよう。できればCI/CDパイプラインに組み込もう。どちらにせよ、他の誰かが発見する前に自分の露出を発見し始めることができる。
Nmapは一つの質問に答える:何が到達可能で、そこで何が動いているのか?それに確実に答えられれば、ほとんどのインシデントが始まる前に既に先手を打っていることになる。

