連載
» 2003年05月22日 00時00分 UPDATE

止められないUNIXサーバのセキュリティ対策(1):不要なサービスの停止こそ管理の第一歩 (1/2)

[木村靖,三井物産GTI]

 サーバ管理者の多くは、自分の運用するサーバに対して、第一にサービスが停止しないこと、そして第二に不正侵入されないことを願うだろう。特にここ数年は、不正侵入の事例が多く報告されていることから、いま一度サーバのセキュリティを見直し(再点検し)たいと思っている読者も中にはいると思う。

 そうした場合、OSのリプレースから行い、セキュリティを考慮した設定を行うのが望ましい。しかし実際は、顧客などにサービスを提供したり基幹サーバとして24時間フル稼働している以上、そうやすやすと止めるわけにはいかないのが現実だ。もちろんサーバの冗長化を行っていればその問題はクリアされるが、ほとんどの場合、予算などの関係ですべてのサーバがそのような構成を取ることはできないだろう。

 本連載では、現行動作しているUNIXサーバを対象に、稼働サービスの停止を最小限に抑えつつ、セキュリティを向上・維持するための一連の設定やツールを紹介する。

 第1回の今回は、「不要なサービスの停止」について説明する。

※ご注意
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。

セキュアなサーバへの第一歩

 セキュアなサーバにするための第一歩として、最初にやっておきたいのが不要なサービスを停止することだ。このことは、サーバへの侵入の可能性を減らすためにもぜひ見直しておきたい項目の1つだ。

 外部からの不要なサービスへのアクセスは、上位のルータやファイアウォールでブロックしているから大丈夫、と考える読者もいると思う。しかし、内部の別のサーバが侵入され、踏台として悪用されたときのことを考えるとどうだろうか……。その場合、いくら上位でブロックしようが関係なくアクセスされるため、不要なサービス経由で更なる侵入を許す恐れがある。もちろん、不要なサービスを提供するソフトウェアが、常に安全なバージョンで維持されていれば侵入されることはほとんどない。

 しかしながら不要なサービスを起動することで、損はしても得をすることはまずないので、あれこれ考えるよりは、さっさと停止してしまう方がよいだろう。

現状を確認する

 最初に、現時点で起動しているサービスの確認から行う。UNIXでは実行プロセスと待機ポートの状態から知ることができる。

実行プロセスの確認 (ps)

 サーバ上でどのようなサービスが実行されているのかを知るためには、実行中のプロセスの状態を確認すればよい。プロセスの状態を確認する方法として、UNIXでは古くからpsコマンドが知られている。

 psコマンドで指定するオプションは、UNIXの系統によって異なる。BSD系なら-aと-x、System V系なら-eと-fを併せて指定するとよい*1。両方とも出力される内容はほぼ同じだ。

*1
UNIX互換OSであるLinuxの場合はちょっと特殊で、両方の形式に対応している

・BSD系の場合

% ps -ax

-a:ほかのユーザーのプロセスも表示

-x:制御端末(tty)のないプロセス*2も表示


*2
例えばinetd、Apache(httpd)、BIND(named)などのデーモンサービス

・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サービスを提供しない場合

待機ポートの確認 (netstat)

 稼働中のサービス(プロセス)の中でも、特に外部からのアクセスが可能なものについては十分な確認が必要となる。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:* 
例:待機中のTCPのみ表示

 出力結果より、対象サーバ上で次のポートが待機中であることが分かる。これらの中から不要なサービスが利用している待機ポートを見つけ出す。

ポート番号 プロトコル 使用サービス(プロセス) 使用目的
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サービス

 待機ポートで使用しているサービスの調べ方は、「連載 不正侵入の手口と対策」の“バナーチェックを行う”を参考にしてほしい。

待機ポートとプロセスを同時に確認 (lsof, socklist, sockstat)

  先述の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) 
例:待機ポートの中で、25/tcpのみを表示する
# 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) 
例:待機ポートの中で、1から1024までのTCP、UDPポートを表示する
# 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) 
例:プロセスID 522のコマンドに関する情報を表示

・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            *:*
……省略…… 
       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。