【入門編】 nmapのNSE(Nmap Scripting Engine)による脆弱性診断スクリプト – トラブルシューティング&ネットワーク運用監視実践ガイド

こんにちは!データセンターの最前線で、数々のネットワークの嵐をくぐり抜けてきたシニアエンジニアの私です。

夜中に鳴り響くアラート音、冷え切ったサーバールーム、そして原因不明のパケットロス……。修羅場を数え切れないほど経験してきましたが、ネットワークの世界って、本当に奥が深くて面白いんですよね。

さて、今回はインフラやネットワークの世界に一歩踏み出したばかりのあなたに向けて、セキュリティ診断の強力な相棒である「nmapのNSE(Nmap Scripting Engine)」についてお話しします。

「セキュリティ」「スクリプト」なんて聞くと、なんだか難しそう、ハッカーの映画に出てくる黒い画面の住人の技みたい……って思いますよね。でも、安心してください!一歩ずつ、身近な例えから紐解いていけば、誰でもその本質を理解し、使いこなせるようになりますよ。

それでは、さっそく扉を開けていきましょう!

—

1. そもそも「nmap」と「NSE」ってなに?(郵便配達員に例えてみよう)

ネットワークの世界では、お馴染みの ping コマンドなどで「あそこのサーバー、今生きているかな?」と生存確認をしますよね。でも、生きているだけじゃなくて、「鍵はちゃんと掛かっているか」「窓が開けっぱなしになっていないか」まで調べたいときがあります。そこで登場するのが nmap(Network Mapper) です。

通常の nmap は、いわば「街の家々をまわって、どの家が留守で、どの家のドア(ポート)が空いているかをチェックする郵便配達員」のような存在です。

「おーい、3306番地のお宅、データベース屋さんですか?」
「はい、開いてますよー」

こんなやり取りをして、建物の構造を調べます。しかし、これだけだと「ドアが開いている」ことしか分かりません。中に入ったときに、古い合鍵がそのままぶら下がっていないか、泥棒に入られやすい致命的な欠陥(脆弱性)がないかまでは分からないですよね。

そこで登場するのが、今回の主役である NSE(Nmap Scripting Engine) です!

NSEは、この郵便配達員に「特定の家に入って、鍵のメーカーを調べたり、窓の立て付けが悪くないかチェックしてきたりしてくれ!」と頼める、便利な専用ツール(Lua言語で書かれた小さなプログラム)の束なんです。

—

2. なぜLua(ルア)なの? NSEの裏側の仕組み

「スクリプト」と呼ばれるものには、PythonやJavaScriptなど色々ありますが、NSEでは Lua(ルア) というプログラミング言語が使われています。「ルア」とは、ポルトガル語で「月」を意味する言葉です。

なぜLuaが使われているかというと、とにかく軽くて、フットワークが軽いからです。
データセンターの何千台ものサーバーを一斉にチェックするとき、重たいプログラムを積んだ配達員だと、それだけでネットワークが息切れしてしまいます。Luaは非常にコンパクトでメモリを食わないため、nmapという頑丈なトラックの荷台に、何百種類もの「お助けツール(スクリプト)」をラクラク積み込むことができるんです。

このNSEのおかげで、私たちは「ただポートが開いているか」を確認するだけでなく、「その開いているドアの奥にあるシステムが、古いバージョンで危険なバグを抱えていないか」まで自動で調べ上げることができるようになります。

—

3. 実践!NSEで脆弱性をチェックしてみよう

百聞は一見にしかず。実際に手を動かして、その実力を体感してみましょう!
(※当然ですが、許可を取っていない外部のシステムに対してこのコマンドを実行するのは絶対NGです。ご自身の検証環境や、テスト用の許可されたサーバーで行ってくださいね。)

基本的なスクリプトの実行コマンド

nmapでNSEを使うときは、基本のコマンドに --script というオプションを付けます。

# 対象のサーバーに対して、HTTPサーバーの脆弱性をチェックするスクリプトを実行する例
nmap --script http-vuln-cve2017-5638 192.168.1.50

おっと、見慣れないオプションが出てきましたね。
http-vuln-cve2017-5638 というのは、ある有名なWebフレームワークの脆弱性を狙う攻撃(あるいはそれをテストするための診断)を行うスクリプトの名前です。

nmapの裏側では、次のようなことが行われています。
1. まず、ターゲットの 192.168.1.50 のHTTPポート(通常は80番や443番など)が空いているか確認する。
2. ドアが開いていた場合、Luaスクリプトが「ちょっと特殊なあいさつ(パケット)」をサーバーに投げかける。
3. サーバーからの返事の仕方を分析し、「おや、このサーバーは古い危険なプログラムのまま動いているな!」と判定する。

カテゴリ別にスクリプトを使いこなす

NSEには、用途に合わせて数多くのスクリプトが用意されています。すべてを覚える必要はありません。次のような「カテゴリ名」を指定して、まとめて呼び出すのが現場のエンジニアの定番テクニックです。

  • auth: パスワードが「password」みたいな初期設定のままになっていないかを調べる。
  • default: 安全かつ基本的な動作をするスクリプトのセット(迷ったらこれ!)。
  • vuln: 既知の脆弱性(穴)がないかを集中的に探す。
  • discovery: ネットワーク上の隠れた情報をかき集める。

例えば、「このサーバーの脆弱性を全般的に調べてくれ!」と指示したいときは、次のように記述します。

# vulnカテゴリに属するスクリプトを一括してターゲットに実行する
nmap --script vuln 192.168.1.100

こうすると、nmapはまるで優秀なセキュリティ診断士のように、データベース、Web、FTPなど、あらゆる角度から「危ない隙がないか」を総チェックしてくれます。

—

4. 現場のシニアエンジニアからのアドバイス(注意点)

ここまで読んで、「すごい!じゃあ社内の全サーバーにさっそく試してみよう!」と思ったあなた。ちょっと待ってください。現場からの大切なアドバイスをさせてください。

1. 負荷に気をつける
NSEの中には、ターゲットにものすごい量の細工をしたパケットを浴びせるものがあります。古いシステムや貧弱なルーターだと、診断スクリプトの負荷に耐えきれず、サービスが停止(ダウン)してしまうことがあります。「お医者さんの健康診断のつもりが、メスで患者を傷つけてしまった」なんてことにならないよう、本番環境で使うときは影響範囲を必ず確認してください。
2. 「道具」に使われるな
NSEはあくまで「こういう脆弱性がありそうだよ」と教えてくれる自動ツールです。出力された結果をうのみにするのではなく、「なぜこのアラートが出たのか」「本当にそれは対策が必要なものなのか」をご自身の頭で考え、公式ドキュメントやパケットの流れと照らし合わせて判断するエンジニアになってくださいね。

—

まとめ

いかがでしたでしょうか?
今回は、nmapのNSE(Nmap Scripting Engine)について、郵便配達員やLuaの軽快なフットワークに例えてお話ししました。

  • nmapは単なるポートスキャナー(郵便配達員)ではなく、NSEを使うことで「セキュリティ診断士」に変身する。
  • 軽快なLuaスクリプトのおかげで、さまざまな脆弱性を自動で効率よくチェックできる。
  • --script オプションとカテゴリ名を使いこなすことで、現場のトラブルシューティングや事前検証で強力な武器になる。

ネットワークやインフラストラクチャの世界は、こうした便利なツールを知れば知るほど、視界が開けて面白くなっていきます。ぜひご自身の検証環境で、安全に試してみてくださいね。

それでは、また次回の技術コラムでお会いしましょう!データセンターの片隅から応援しています!

コメント

タイトルとURLをコピーしました