不要なサービスかどうかの判断は、そのサーバの使用目的などによって変わってくる。例えば、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つの手順を踏むことになる。
・ 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プロセスは停止している。
# ps -ef | grep sendmail
最近のUNIXでは、pkillというコマンドも利用されている。pkillは、もともとSolaris 7で実装されたコマンドであったが、最近のLinuxやNetBSDなどでも採用されるようになった。
# pkill sendmail
sendmailというパターンの文字列*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
# /etc/rc.d/init.d/sendmail stop
# /etc/rc.d/sendmail stop
・service
Linuxでは、serviceコマンドで特定サービスのプロセスを停止することも可能だ。
# service サービス名 stop
# service sendmail stop Shutting down sendmail: [ OK ]
Step.1の手順で停止した場合、たとえそのときはサービス(プロセス)が停止したとしても、次回OSを起動したときにまた起動してしまう。これをさせないようにするためには、起動スクリプトを無効にする必要がある。
デフォルトインストールされているソフトウェアの多くには、/etc以下に起動スクリプトが格納されていたり、また、起動するための設定が存在する。次にいくつかOS別の例を紹介しよう。
・Red Hat Linuxの場合
各種ソフトウェアの起動スクリプトは、/etc/rc.d/rc
$ 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
ランレベル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
% 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
・ 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=NO
それぞれ/etc/defaults/rc.confを参考にするとよい。/etc/defaults/rc.confにNO(NONE)が設定されている場合は、/etc/rc.confに改めて設定する必要はないが、万が一YESになってしまうことを考え、明示的にNO(NONE)を設定しておくのもよいだろう。
先に説明した起動スクリプトは、主に単独デーモンで動作するソフトウェアが対象となる。サービスの中には、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 }
変更した内容を適用するには、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を行う必要はない。以上、不要なサービスを停止したら、先述の「現状を確認する」でもう一度確認するとよい。
今回はセキュアなサーバを構築・運用するための基本である、不要なサービスの停止について説明した。次回は、今回同様にセキュリティの基本であるソフトウェアのアップグレードについて説明する。
Copyright © ITmedia, Inc. All Rights Reserved.