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

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

[木村靖,三井物産GTI]
前のページへ 1|2       

不要なサービスを特定する

 不要なサービスかどうかの判断は、そのサーバの使用目的などによって変わってくる。例えば、HTTPサービスのみ提供すればよいのであれば、メール(sendmail)やDNS(BIND)といったサービスは、特に理由がない限り不要であると判断できる。

 このようにして待機ポートのプロセスを1つ1つ調べていくと、おのずと不要なサービスがどれなのかが分かってくる。中には不要なサービスなのかよく分からないものがあるが、そういったときはmanコマンドやWebの検索エンジンなどを使えば、多くの場合、必要な情報はそれで得られるだろう。

 ちなみに、sshでリモートメンテナンスかつHTTPサービスのみ提供するという条件であれば、先述の調査で得たサービスの中では、次のサービスが不要となる。

ポート番号 プロトコル 使用サービス(プロセス) 使用目的
25 tcp Sendmail(sendmail) メール受信
111 tcp、udp portmap RPCポートマップ
5680 tcp Canna(cannaserver) 日本語かな漢字変換
32768 tcp、udp status(rpc.statd) NFSサービス

 不要なサービス(プロセス)の特定が終ったら、最後のステップとして実際にそれら不要なサービスを停止する。

不要なサービスを停止する

 不要と思われるサービス(プロセス)を停止する。サービスを停止する場合は、通常であれば次の3つの手順を踏むことになる。

  • Step.1:プロセスの停止
  • Step.2:起動スクリプトの無効化
  • Step.3:inetd.conf(xinetd.conf)の見直し

Step.1:プロセスの停止

・ kill、pkill

 実行中のプロセスを停止するには、UNIXであればkillコマンドを使うのが一般的だ。

# kill プロセスID

 デフォルトでは、TERM(15)シグナルがプロセスに送られ停止する。

# ps -ef | grep sendmail
root   743  1  0 May10 ?   00:00:00 sendmail: accepting connections
# kill 743 
例:sendmailのサービスを停止する

 もう一度プロセスを確認するとsendmailプロセスは停止している。

# ps -ef | grep sendmail

 最近のUNIXでは、pkillというコマンドも利用されている。pkillは、もともとSolaris 7で実装されたコマンドであったが、最近のLinuxやNetBSDなどでも採用されるようになった。

# pkill sendmail 

 sendmailというパターンの文字列*3にマッチするプロセスを停止する。

*3
類似する名前のプロセスが複数ある場合は注意すること。

コラム killallコマンドに注意

pkillの類似コマンドとして、killallが挙げられる。しかし、このkillallは、OSによって実行内容が異なるので注意が必要だ。

例えば、FreeBSDやLinuxのkillallはpkillとほぼ同じだが、Solaris 2.xでは、「実行中のすべてのプロセスに対してシグナルを送る」の意味になってしまう。そのため、もし管理するサーバの中にSolaris 2.xが含まれる場合は、Solaris 2.xでうっかりkillallを実行しないためにも、日頃からkillallは極力使用せず、killかpkill、起動スクリプトを使う習慣を身に付けておくとよいだろう。


・起動スクリプト

 各ソフトウェアであらかじめ起動スクリプトが用意されている場合があるので、それを使ってサービスを起動/停止する。多くの場合、起動スクリプトにstart(起動)/stop(停止)の引数を渡すだけでよい。

# /etc/init.d/sendmail stop
例:sendmailを停止する - Solaris 8の場合
# /etc/rc.d/init.d/sendmail stop
例:sendmailを停止する - Red Hat Linux 7.3の場合
# /etc/rc.d/sendmail stop
例:sendmailを停止する - NetBSDの場合

・service

 Linuxでは、serviceコマンドで特定サービスのプロセスを停止することも可能だ。

# service サービス名 stop
# service sendmail stop
Shutting down sendmail: [ OK ]
例:sendmailのサービスを停止する

Step.2:起動スクリプトの無効化

 Step.1の手順で停止した場合、たとえそのときはサービス(プロセス)が停止したとしても、次回OSを起動したときにまた起動してしまう。これをさせないようにするためには、起動スクリプトを無効にする必要がある。

 デフォルトインストールされているソフトウェアの多くには、/etc以下に起動スクリプトが格納されていたり、また、起動するための設定が存在する。次にいくつかOS別の例を紹介しよう。

・Red Hat Linuxの場合

 各種ソフトウェアの起動スクリプトは、/etc/rc.d/rc.d ディレクトリ以下に格納される。はランレベルを意味し、通常モードで起動した場合は、/etc/inittabファイルのinitdefaultのランレベルが適用される。

$ grep initdefault: /etc/inittab
id:3:initdefault:

 通常はランレベル3が指定されているため、/etc/rc.d/rc3.d以下のSで始まる名前のスクリプトが起動の対象となる。例えば、sendmailの場合は、/etc/rc.d/rc3.d/S80sendmailが該当する。

 このように、Sで始まるファイルは起動スクリプト、Kで始まるファイルは停止スクリプトとしてそれぞれ実行される。これは単に、Sの場合がstartを、Kの場合がstopを起動スクリプトの引数に渡しているにすぎない。なお、SとKで始まる各スクリプトはシンボリックリンクで、実体は/etc/rc.d/init.d以下に格納されている。

ls -l /etc/rc.d/rc3.d/S80sendmail 
lrwxrwxrwx  1 root root 18 Sep 24  2002 
/etc/rc.d/rc3.d/S80sendmail -> ../init.d/sendmail 

 これらの起動スクリプトを無効にするには、Sで始まるファイル名を別名に変更すればよいが、Red Hat Linuxの場合は、それらを簡単に管理するためのコマンドとしてchkconfigがあらかじめ用意されている。

# chkconfig --list sendmail
sendmail  0:off 1:off 2:on  3:on  4:on  5:on  6:off 
例:chkconfigでsendmailの起動スクリプト(S80sendmail)を無効にする

 ランレベル2、3、4、5が有効(on)であることが分かる。これらすべてを無効(off)にする。

# chkconfig sendmail off
# chkconfig --list sendmail
sendmail  0:off 1:off 2:on  3:off 4:off 5:off 6:off 

 まだランレベル2がoffにならない。個別指定してみる。

# chkconfig --level 2 sendmail off
# chkconfig --list sendmail
sendmail  0:off 1:off 2:off 3:off 4:off 5:off 6:off 

 今度はoffになった。これで次回OS起動時からsendmailは起動しなくなる。

・ Solaris 2.xの場合

 Solaris 2.xは、先述のRed Hat Linuxとほぼ同じ構成になっている。各種ソフトウェアの起動スクリプトは/etc/rc.dディレクトリ以下に格納され、はランレベルを意味し、そして起動時のデフォルトとして/etc/inittabファイルのinitdefaultのランレベルが適用される。

% grep initdefault: /etc/inittab
is:3:initdefault:

 ただし、Solaris 2.xの通常モードの場合は、ランレベル2→3の順に実行されるので、無効にするスクリプトはランレベル2も停止の対象となる。Solaris 2.xもRed Hat Linuxと同様に、先頭がSで始まるファイルが起動スクリプトとなるので、無効にする場合はファイル名の先頭をS以外にすればよい。

# cd /etc/rc2.d
# mv S88sendmail disable.S88sendmail
例:sendmailの場合

・ FreeBSD、NetBSDの場合

 各種ソフトウェアの起動スクリプトは、/etc/rc.dディレクトリ以下に格納され、それらは/etc/defaults/rc.confおよび/etc/rc.confで起動する(yes)/しない(no)が制御される。両者で設定した内容は/etc/defaults/rc.conf→/etc/rc.confの順に読まれ、デフォルト設定値の/etc/defaults/rc.confの内容は/etc/rc.confで上書きされる。そのため従来の起動スクリプトの挙動を変更したい場合、通常は/etc/rc.confに設定するとよい。

sendmail_enable="NONE"
例:sendmail の場合 (FreeBSD) - FreeBSD 4.6以上
sendmail=NO
例:sendmail の場合 (NetBSD) - NetBSD 1.3以上

 それぞれ/etc/defaults/rc.confを参考にするとよい。/etc/defaults/rc.confにNO(NONE)が設定されている場合は、/etc/rc.confに改めて設定する必要はないが、万が一YESになってしまうことを考え、明示的にNO(NONE)を設定しておくのもよいだろう。

Step.3:inetd.conf(xinetd.conf)の見直し

 先に説明した起動スクリプトは、主に単独デーモンで動作するソフトウェアが対象となる。サービスの中には、inetd(xinetd)経由で動作するものもあるため、これらについても見直しを行う必要がある。

注意

見直した結果、inetd(xinetd)経由でサービスを一切起動しない場合は、以下の手順を行わずにinetd(xinetd)自体のプロセスを停止するだけでよい。

# pkill inetd
# pkill xinetd

もちろん、次回から起動しないように起動スクリプトを無効にするのを忘れずに行うこと。


・inetdの場合

 inetdは、デフォルトで/etc/inetd.confの内容に従い、何を実行するのかが決定されるため、不要なサービスを停止する場合は/etc/inetd.confをエディタなどで編集し、無効にする必要がある。

 なお、inetdで有効となるサービスは、/etc/inetd.conf内の先頭が#や空白行以外が該当する。現在有効(と思われる)サービスを確認するには、grepコマンドなどで確認すればよい。

% grep -i "^[0-9a-z]" /etc/inetd.conf

 変更した内容を適用するには、inetdプロセスにHUP(ハングアップ)シグナルを送り、/etc/inetd.confを再読み込みさせる必要がある。

# pkill -HUP inetd

コラム /etc/inetd.confの内容をすべて無効にする

Solaris2.xなどのように、デフォルトでたくさんのサービスが有効になっている場合、viなどのエディタで/etc/inetd.confの内容を1行ずつ編集するのは結構面倒くさい。そこで、そのような場合はsedを使っていったんすべてのサービスを無効にし、必要なサービスのみをviなどで有効にする方法を使うとよい。

# cp -p /etc/inetd.conf /etc/inetd.conf.old
# sed -e 's/^\([^# ]\)/#\1/' /etc/inetd.conf > /tmp/inetd.conf
# cp /tmp/inetd.conf /etc/inetd.conf
# vi /etc/inetd.conf(必要なサービスを有効にする)
# pkill -HUP inetd

タイプミスなどにより、万が一編集に失敗した場合は/etc/inetd.conf.oldを元に戻せばよい。


・xinetdの場合

 xinetdは、/etc/xinetd.confの内容に従い、何を実行するのかが決定されるため、不要なサービスを停止する場合は/etc/xinetd.confをエディタなどで編集し、無効にする必要がある。ただし、Red Hat Linuxなどでは、xinetd.confからさらに/etc/xinetd.dディレクトリ以下の設定ファイルが読まれているため、実際にはそれらのファイルを編集することになる。なお、無効にする場合は、service項目内にdisable = yesを設定する。

service telnet
{
     ……省略……
     disable = yes
} 
例:telnetを無効にする (/etc/xinetd.d/telnet)

 変更した内容を適用するには、xinetdプロセスにHUPシグナルを送り、/etc/xinetd.confを再読み込みさせる必要がある。

# pkill -HUP xinetd

 また、Red Hat Linuxなどでは、chkconfigコマンドでxinetdのサービスを有効/無効にすることが可能だ。

# chkconfig --list telnet
telnet        on
# chkconfig telnet off
# chkconfig --list telnet
telnet        off
# chkconfig telnet off 

 設定した内容は、chkconfigで有効/無効にした時点で有効になるので、あえてkill -HUPを行う必要はない。以上、不要なサービスを停止したら、先述の「現状を確認する」でもう一度確認するとよい。


 今回はセキュアなサーバを構築・運用するための基本である、不要なサービスの停止について説明した。次回は、今回同様にセキュリティの基本であるソフトウェアのアップグレードについて説明する。

筆者紹介

三井物産GTI (現:三井物産セキュアディレクション株式会社

木村靖



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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