2015年6月4日編集者注: Chad Perrin氏が2008年4月に執筆した、アクティブなサービスと開いているポートを一覧表示するツールに関する記事は、今でも最も人気のある記事の一つです。そこで、Jack Wallen氏にこのトピックに関する2015年版の更新記事を執筆してもらいました。Chad氏のオリジナル記事は、Jack氏の更新記事のすぐ後に掲載されています。
ネットワーク管理者にとって最大の悩みの一つは、デバイスのポートが開いていることです。ネットワーク上のすべてのデバイスにオペレーティングシステムを手動でインストールし、不要なポートをすべて閉じておかない限り、攻撃を受けるリスクがあります。
無効にすべきポートはシステムによって異なり、場合によっては特定のソフトウェアの要件によっても決まることがあります(例えば、QuickBooksは特定のポート(リリースによって異なる)を必要とするため、動作に必要です)。開いたままにできるポート、または開いたままにしておく必要があるポートのリストを作成する必要があります。リストが完成したら、該当するマシンでの使用を停止する作業に取り掛かることができます。しかし、どのマシンのどのポートが開いているかはどうすればわかるのでしょうか?もちろん、ネットワーク上のすべてのマシンにアクセスし、ファイアウォールとして使用されているポートをすべて開き、必要なポートがすべて開いていて、不要なポートがすべて閉じられていることを手動で確認することは可能です。
あるいは、ネットワークをスキャンして、どのマシンのどのポートが開いているかを確認することもできます。開いているポートの場所がわかれば、その情報をマスターリストと照合し、必要なものをすべて閉じることができます。さて、ここからが厄介な部分です。
ポートスキャンを実行する方法
どのマシンのどのポートが開いているかはどうやって調べるのでしょうか?ポートスキャンを実行します。ポートスキャンの実行方法がわからない場合は、手順を説明します。
スキャンにはLinuxマシンを使用しています。なぜでしょうか?Linuxには、このタスクにすぐに使える、無料で使いやすい優れたスキャンツールがあるからです。
Linuxが動作するマシンをお持ちでなくてもご心配なく。Kali Linuxなどのネットワーク侵入ライブディストリビューションをダウンロードし、ISOイメージをCDまたはUSBフラッシュドライブに書き込み、マシンを起動してLinuxのライブインスタンスを起動できます(ライブインスタンスは完全にRAMから実行されるため、使用中のマシンに変更は加えられません)。ライブインスタンスを起動すれば、驚くほど豊富なネットワークフォレンジック/分析ツールを自由に利用できるようになります。
使用すべきポートスキャンツール
ポートスキャンに最適なツールはNmapです。コマンドラインを操作したくない場合は、Linux、Windows、Macで利用できるZenmapという優れたGUIフロントエンドがあります。Linuxを使いたくない場合は、Windowsにインストールすることも可能です。(NmapはWindowsに組み込まれているネットワークスキャンツールよりもはるかに強力です。)NmapとZenmapはプラットフォームを問わず同じように動作するため、あるプラットフォームで使い方を覚えておけば、他のプラットフォームでも同じように使えます。
Zenmapをインストールしたら、ネットワーク全体のポートスキャンを実行する準備が整いました。スキャンにかかる時間は、ネットワークの規模によって異なります。Zenmapでは、非常に一般的なスキャンと非常に具体的なスキャンを実行できます。まずは、どのようなスキャンを行うのかを把握するために、非常に一般的なスキャンを実行してみましょう。192.168.1.xネットワーク全体をスキャンします。
- Zenmapを開きます。
- [ターゲット] セクションで、192.168.1.1/24 (または、拡張する必要がある大きさ) を入力します。
- プロファイルから、「強力なスキャン」を選択します。
- スキャンボタンをクリックします。
Nmapの出力タブに結果がすぐに表示されます。結果には、ネットワーク内のマシンの開いているポートが表示されます(図A)。強力なスキャンには長い時間がかかりますが、ネットワークに関する最大限の情報が必要な場合は、この方法が最適です。
図A

スキャンが完了すると、左側のペインにネットワーク上で検出されたすべてのデバイスのリストが表示されます。デバイスの1つをクリックし、Nmapの出力をスクロールして、「ポート」、「状態」、「サービス」がリストされているセクションを探します(図B)。
図B

スキャンをじっくり確認する時間がない場合でも、保存して後で(Zenmapを使って)閲覧することができます。スキャンを保存するには、「スキャン」>「スキャンを保存」を選択し、名前を付けて「保存」をクリックします。
ネットワーク上で開いているポートをすばやく表示するには、[ポート/ホスト] タブをクリックして、どのポートが広く開いているかを確認します (図 C )。
図C

GUIに依存したくない場合は、Nmap(Zenmapのインストール時にインストールされます)を使って、コマンドラインから同じスキャンを実行できます。例えば、単一のホストに対して集中スキャンを実行したい場合は、ターミナルウィンドウを開いて次のコマンドを実行してください。
sudo nmap -T4 -A -v 192.168.1.1/24
これらは上記のコマンドのスイッチです。
- T4 ─ タイミングを 4 に設定 (0 ~ 5、5 が最速)
- A ─ OS検出を有効にする
- v ─ 詳細出力
この時点で(Nmapをコマンドラインから使用したか、Zenmap GUIから使用したかに関係なく)、ネットワーク上で開いているポートの完全なリストが手元にあるはずです。どのポートがどのマシンで開いているかがわかれば、それらのポート、ひいてはネットワークを安全に保護できる可能性が大幅に高まります。
結論
Nmap/Zenmap は市場にある唯一のネットワーク スキャン オプションではありませんが、ネットワーク上で開いているポートを見つけるのに役立つ、これより簡単で強力なツールを見つけるのは難しいでしょう。
チャド・ペリン著、2008年4月15日初版
セキュリティ上の脅威の攻撃経路とならないように、実際に必要のないサービスはすべて無効にしてください。システムによって、デフォルトで実行されるサービスは異なります。MS Windows XPのサービスパックのバージョンによっても同様です。また、既にセットアップ済みのコンピュータのセキュリティ管理を任されるような状況に陥った場合、システムのデフォルトインストール時とは異なるサービスが実行されることも少なくありません。必要なのは、アクティブなサービスと開いているポートを一覧表示するツールです。Linuxディストリビューション、FreeBSD、MS Windowsの3種類のシステムで、このようなツールの使い方を説明します。
「汎用OS向け10のセキュリティ対策」の記事で述べたように、セキュリティ脅威の攻撃経路とならないよう、実際に必要のないサービスはすべて無効にする必要があります。Microsoft Windowsの具体的な10個のサービスについては、後日掲載した記事「MS Windows XPで無効にすべき10個のサービス」で紹介しました。10個という数は記事の中で簡潔に列挙するには適切な数ですが、網羅的ではありません。
包括的なリストを提供することは基本的に不可能です。システムによってデフォルトで実行されるサービスは異なり、MS Windows XPのサービスパックのバージョンによっても異なります。また、既にセットアップ済みのコンピュータのセキュリティ管理を任されるような状況に陥った場合、システムのデフォルトインストール時とは異なるサービスが実行される可能性が高くなります。さらに悪いことに、新しいサービスが随時開発されており、特定のコンピュータで実行される可能性のあるサービスの数は増加しています。
必要なのは、アクティブなサービスと開いているポートを一覧表示するツールです。Linuxディストリビューション、FreeBSD、MS Windowsの3種類のシステムで、これらのツールの使い方をアルファベット順に説明します。さらに、他のツールが利用できない可能性のある商用UNIXシステム向けの追加ツールの使い方も説明します。
フリーBSD
FreeBSD Unixシステムでは、他のBSD Unixシステムと同様に、ベースシステムにインストールされたユーティリティが多数用意されており、開いているファイル、実行中のプロセス、ネットワーク接続の一覧を表示できます。netstatユーティリティは、FreeBSDコア開発者によってFreeBSDベースシステムの一部として保守されており、システム上の開いているポートの一覧を表示するために必要な機能を提供します。
ネットスタット
FreeBSD 上で netstat を使用して開いているネットワーク ポートとそれらを所有するプロセスを一覧表示するには、次のコマンドを使用します。
netstat -a | egrep 'プロト|LISTEN'
FreeBSD を実行している私のラップトップでの出力は次のようになります。
プロトコル 受信Q 送信Q ローカルアドレス 外部アドレス(状態)
tcp4 0 0 localhost.ipp *.* LISTEN
tcp6 0 0 localhost.ipp *.* LISTEN
tcp4 0 0 *.2200 *.* LISTEN
tcp6 0 0 *.2200 *.* LISTEN
tcp4 0 0 *.x11 *.* LISTEN
tcp6 0 0 *.x11 *.* LISTEN
localhost.ipp エントリは、CUPS がネットワークプリンタと通信するために使用するインターネット印刷プロトコル(IPP)を参照しています。*.2200 エントリは SSH を参照していますが、非標準ポートに設定しているため、netstat のポートとサービスの関連付け機能では認識されません。*.x11 は X Window System プロトコルを参照しています。
ユーティリティがサービスの名前を提供する代わりに、netstat に -n オプションを追加するとポート番号を取得できます。
netstat -an | egrep 'プロト|LISTEN'
出力は多少異なります。
プロトコル recv-q send-q ローカルアドレス 外部(状態)
tcp4 0 127.0.0.1.631 *.* リッスン
tcp6 ::1.631 *.2200 *.6000
この情報は、サービスが標準ポートを使用している場合、どのサービスが実行されているかを判断するために使用できます。FreeBSDシステムでは、/etc/servicesの内容を検索することで、標準ポートの関連付けの一覧を取得できます。
たとえば、ポート 631 に何が起こっているかを調べたい場合は、次のコマンドを使用します。
grep -w 631 /etc/services
出力:
ipp 631/tcp #IPP (インターネット印刷プロトコル)
ipp 631/udp #IPP (インターネット印刷プロトコル)
ソックススタット
netstatに加えて、より限定的な機能を持つコマンドであるsockstatは、この種の情報収集に最適です。リスニングポートとそれに関連するプロセスの一覧を取得するには、次のコマンドを使用します。
ソックススタット -4l
出力は上記の netstat の出力よりもさらに有用かもしれません:
ユーザーコマンド pid fd proto ローカルアドレス 外部
ルート cupsd 170 4 tcp4 127.0.0.1:631 *:*
6 udp4 *:631
sshd 1685 *:2200
xorg 1154 3 *:6000
syslogd 907 7 *:514
Linuxディストリビューション
FreeBSDと同様に、開いているポートの一覧を取得するにはnetstatツールを使用するのが当然の選択です。ほとんどのLinuxディストリビューションでは、このユーティリティの異なるバージョンが使用されていますが、これはLinuxディストリビューションとは別に、独立したソフトウェア開発プロジェクトとしてメンテナンスされています。
この事実の帰結として、FreeBSDでは同じ結果を得るために使用するコマンドラインオプションが、Debian、Ubuntu、Fedora Core Linuxシステムとは異なる場合があります。一般的なLinuxシステムでは、このコマンドは開いているネットワークポートとそれらを所有するプロセスを一覧表示します。
netstat -lnptu
出力は次のようになります。
アクティブなインターネット接続(サーバーのみ)
プロトコル 受信Q 送信Q ローカルアドレス 外部アドレス 状態 PID/プログラム名
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2458/cupsd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 2353/postgres
tcp6 0 0 :::22 :::* 2335/sshd をリッスン
UDP 0 0 0.0.0.0:631 0.0.0.0:* 2458/cupsd
この出力からわかるように、私がそのコマンドを実行した Debian GNU/Linux システムには、開いているポートが 4 つしかありません。そのうち 2 つは CUPS 用で、コンピューターがネットワーク プリンターと通信できるようにします。もう 1 つは PostgreSQL 用で、開発中のアプリケーションから接続できるようにします。そして SSH 用は、ラップトップからリモートでアクセスできるようにします。
マイクロソフト ウィンドウズ XP
Microsoft Windowsには、コマンドラインから実行して開いているポートの一覧を取得できるnetstatコマンドも用意されています。標準のMS Windows版netstatは、Unix系システムのnetstatに比べて機能が若干制限されていますが、それでもリッスン中のサービスの一覧を取得するには十分です。
netstat -a | リスニングを見つける
このコマンドの出力は次のようになります。
TCP ホスト名:epmap ホスト名:0 LISTENING
TCP ホスト名:microsoft-ds ホスト名:0 LISTENING
TCP ホスト名:10110 ホスト名:0 LISTENING
TCP ホスト名:netbios-ssn ホスト名:0 LISTENING
注: 「hostname」はシステムのホスト名に置き換えられます。
商用UNIXシステム
ほとんどの商用UNIXシステムでは、netstatやsockstatのバージョンが利用できない場合でも、lsof(「list open files(開いているファイルのリスト)」の略)をインストールできるはずです。ほとんどのLinuxディストリビューションとBSD UNIXシステムでは、lsofがデフォルトのインストールまたはそれぞれのソフトウェア管理システムを通じて提供されます。一部の商用UNIXシステムでも同様に提供されており、他の多くのシステムではダウンロード可能です。以下のコマンドは、ユーティリティの出力をネットワークポートに限定します。
lsof -i -n | egrep 'コマンド|LISTEN'