はじめに
サーバーセキュリティにおける「攻撃対象領域」とは、権限のないユーザーが侵入したりデータを抜き取ったりするために試行できる、すべての接点を指します。この攻撃対象領域を減らすうえで重要なのが、ネットワークポートの管理です。
開いているポートは、すべて攻撃者にとって潜在的な侵入口になります。サービスがポートでリッスンしている場合、そのサービスはデータを受信できる状態です。そのサービスに脆弱性がある場合や、公開すべきでない場合、システムは危険にさらされます。
リスニングポートがあるからといって、必ずしも危険とは限りません。ただし、外部から到達できる状態であることは示しています。セキュリティ監査は、どのサービスに到達できるのか、また、その公開が意図したものかを把握することから始まります。
そのため、ポート監査は基本的なセキュリティ強化の一部です。優れたセキュリティ対策は、ソフトウェアにパッチを適用するだけでなく、不要な公開範囲を減らすことも含みます。
この実験では、基本的なセキュリティ監査を実施します。次の操作を行います。
ssコマンドを使用して、リッスン中の TCP ポートをすべて一覧表示します。- 不審なポートや標準以外のポートを特定します。
- ポートを開いているプロセスとユーザーを調査します。
リッスン中の TCP ポートを一覧表示する
最初に、ネットワークの状態を全体的に確認します。ここでは、古い netstat ツールに代わる、より新しく高速な ss(Socket Statistics)コマンドを使用します。
監査では、リッスン中の TCP ポートと、それらを開いているプロセスに注目します。
プロセス情報があることで、単なるソケット一覧を、実際に調査・管理できる情報に変えられます。ポート番号だけでは判断材料が少ないですが、特定のプロセスとユーザーに関連付けることで、そのポートを評価できます。
次のコマンドを実行します。
sudo ss -lntp
オプションの意味:
-l(listening):接続を待機しているソケットだけを表示します。-n(numeric):ホスト名ではなく、IP アドレスとポート番号を表示します。表示が速く、内容も明確になります。-t(tcp):TCP ソケットだけを表示します。-p(processes):ソケットを使用しているプロセス名と PID(Process ID)を表示します。- 注:他のユーザーが所有するサービスのプロセス情報を表示するには、
sudoが必要です。
- 注:他のユーザーが所有するサービスのプロセス情報を表示するには、
次のような出力が表示されます。
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("node",pid=123,fd=18))
LISTEN 0 5 0.0.0.0:9999 0.0.0.0:* users:(("python3",pid=456,fd=3))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=789,fd=3))
Local Address:Port 列には、サービスがリッスンしている場所が表示されます。Process 列には、そのポートを使用しているプログラムが表示されます。
もう 1 つの重要な手がかりは、アドレスが 127.0.0.1 か 0.0.0.0 かどうかです。localhost 専用のサービスは、そのマシン自身からのみアクセスできます。一方、0.0.0.0 は通常、すべてのネットワークインターフェースでサービスがリッスンしていることを示します。
不審なポートを特定する
次に、出力を分析して、通常とは異なる項目を特定します。
標準的なサービスは通常、「Well-Known Ports(ウェルノウンポート)」である 0~1023 番ポートを使用します。たとえば、次のとおりです。
- ポート 22:SSH(Secure Shell)
- ポート 80:HTTP(Web サーバー)
- ポート 443:HTTPS(セキュアな Web サーバー)
セキュリティ監査では、標準以外のポートや、用途が分からないサービスを確認します。
目的は、見慣れないポートをすべて危険視することではありません。そのポートが何のために使われているのかを確認することが重要です。サービスは正規のもの、一時的なもの、または誤って起動されたものかもしれません。監査とは、未知の公開状態を、把握・評価できる状態に変える作業です。
ステップ 1 で実行した出力を確認してください。ポート 9999 でサービスがリッスンしていることが分かります。これは標準的なシステムポートではないため、さらに調査する必要があります。
grep を使って、この項目だけを表示します。
sudo ss -lntp | grep 9999
出力例:
LISTEN 0 5 0.0.0.0:9999 0.0.0.0:* users:(("python3",pid=289,fd=3))
この出力から、ポート 9999 でプロセスが動作していることを確認できます。次に、その正体を詳しく調べます。
プロセスの所有者を調査する
ポートが開いていることを確認するだけでは不十分です。そのサービスを誰が実行しているのかを確認する必要があります。root として動作している不審なプロセスは重大な緊急事態です。一方、権限を制限されたユーザーで動作しているプロセスは、深刻度が低い可能性があります。ただし、依然として危険な場合があります。
PID を確認する:前のコマンドの出力を確認します。users: セクションで、pid=... の値を探してください。
- 例:
users:(("python3",pid=289,fd=3))の場合、PID は 289 です。 - 注:実際の PID は異なります。
プロセスを調べる:ps コマンドを使って、この PID の詳細を表示します。<PID> を、実際に確認した番号に置き換えてください。
ps -f -p <PID>
PID が 289 の場合の例:
ps -f -p 289
出力を分析する:
UID PID PPID C STIME TTY TIME CMD
labex 289 189 0 10:00 pts/0 00:00:00 python3 -m http.server 9999
- UID:プロセスを実行しているユーザー(例:
labex)。 - CMD:プロセスを起動した正確なコマンド(例:
python3 -m http.server 9999)。
この出力から、ユーザー labex が、ポート 9999 でリッスンする目的で Python HTTP サーバーを起動したことが分かります。実際の環境で、この起動を許可していなかった場合は、直ちにプロセスを終了します。
この最後のステップでは、原因を特定します。単に「どのポートが開いているか」だけでなく、「どのユーザーがどのコマンドを実行して、そのネットワーク公開状態を作ったのか」まで確認します。これにより、監査結果をインシデント対応やセキュリティ強化に役立てられます。
まとめ
この実験では、システムのリスニングポートに対するセキュリティ監査を正常に実施しました。
重要なポイント:
- 可視化:
sudo ss -lntpを使うと、接続を待機しているサービスを正確に確認できます。 - 特定:標準的なポートを把握し、9999 のような標準以外のポートを調査対象として確認します。
- 原因の特定:
ps -f -p <PID>を使うと、不審なソケットに関係するユーザーとコマンドを確認できます。
定期的に監査を行うことで、未承認のサービス(バックドアや用途不明の Web サーバーなど)を早期に発見し、悪用される前に削除できます。



