1. 概要

Linux ポートは、ネットワーク内のさまざまなサービスにアクセスするのに役立つ仮想概念です。 これは、0〜65535の範囲の16ビット整数であり、物理的に存在しません。 ポートをIPアドレスと組み合わせると、クライアントとサーバー間の接続を確立するために使用されるソケットアドレスになります。

このチュートリアルでは、開いているポートと、それらが安全な環境を実現する上でどのように重要であるかについて学習します。 次に、さまざまなLinuxコマンドを調べて、開いているすべてのポートを見つけます。

2. オープンポートとは何ですか?

接続をアクティブに受け入れているポートは、オープンポートと呼ばれます。 このように確立された接続は、そのポートに関連付けられたサービスにアクセスするために使用されます。

ポートは、一度に1つのサービス/プロセスで占有できます。 ポートに関連付けられている既存のプロセスを強制終了し、同じポートに新しいプロセス/サービスを再割り当てできます。

開いているポートはエントリポイントとして機能します。 したがって、安全な環境の脆弱なエンドポイントが増加します。 これは、ポートの背後で実行されているサービス/プロセスであり、重大なセキュリティの脆弱性につながる可能性があります。 たとえば、Apacheサーバーがポート80で基本的なHTMLページをホストしているとします。 攻撃者は、HTMLページにアクセスしてセキュリティの脅威を作成することはできません。 しかし一方で、脆弱なコードを使用してPHPアプリケーションをホストしたと仮定します。 今回は、攻撃者がアプリケーションにアクセスすることで、システムを簡単に悪用する可能性があります。

ポート(つまり、80)はどちらの場合も同じであることに注意してください。 したがって、システムに実際の脅威を引き起こしているのは、Apacheサーバーで実行されているコードです。

したがって、ベストプラクティスとして、公開することを意図していない開いているすべてのポートを常に閉じる必要があります。

3. Linuxで開いているポートを探す

ここで、さまざまなLinuxコマンドを詳しく調べて、マシンで開いているポートを特定しましょう。

3.1. ssコマンドの使用

ss (ソケット統計)は、ソケット情報を表示するために使用されるCLIユーティリティです。 これはiproute2パッケージに属しており、旧式のnet-toolsパッケージよりも高速で最適化されており、より多くの情報を提供します。

ss コマンドを一連のオプションとともに使用して、開いているすべてのTCPポートを一覧表示できます。

$ ss -tnlp
State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process                                                  
LISTEN  0       128     0.0.0.0:111         0.0.0.0:*          users:(("rpcbind",pid=795,fd=4),("systemd",pid=1,fd=48)) 
LISTEN  0       128     0.0.0.0:22          0.0.0.0:*          users:(("sshd",pid=1230,fd=5))                               
LISTEN  0       128     *:443               *:*                users:(("httpd",pid=21905,fd=9),... 
LISTEN  0       128     [::]:111            [::]:*             users:(("rpcbind",pid=795,fd=6),("systemd",pid=1,fd=52))
LISTEN  0       128     *:80                *:*                users:(("httpd",pid=21905,fd=4),...      
LISTEN  0       128     [::]:22             [::]:*             users:(("sshd",pid=1230,fd=7))

ここでは、4つのオプションを使用して目的の出力を取得しました。

  • t :TCPソケットを表示します
  • n :数値のポート番号を表示します
  • l :リスニングソケットを表示します
  • p :ソケットを使用してプロセスを表示します

上記で生成されたコマンド出力の4番目の列は、ローカルソケットアドレスを示します。 これは、IPアドレスとポートの組み合わせです。 これらのポートはすべて開いています。 さらに、その特定のポートに関連付けられているプロセスを6番目の列で見つけることができます。 この列には、プロセス名、プロセスID、ファイル記述子などのプロセスの詳細が含まれます。

コマンドでflagl を使用したため、各行の「状態」(最初の列)はLISTENになります。 これは、特定のソケットがリスニング状態にあることを示します。

ss は、幅広いオプションを備えた非常に強力なコマンドです。 ヘルプコマンドss-help を使用して利用可能なすべてのオプションを見つけ、それらをプラグアンドプレイして目的の出力を取得できます。

3.2. netstatコマンドの使用

netstat は、ネットワーク接続の詳細を表示するもう1つのLinuxコマンドです。 ただし、Linuxカーネルの多くの最新機能のサポートが不足しており、いくつかの最適化の問題があるため、正式に廃止としてマークされています。

開いているポートを見つけるには、上記のssコマンドで使用したのと同じオプションを使用します。

$ netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1230/sshd           
tcp6       0      0 :::443                  :::*                    LISTEN      925/httpd           
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::80                   :::*                    LISTEN      925/httpd           
tcp6       0      0 :::22                   :::*                    LISTEN      1230/sshd          

ssnetstatの両方のオプションと構文は非常に似ています。 したがって、 ss コマンドは、netstatコマンドの代わりに機能します。

3.2. lsofコマンドの使用

すべてがLinuxのファイルです。 lsof (開いているファイルのリスト)は、Linuxで開いているすべてのファイルを一覧表示するユーティリティです。 lsof コマンドは、カーネルのprocファイルシステムからデータを読み取ります。 したがって、プロセス、ユーザー、アプリケーション、またはポートに基づいてネットワーク接続を追跡する機能があります。

lsof コマンドは、必要に応じて出力をフィルタリングするためのさまざまなオプションをサポートしています。 ここで、開いているTCP接続で使用されるポートを一覧表示するオプションの組み合わせを調べてみましょう。

$ lsof -i -P -sTCP:LISTEN
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd     1   root   48u  IPv4   1822      0t0  TCP *:111 (LISTEN)
systemd     1   root   52u  IPv6   1824      0t0  TCP *:111 (LISTEN)
rpcbind   795    rpc    4u  IPv4   1822      0t0  TCP *:111 (LISTEN)
rpcbind   795    rpc    6u  IPv6   1824      0t0  TCP *:111 (LISTEN)
httpd     925   root    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd     925   root    9u  IPv6  25594      0t0  TCP *:443 (LISTEN)
sshd     1230   root    5u  IPv4  28121      0t0  TCP *:22 (LISTEN)
sshd     1230   root    7u  IPv6  28123      0t0  TCP *:22 (LISTEN)
httpd   21196 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21196 apache    9u  IPv6  25594      0t0  TCP *:443 (LISTEN)
httpd   21197 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21197 apache    9u  IPv6  25594      0t0  TCP *:443 (LISTEN)
httpd   21223 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21223 apache    9u  IPv6  25594      0t0  TCP *:443 (LISTEN)
httpd   21905 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21905 apache    9u  IPv6  25594      0t0  TCP *:443 (LISTEN)

上記のコマンドでは、 -i オプションを使用してネットワークファイルのみを一覧表示し、-Pを使用してポートの名前ではなく数値を表示します。

-sTCP:LISTEN は、LISTEN状態のTCPプロトコルファイルをフィルタリングするために使用されます。

出力はssコマンドの出力と似ています。 唯一の違いは、ssコマンドがプロセスに基づいて出力をグループ化することです。

lsof コマンドを使用して、開いているポートがあるかどうかを確認できます。

$ lsof -P -i:80
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd     925   root    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21196 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21197 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21223 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)
httpd   21905 apache    4u  IPv6  25918      0t0  TCP *:80 (LISTEN)

lsof コマンドの主な欠点は、正しい出力を表示するためににsudo権限が必要なことです。これまで、rootユーザーを使用してすべてのコマンドを実行してきました。

上記で生成された出力から、HTTPプロセスが root / apacheユーザーを使用して実行されていることが明らかです。 次に、root以外のユーザー( centos ユーザーなど)を使用して同じlsofコマンドを実行します。

$ su centos
$ lsof -i:80

今回は出力を表示しません。 これは、lsofコマンドがrootユーザーを使用して作成されたHTTPプロセスのprocディレクトリを読み取ることができなかったためです。

3.3. nmapコマンドの使用

nmap (Network Mapper)は、サイバーセキュリティの専門家やシステム管理者によって広く使用されているオープンソースのネットワークスキャナーツールです。 このツールは、OS検出、ポートスキャン、ネットワーク監査など、さまざまな目的に使用できます。

他のコマンド(ssおよびlsof)とは異なり、nmapユーティリティは任意のリモートマシンで開いているポートを見つけることができます。 そのマシンにアクセスする必要はありません。 また、このコマンドを実行するためにroot権限は必要ありません。

nmapコマンドを使用してポートスキャンを実行してみましょう。

$ nmap google.com
Starting Nmap 7.70 ( https://nmap.org ) at 2022-01-26 19:23 UTC
Nmap scan report for google.com (142.250.190.110)
Host is up (0.018s latency).
Other addresses for google.com (not scanned): 2607:f8b0:4009:809::200e
rDNS record for 142.250.190.110: ord37s35-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 12.29 seconds

上記のコマンドでは、ホスト名を使用してポートをスキャンします Google COM。  The nmap コマンドは、DNSレコードからIPを自動的にフェッチします。 すでにわかっている場合は、nmapコマンドでIPを使用することもできます。

出力には、開いているポートのリストとともに、ホストに関連するいくつかの基本的なメタデータが含まれます。 -v オプションを使用して、出力を詳細モードで表示できます。

Googleサーバーに不要な開いているポートがないことに注意してください。 これは、セキュリティリスクを最小限に抑えるために行われます。 この動作は、youtube.com、stackoverflow.com、amazon.com、netflix.comなどの一般的なホスト名のほとんどで見られます。

4. 結論

この記事では、Linuxのオープンポートと、セキュリティの脅威を最小限に抑える上でのLinuxの重要性について学びました。 Linuxで開いているポートを見つけるために、 ss netstat lsof nmapなどのさまざまなコマンドについて説明しました。 使用されるすべてのコマンドはオープンソースであり、自由に使用できます。