サーバ管理者の多くは、自分の運用するサーバに対して、第一にサービスが停止しないこと、そして第二に不正侵入されないことを願うだろう。特にここ数年は、不正侵入の事例が多く報告されていることから、いま一度サーバのセキュリティを見直し(再点検し)たいと思っている読者も中にはいると思う。
そうした場合、OSのリプレースから行い、セキュリティを考慮した設定を行うのが望ましい。しかし実際は、顧客などにサービスを提供したり基幹サーバとして24時間フル稼働している以上、そうやすやすと止めるわけにはいかないのが現実だ。もちろんサーバの冗長化を行っていればその問題はクリアされるが、ほとんどの場合、予算などの関係ですべてのサーバがそのような構成を取ることはできないだろう。
本連載では、現行動作しているUNIXサーバを対象に、稼働サービスの停止を最小限に抑えつつ、セキュリティを向上・維持するための一連の設定やツールを紹介する。
第1回の今回は、「不要なサービスの停止」について説明する。
セキュアなサーバにするための第一歩として、最初にやっておきたいのが不要なサービスを停止することだ。このことは、サーバへの侵入の可能性を減らすためにもぜひ見直しておきたい項目の1つだ。
外部からの不要なサービスへのアクセスは、上位のルータやファイアウォールでブロックしているから大丈夫、と考える読者もいると思う。しかし、内部の別のサーバが侵入され、踏台として悪用されたときのことを考えるとどうだろうか……。その場合、いくら上位でブロックしようが関係なくアクセスされるため、不要なサービス経由で更なる侵入を許す恐れがある。もちろん、不要なサービスを提供するソフトウェアが、常に安全なバージョンで維持されていれば侵入されることはほとんどない。
しかしながら不要なサービスを起動することで、損はしても得をすることはまずないので、あれこれ考えるよりは、さっさと停止してしまう方がよいだろう。
最初に、現時点で起動しているサービスの確認から行う。UNIXでは実行プロセスと待機ポートの状態から知ることができる。
サーバ上でどのようなサービスが実行されているのかを知るためには、実行中のプロセスの状態を確認すればよい。プロセスの状態を確認する方法として、UNIXでは古くからpsコマンドが知られている。
psコマンドで指定するオプションは、UNIXの系統によって異なる。BSD系なら-aと-x、System V系なら-eと-fを併せて指定するとよい*1。両方とも出力される内容はほぼ同じだ。
・BSD系の場合
% ps -ax
-a:ほかのユーザーのプロセスも表示
-x:制御端末(tty)のないプロセス*2も表示
・System V系の場合
% ps -ef
-e:すべてのプロセスを表示
-f:すべての情報を表示
% ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 May10 ? 00:00:04 init root 2 1 0 May10 ? 00:00:00 [keventd] root 3 1 0 May10 ? 00:00:00 [kapmd] root 4 1 0 May10 ? 00:00:00 [ksoftirqd_CPU0]……途中省略……rpc 522 1 0 May10 ? 00:00:00 portmap rpcuser 544 1 0 May10 ? 00:00:00 rpc.statd root 693 1 0 May10 ? 00:00:03 /usr/sbin/sshd root 714 1 0 May10 ? 00:00:00 xinetd -stayalive -reuse -pidfil root 743 1 0 May10 ? 00:00:00 sendmail: accepting connections bin 786 1 0 May10 ? 00:00:00 cannaserver -syslog -u bin -inet apache 1155 773 0 May10 ? 00:00:00 /usr/sbin/httpd -DHAVE_ACCESS -D
出力結果の一番右の CMD(BSD psはCOMMAND)部分より、サーバ上で実際にどういったサービス(コマンド)が実行されているのかを特定できる。
なお、途中で切れているCMDの出力を知りたい場合は、-w(132行で表示)か-ww(すべて表示)オプションを指定すればよい。
% ps -efww | grep xinetd root 714 1 0 May10 ? 00:00:00 xinetd -stayalive -reuse -pidfile /var/run/xinetd.pid
上記例のpsコマンドの出力結果より、以下のサービスが稼働中であることが分かる。これらの中から、実際に不要となるサービスを特定し、停止する。
プロセス名 | 不要となる条件 |
---|---|
portmap | RPCサービスを提供しない場合 |
rpc.statd | NFSサービスを提供しない場合 |
sshd | リモートログインを行わない場合 |
xinetd | xinetdにより行えるアクセス制御などのインターネットサービスを行わない場合 |
sendmail | メール受信を行わない場合 |
cannaserver | 日本語かな漢字変換を行わない場合 |
httpd | HTTPサービスを提供しない場合 |
稼働中のサービス(プロセス)の中でも、特に外部からのアクセスが可能なものについては十分な確認が必要となる。UNIXの多くは、netstatコマンドの-aオプションにより、サーバ上で待機中(listen)のTCP/UDPポートを確認できる。
% netstat -an
-a:すべてのソケットの状態を表示
-n:IPアドレスやポートを数字で表示
多くの情報が表示されるので、lessやmoreコマンドを使って画面をスクロールさせると見やすいだろう。
% netstat -an | less
% netstat -an Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5680 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN tcp 0 0 192.168.30.10:22 192.168.30.142:65081 ESTABLISHED tcp 0 272 192.168.30.10:22 192.168.30.142:65069 ESTABLISHED udp 0 0 0.0.0.0:32768 0.0.0.0:* udp 0 0 0.0.0.0:111 0.0.0.0:* ……省略……
Protoのtcpの行のStateがLISTENであることや、udpの行のLocal Addressの部分が待機中のポートであることを示している。
% netstat -an | grep "^tcp" | grep LISTEN tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5680 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN udp 0 0 0.0.0.0:32768 0.0.0.0:* udp 0 0 0.0.0.0:111 0.0.0.0:*
出力結果より、対象サーバ上で次のポートが待機中であることが分かる。これらの中から不要なサービスが利用している待機ポートを見つけ出す。
ポート番号 | プロトコル | 使用サービス(プロセス) | 使用目的 |
---|---|---|---|
22 | tcp | OpenSSH (sshd) | リモートメンテナンス |
25 | tcp | Sendmail (sendmail) | メール受信 |
80 | tcp | Apache (httpd) | HTTPサービス |
111 | tcp、udp | portmap | RPCポートマップ |
443 | tcp | Apache (httpd) | Webサービス |
5680 | tcp | Canna (cannaserver) | 日本語かな漢字変換 |
32768 | tcp、udp | status (rpc.statd) | NFSサービス |
待機ポートで使用しているサービスの調べ方は、「連載 不正侵入の手口と対策」の“バナーチェックを行う”を参考にしてほしい。
先述のpsとnetstatの両者を組み合わせたのが、lsof、socklist、sockstatといったコマンドだ。これらはpsやnetstatと異なり、OSに標準インストールされていない、あるいはOS固有になるため利用は制限されるが、運用上とても便利なので紹介しておく。
・lsofコマンド
lsof(LiSt Open File)コマンドの-iオプションを使って、実行プロセスが使用している待機ポートの確認を行える。このコマンドは、Linuxを始めそのほかのUNIXでも利用可能なので、インストールされていない場合はソースコード(パッケージ)を入手してインストールしておくとよいだろう。
# lsof -i -n -P
-i:ネットワークソケットファイルを表示。引数を指定しない場合は、すべてが対象となる
-n:IPアドレスからホスト名への変換を抑止する
-P:ポート番号からサービス名への変換を抑止する
指定したオプションの-nと-Pは、netstatの-nと同義だと思ってよい。また、 -iオプションを指定する場合は、root権限が必要になる。
# lsof -i -n -P COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME portmap 522 root 3u IPv4 845 UDP *:111 portmap 522 root 4u IPv4 848 TCP *:111 (LISTEN) rpc.statd 544 root 4u IPv4 906 UDP *:32768 rpc.statd 544 root 6u IPv4 909 TCP *:32768 (LISTEN) sshd 693 root 3u IPv4 1542 TCP *:22 (LISTEN) sendmail 743 root 4u IPv4 1645 TCP *:25 (LISTEN) httpd 773 root 16u IPv4 1713 TCP *:443 (LISTEN) httpd 773 root 17u IPv4 1714 TCP *:80 (LISTEN) cannaserv 786 root 4u IPv4 1712 TCP *:5680 (LISTEN)…… 省略 ……
出力結果より、例えばsshdは22/tcp、sendmailは25/tcpのポートを使用していることが分かる。
# lsof -i tcp:25 -n -P COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sendmail 743 root 4u IPv4 1645 TCP *:25 (LISTEN)
# lsof -i :1-1024 -n -P portmap 522 root 3u IPv4 845 UDP *:111 portmap 522 root 4u IPv4 848 TCP *:111 (LISTEN) sshd 693 root 3u IPv4 1542 TCP *:22 (LISTEN) sendmail 743 root 4u IPv4 1645 TCP *:25 (LISTEN) httpd 773 root 16u IPv4 1713 TCP *:443 (LISTEN)
# lsof -p 522 -n -P COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME portmap 522 root cwd DIR 3,5 4096 2 / portmap 522 root rtd DIR 3,5 4096 2 / portmap 522 root txt REG 3,5 29288 229526 /sbin/portmap portmap 522 root mem REG 3,5 85420 131075 /lib/ld-2.2.5.so portmap 522 root mem REG 3,5 85262 131092 /lib/libnsl-2.2.5.so portmap 522 root mem REG 3,5 1343176 131084 /lib/libc-2.2.5.so portmap 522 root mem REG 3,5 42897 131108 /lib/libnss_files-2.2.5.so portmap 522 root 0u CHR 1,3 66989 /dev/null portmap 522 root 1u CHR 1,3 66989 /dev/null portmap 522 root 2u CHR 1,3 66989 /dev/null portmap 522 root 3u IPv4 845 UDP *:111 portmap 522 root 4u IPv4 848 TCP *:111 (LISTEN)
・socklist
socklistは多くのLinuxディストリビューションに含まれるPerlスクリプトで、lsofの簡易版といってもよい。オプションも特になく、root権限で単にコマンドを実行するだけだ。
# socklist type port inode uid pid fd name tcp 32768 909 29 544 6 rpc.statd tcp 111 848 0 522 4 portmap tcp 80 1714 0 14399 17 httpd tcp 5680 1712 1 786 4 cannaserver tcp 22 1542 0 693 3 sshd tcp 25 1645 0 743 4 sendmail tcp 443 1713 0 14399 16 httpd tcp 22 88615 0 14529 4 sshd udp 32768 906 29 544 4 rpc.statd udp 111 845 0 522 3 portmap
・sockstat
sockstatはFreeBSDに含まれるPerlスクリプトで、FreeBSD 3.1から提供されている。-lオプションを指定して、実行中のコマンドと使用している待機ポートの確認が行える。
% sockstat -l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS root snmpd 239 6 udp4 *:161 *:* root sshd 185 4 tcp4 *:22 *:* root inetd 180 4 tcp4 *:21 *:* root syslogd 159 5 udp4 *:514 *:* ……省略……
Copyright © ITmedia, Inc. All Rights Reserved.