セキュリティ監査のためのリスニングポートの確認

LinuxBeginner
オンラインで実践に進む

はじめに

サーバーセキュリティにおける「攻撃対象領域」とは、権限のないユーザーが侵入したりデータを抜き取ったりするために試行できる、すべての接点を指します。この攻撃対象領域を減らすうえで重要なのが、ネットワークポートの管理です。

開いているポートは、すべて攻撃者にとって潜在的な侵入口になります。サービスがポートでリッスンしている場合、そのサービスはデータを受信できる状態です。そのサービスに脆弱性がある場合や、公開すべきでない場合、システムは危険にさらされます。

リスニングポートがあるからといって、必ずしも危険とは限りません。ただし、外部から到達できる状態であることは示しています。セキュリティ監査は、どのサービスに到達できるのか、また、その公開が意図したものかを把握することから始まります。

そのため、ポート監査は基本的なセキュリティ強化の一部です。優れたセキュリティ対策は、ソフトウェアにパッチを適用するだけでなく、不要な公開範囲を減らすことも含みます。

この実験では、基本的なセキュリティ監査を実施します。次の操作を行います。

  1. ss コマンドを使用して、リッスン中の TCP ポートをすべて一覧表示します。
  2. 不審なポートや標準以外のポートを特定します。
  3. ポートを開いているプロセスとユーザーを調査します。

リッスン中の 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 サーバーを起動したことが分かります。実際の環境で、この起動を許可していなかった場合は、直ちにプロセスを終了します。

この最後のステップでは、原因を特定します。単に「どのポートが開いているか」だけでなく、「どのユーザーがどのコマンドを実行して、そのネットワーク公開状態を作ったのか」まで確認します。これにより、監査結果をインシデント対応やセキュリティ強化に役立てられます。

まとめ

この実験では、システムのリスニングポートに対するセキュリティ監査を正常に実施しました。

重要なポイント:

  1. 可視化:sudo ss -lntp を使うと、接続を待機しているサービスを正確に確認できます。
  2. 特定:標準的なポートを把握し、9999 のような標準以外のポートを調査対象として確認します。
  3. 原因の特定:ps -f -p <PID> を使うと、不審なソケットに関係するユーザーとコマンドを確認できます。

定期的に監査を行うことで、未承認のサービス(バックドアや用途不明の Web サーバーなど)を早期に発見し、悪用される前に削除できます。