Linuxで開いているポートを探す
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
ssとnetstatの両方のオプションと構文は非常に似ています。 したがって、 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
上記のコマンドでは、ホスト名を使用してポートをスキャンします
出力には、開いているポートのリストとともに、ホストに関連するいくつかの基本的なメタデータが含まれます。 -v オプションを使用して、出力を詳細モードで表示できます。
Googleサーバーに不要な開いているポートがないことに注意してください。 これは、セキュリティリスクを最小限に抑えるために行われます。 この動作は、youtube.com、stackoverflow.com、amazon.com、netflix.comなどの一般的なホスト名のほとんどで見られます。
4. 結論
この記事では、Linuxのオープンポートと、セキュリティの脅威を最小限に抑える上でのLinuxの重要性について学びました。 Linuxで開いているポートを見つけるために、 ss 、 netstat 、 lsof 、nmapなどのさまざまなコマンドについて説明しました。 使用されるすべてのコマンドはオープンソースであり、自由に使用できます。