3. ステップ1:本当に必要なのはどのサーヴィスか?

この章では、新しくインストールした我々のシステムで、 どのサーヴィスが動いているかを見て、どれが本当に必要なものかを決め、 それ以外のものを切り捨てましょう。 どのようにサーバと TCP 接続が働いているかに詳しくない方は、 まず補遺のサーバとポートに ついての章を読むと良いでしょう。 また netstat ユーティリティに馴染みがないなら、 あらかじめその簡単な概説 を読むと良いでしょう。 さらに補遺には ポートについての章と、 それに対応するサーヴィスの章がありますので、参考になるかもしれません。

ここでの目的は可能な限り多くのサーヴィスを停止することです。 もし、その全部を停止できるなら、 または少なくとも外部に接続しているものを止められるなら、 大変に結構なことです。 以下に手引きにする簡単なルールを挙げましょう:

3.1. システム検査

それで、結局このシステムでは実際に何が走っているのでしょうか? 動いているに"違いない"ものや、 または、"そう思っている"ものが実際に動いているかどうか、 何もかも当然のことだと思うのはやめましょう。

どのサーヴィスがインストールされていて、実際動いているかは、 Red Hat のどのバージョンが選ばれているか、 どのインストールオプションが選択されているかに強く依存します。 初期のリリースでは多くのサーヴィスをスタートさせる傾向が大いにありましたし、 それゆえにユーザにどれが必要でどれがそうでないかを考えさせていました。 最近のバージョンでははるかに用心深くなっています。 しかし、これによって、動いているであろうサーヴィスを事前に数え上げる ことが不可能になっています。 しかし、ご心配なく。 そもそも、動いているであろう、 などと勝手に決め付けたサーヴィスを信用すべきでないからです。 しなければならないことは、 動作中の全てのサーヴィスのリストを作ることです。

さあ、xterm を開いて、 su でルートになりましょう。 行が折り返されないようにウィンドウを広げる必要があるでしょう。 コマンド、netstat -tap |grep LISTEN を使ってください。これによって、LISTEN というキーワードが示されている全ての現在動作中のサーバが、 各サーヴィスをスタートさせた "PID""プログラム名" とともに、リストアップされます:


# netstat -tap |grep LISTEN
  *:exec               *:*        LISTEN    988/inetd          
  *:login              *:*        LISTEN    988/inetd          
  *:shell              *:*        LISTEN    988/inetd          
  *:printer            *:*        LISTEN    988/inetd          
  *:time               *:*        LISTEN    988/inetd          
  *:x11                *:*        LISTEN    1462/X              
  *:http               *:*        LISTEN    1078/httpd          
  bigcat:domain        *:*        LISTEN    956/named           
  bigcat:domain        *:*        LISTEN    956/named           
  *:ssh                *:*        LISTEN    972/sshd            
  *:auth               *:*        LISTEN    388/in.identd
  *:telnet             *:*        LISTEN    988/inetd          
  *:finger             *:*        LISTEN    988/inetd
  *:sunrpc             *:*        LISTEN    1290/portmap
  *:ftp                *:*        LISTEN    988/inetd
  *:smtp               *:*        LISTEN    1738/sendmail: accepting connections 
  *:1694               *:*        LISTEN    1319/rpc.mountd
  *:netbios-ssn        *:*        LISTEN    422/smbd

 

Red Hat 7.x と Mandrake 8.x とそれ以降のバージョンの ユーザは inetd のところが xinetd になっているでしょう。 上では、 はじめの三つのコラムは見やすいように省いてあることに注意してください。 もしあなたが得たリストが上の例と同じくらい長いものなら、 これから少なからぬ仕事が待ち構えていますよ! これに近い数のサーバが実際に動いている必要があることは、 まったくありそうにないことですから。

上の例はたくさんのシステム設定のほんの一つの例に過ぎない、 ということに注意してください。 あなたの場合にはずいぶんと違ったものであるかも知れません。

このどれも何のことやら分らない? 補遺のnetstatチュートリアルを読んで、 その働きを理解してくれていることと思いますが、 上に挙げた例で各サーバが何なのか、何をするものかを、 正確に理解することは、この文書の範囲に含まれません。 もし、そのサーヴィスが実際に重要なものならば、 個々のシステムについての文書(例えば、インストールガイドや、 man ページなど)を調べなければならないでしょう。 例えば、"exec", "login", "shell" は重要そうに見えますか?もちろんそうです。 しかし、これらは実際はその見かけ通りのものではありません。 実のところ、それらは rexec, rlogin, rsh といった"r" コマンド、 つまりリモート用のコマンドです。 これらは古臭くて、不必要で、実際のところ、 インターネットにさらしていると非常に危険です。

何が必要で何が必要でないか、 そして何を捨てて何をこの bigcat においておくか について簡単な仮説を二、三、用意しておきましょう。 bigcat はデスクトップで走らせていますから、 もちろん X11 は残す必要があります。 もし bigcat が何かのサーバ専門に使われていたなら、 X11 は不要だったでしょう。 もし物理的につながったプリンタがあるなら、 プリンタ (lp) デーモンは残すべきです。そうでないなら要りません。 プリントサーバは無害そうに見えますが、ポートを開いたままに出来るので、 やはり潜在的なターゲットになります。 もし他のホストから bigcat の中に ログインする予定があるなら、 sshd (セキュアシェルデーモン)が必要でしょう。 我々の LAN に Microsoft のホストがあるならば、 Samba が欲しいかもしれません。 でしたら、smbd は残さなくてはいけませんが、 そうでなければ全く不必要です。 この例ではその他のものは全部、(選択するのは自由ですが、) 通常の機能のシステムなら不必要で、おそらく切り捨てるべきでしょう。 あなたが認識していないものがある?あやふやなものがある? それは切りましょう!

結論:bigcat はプリンタがつながっているデスクトップマシンですから、 "x11""printer" が必要になるでしょう。 bigcat は MS ホストとともに LAN 上にあって、ファイルを共有したり、 それらから印刷したりしますから、 "netbios-ssn" (smbd) が必要です。また他のマシンからログインできるように、 "ssh" も必要です。 この特定の場合においては、その他のものは全て不必要です。

これが心配ですか?そうなら、 自分が行った変更を書き留めておくか、または、コマンド: netstat -tap |grep LISTEN > ~/services.lstを使って、 netstat から得たサーバのリストを保存して おくのがよいでしょう。 このコマンドで将来に参照するためのリストが "services.lst" の名前でホームディレクトリに保存されます。

ここで残すことに決めたものも、 そもそも安全なものだとは言えません。 単に、これらが必要であろう、というだけです。 ですから、 ファイアーウォールや(以下にあるような)他の方法を通して、 これらを扱わなければいけません。

上の例の中の telnetftp デーモンはサーバであり、 "リスナー"(ポートで耳をすませているもの)だということは、 注意しておく価値があるでしょう。 これらはあなたのマシンに入ってくる接続を受け付けます。 あなたが単に ftp または telnet クライアントを使うためには、 これらは必要ないし、望んでもいないことです。 例えば、あなたは単に ftp クライアントを用いて、 FTP サイトからファイルをダウンロードすることができます。 あなたの側で ftp サーバを走らせる必要はまったくありませんし、 深刻なセキュリティ上の問題を持つことになります。

個々の事情によっては、 上で得た結論に例外を設けた方が良いこともあるでしょう。 後の章を参照してください。

3.2. 危険地帯(または r00t m3 pl34s3)

以下はインターネット上で走らせるべきでない サーヴィスのリストです。 これらは動かないようにしておくか(以下を見てください)、 アンインストールしてください。または、 もし本当にこれらのサーヴィスをローカルで走らせたいなら、 それらが最新のパッチを当てたバージョンであり、かつ、 効果的にファイアーウォールで守られていることを確認してください。 そして、今のところファイアーウォールを持っていないというなら、 ファイアーウォールが立ち上がって適切に動いていることが検証されるまで、 それらのサーヴィスを止めておいてください。 これらはその性質からして潜在的に危険であり、 クラッカーの一番の標的になります。

以上は必ずしも完全なリストではありません。 ただ、デフォルトの Red Hat インストールでは時々、 最初から動いているサーヴィスとして良く見られるものだということです。 そして逆に言えば、 このリストに出ていない他のサーヴィスがもとより 安全なものだということでもありません。

3.3. サーヴィスの停止

次のステップは我々の「殺しのリスト」に挙がっている各サーバが どこで開始されたのかを調べることです。 これが netstat の出力から明らかでないならば、 最後のコラムの "Program name""PID" の 情報から、ps, find, grep, locate などのコマンドを 使ってさらなる情報を得てください。 この例が補遺の netstat チュートリアルの プロセスの所有者 の章に挙げられています。 もしサーヴィス名かポート番号が馴染みのないものなら、 そのシステムの /etc/services ファイルに 簡単な解説があります。

chkconfig は init スクリプトで 開始されたサーヴィスをコントロールするには非常に便利なコマンドです (以下の例を見てください)。 また、xinetd が使われているなら、 同様にそのサーヴィスもコントロールできます。 chkconfig は、 どのサーヴィスがそのシステムで走るように設定されているかを教えてくれますが、 これは必ずしも本当に、実際に、動作している全てのサーヴィスではありません。 つまり、他の方法で、例えば rc.local から、 開始されているかもしれないサーヴィスもあるからです。 それはリアルタイムのシステム監査ツールというよりも、 設定用のツールなのです。

今、我々は自分のシステムを壊しつつあって、 覆水盆に返らずなどということにならないか、 と心配しているのではないですか? もしそうなら、こうしてみてください: つまり、"危険地帯"で上のリストに挙がった全てを停止し、 そしてしばらくの間システムを走らせてみます。 大丈夫ですか? 上で不必要だと判断したものたちの一つを止めてみましょう。 それでしばらくシステムを走らせてみます。 この手続きを最小の状態になるまで繰り返します。 これがうまくいけば、この変更を採用してそのまま保ちましょう。 (以下を参照してください。)

究極の目的は今そのサーヴィスを停止することではなくて、 それが恒常的に停止されていることをはっきりさせることです! ですから、あなたがここでどのようなステップをとったにせよ、 次にリブートした後には必ず確認してください。

システムのサーヴィスは様々の場所で色々な方法で開始されます。 その最も普通の方法を見てみましょう。 あなたのシステムもおそらくそのように動いているだろうと思います。 ほとんどのディストリビューションにおいて、 システムのサーヴィスは典型的には "init" スクリプト、または inetd (またはその代替物である xinetd) のどちらかによって開始されます。

3.3.1. init サーヴィスを停止する

init サーヴィスは典型的には、ブートプロセス、 またはランレベルの切り替え時に自動的に開始されます。 どのサーヴィスをどのランレベルで開始し、停止するかを決定するためには、 シンボリックリンクを使う方法があります。 スクリプト自身は /etc/init.d/ の中 (または、 Red Hat の古いバージョンでは /etc/rc.d/init.d/ の中かもしれません) に置かれているはずです。

以下のようにすれば、 このスクリプトのリストを得ることができます。


  # ls -l /etc/rc.d/init.d/ | less 

 

走っているサーヴィスを今、止めるには、 root になって以下のようにします:


 # /etc/init.d/<$SERVICE_NAME> stop

 

ここで "$SERVICE_NAME" はその init スクリプトの名前で、 常にではありませんが、しばしばそのサーヴィスの名前そのものと同じです。 古い Red Hat バージョンでは代わりに /etc/rc.d/init.d/ がパスになっているかもしれません。

これはこの特定のサーヴィスを今、停止することができるだけで、 追加的なステップをとらなければ、 次のリブート時、またはランレベル変更時には再スタートしてしまいます。 ですから、init 型のサーヴィスについては、 この作業は実際二段階のプロセスということになります。

chkconfig は、 どのサーヴィスが各ランレベルで開始されているかを調べるために、 そして不必要なサーヴィスを停止するために使うことができます。 制御下にある全てのサーヴィスを見るには、 xterm で以下のコマンドをタイプしてください:

 
 # chkconfig --list | less
 
 

"オン"になっているものだけを見るには 次のようにします:

 
 # chkconfig --list | grep "\bon\b" | less
 
 

最初のコラムはそのサーヴィスの名前で、 残りのコラムは様々なランレベルです。 我々が心配する必要があるのは、 一般的にはランレベル3(テキストコンソールログインのためのブート) とレベル5(すぐ X11 ログインするためのブート) についてだけです。 xinetd サーヴィスはコラムを持ちません。 と言うのも、 xinetd 自身によって制御されているからです。

サーヴィスを"オフ"にするためのコマンドの例:

 
 # chkconfig portmapper off
 # chkconfig nfs off
 # chkconfig telnet off
 # chkconfig rlogin off
 
 

最後の二つは xinetd サーヴィスである ことに注意してください。 非常に簡単で素敵なツールがあります! Red Hat はランレベルとサーヴィスの設定のためのコマンド ntsysvtksysv (GUI) を用意しています。 追加するコマンドラインオプションについては man ページを見てください。

もしあるサーヴィスが必要でないことがわかっているなら、 また一つの手段はそのパッケージをアンインストールしてしまうことです。 これはなかなか良い、間違いのない方法で、恒常的に停止できます。 またこの方法は、 インストールされているすべてのパッケージをアップデートして 最新のものに保ち続ける(ステップ2)、 という潜在的な問題を解決してくれてもいます。 RPM を使えば、 あなたの気が変わったときに、 パッケージを再インストールするのもとても簡単です。

RPM でパッケージをアンインストールするには 以下のようにします:


 # rpm -ev telnet-server  rsh  rsh-server

 

上のコマンドはこれ一つで "telnet サーバ" パッケージ (telnet クライアントではありません!)、 "rsh" クライアントと "rsh サーバ" パッケージをアンインストールしてくれます。 Red Hat には gnorpm という GUI によるRPM 管理ユーティリティも含まれていて、 同じことが可能です。

3.3.2. inetd

inetd はサブデーモンを生むために使われるので、 "スーパーデーモン" と呼ばれます。 inetd 自身は一般に init スクリプト経由で開始され、 設定ファイル /etc/inetd.conf で 可能になっているサーヴィスによって決まる様々なポートに "耳をすませる"ことになります。 ここで挙げられているどのサーヴィスも inetd に 制御されます。 同様に、"プログラム名"の後の最後のコラムに "inetd" と書かれている netstat 出力 の中の listen している(つまり、耳をすませている)サーバは皆、 inetd によって開始されることになります。 これらのサーヴィスを停止するためには、 inetd の設定を調整する必要があるでしょう。 xinetdinetd の の拡張された代替物ですが、設定方法は異なります (以下の次の章を見てください)。

以下は典型的な inetd.conf からの抜粋です。 行の最初に "#" がついているサーヴィスは "コメントアウト"されていて、 inetd には無視されるので、 結果として無効にされます。


#
# inetd.conf  This file describes the services that will be available
#    through the INETD TCP/IP super server.  To re-configure
#    the running INETD process, edit this file, then send the
#    INETD process a SIGHUP signal.
#
# Version:  @(#)/etc/inetd.conf  3.10  05/27/93
#
# Authors:  Original taken from BSD UNIX 4.3/TAHOE.
#    Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
#
# Modified for Debian Linux by Ian A. Murdock <imurdock@shell.portal.com>
#
# Echo, discard, daytime, and chargen are used primarily for testing.
#
# To re-read this file after changes, just do a 'killall -HUP inetd'
#
#echo  stream  tcp  nowait  root  internal
#echo  dgram  udp   wait    root  internal
#discard  stream  tcp  nowait  root  internal
#discard  dgram  udp   wait    root  internal
#daytime  stream tcp   nowait  root  internal
#daytime  dgram  udp   wait    root  internal
#chargen  stream tcp   nowait  root  internal
#chargen  dgram  udp   wait    root  internal
time  stream    tcp   nowait  root  internal
#
# These are standard services.
#
#ftp     stream  tcp   nowait  root  /usr/sbin/tcpd  in.ftpd -l -a
#telnet  stream  tcp   nowait  root  /usr/sbin/tcpd  in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
#shell  stream  tcp  nowait  root  /usr/sbin/tcpd  in.rshd
#login  stream  tcp  nowait  root  /usr/sbin/tcpd  in.rlogind
#exec   stream  tcp  nowait  root  /usr/sbin/tcpd  in.rexecd
#comsat dgram   udp  wait    root  /usr/sbin/tcpd  in.comsat
#talk   dgram   udp  wait    root  /usr/sbin/tcpd  in.talkd
#ntalk  dgram   udp  wait    root  /usr/sbin/tcpd  in.ntalkd
#dtalk  stream  tcp  wait    nobody /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
#pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd  ipop2d
pop-3    stream  tcp     nowait  root    /usr/sbin/tcpd  ipop3d
#imap    stream  tcp     nowait  root    /usr/sbin/tcpd  imapd
#
# The Internet UUCP service.
#
#uucp  stream tcp nowait uucp /usr/sbin/tcpd  /usr/lib/uucp/uucico -l
#

<snip>

 

上の例では二つのサーヴィス、 timepop3 が可能になっています。 これらを無効にするには、 テキストエディタでこのファイルを開いて、 この二つのサーヴィスを "#" でコメントアウトし、 ファイルを保存して、(ルートとして)inetd を 再スタートするだけです:


 
  # /etc/rc.d/init.d/inetd restart  

 

エラーがないかログを調べて、 netstat を再び走らせ、 全てがうまく行っているか確かめてください。

同じ情報を手っ取り早く得るには、 以下のように grep を使います。


 $ grep  -v '^#' /etc/inetd.conf
 time     stream  tcp     nowait  root  internal
 pop-3    stream  tcp     nowait  root  /usr/sbin/tcpd  ipop3d

 

またしても、それが何だか知らないものが出てきましたか? でしたら、十中八九あなたはそれを使っていないので、 無効化すべきです。

init サーヴィスの設定とは違って、 これは後まで続く変更なので、必要なのはこのステップ一回だけです。

あちこちに広がっている一つの神話を暴露しましょう: /etc/services ファイルから 項目をコメントアウトしたり削除したりすることで、 サーヴィスを無効化すべきではありません。 これはある場合には、望んだ効果が得られるかもしれませんが、 正しい方法ではなく、他のシステムユーティリティの通常の操作を 邪魔することになるかもしれません。

3.3.3. xinetd

xinetd は 拡張された機能を持つ inetd の代替物です。 Red Hat は 7.0 以降のリリースから xinetd を含んでいます。 これは本質的に inetd と同じ目的を果たしますが、 設定が異なります。 設定は /etc/xinetd.conf ファイルか、 /etc/xinetd.d/ ディレクトリの個別のファイルで 行うことができます。 個別のサーヴィスの設定は /etc/xinetd.d/* 以下の個別のファイルで行います。 xinetd サーヴィスの停止は、 対応する設定箇所かファイルを削除することで可能です。 または、テキストエディタを用いて、単に適当なサーヴィスについて disable = yes と設定することでも可能です。 または、chkconfig でもできます。 このとき、xinetd は再スタートする必要があります。 構文と設定オプションについては man xinetdman xinetd.conf を見てください。以下はxinetd の設定例です:


 # default: on
 # description: The wu-ftpd FTP server serves FTP connections. It uses \
 #       normal, unencrypted usernames and passwords for authentication.
 service ftp
 {
        disable                 = no
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/in.ftpd
        server_args             = -l -a
        log_on_success          += DURATION USERID
        log_on_failure          += USERID
        nice                    = 10
 }

 

以下のように、動作しているサーヴィスのリストを簡単に得ることができます。


 $ grep disable /etc/xinetd.d/* |grep no
 /etc/xinetd.d/finger:   disable = no
 /etc/xinetd.d/rexec:    disable = no
 /etc/xinetd.d/rlogin:   disable = no
 /etc/xinetd.d/rsh:      disable = no
 /etc/xinetd.d/telnet:   disable = no
 /etc/xinetd.d/wu-ftpd:  disable = no

 

ここで、上の出力にはいくつか赤信号が点いています。 圧倒的多数のシステムでは、上のどれも悪影響なしに停止できます。 確かかって?そのサーヴィスを停止して試してみてください。 不必要なサーヴィスを無効化して、xinetd を 再スタートさせてください。


 
  # /etc/rc.d/init.d/xinetd restart  

 

3.3.4. 全部失敗したときには

もしあなたがサーヴィスを停止する"正しい" 方法を見つけられないとしても、または、 開始されているあるサーヴィスが どうやってどこで開始されたのかわからないとしても、大丈夫。 そのプロセスを"殺す"ことができます。 これを行うには、PID(プロセスI.D.)を知る必要があります。 これは ps, top, fuser といったコマンド、 または他のシステムユーティリティを使って見つけることができます。 topps については、 最初のコラムに出ている数字がこれです。 例については、 補遺のポートとプロセスオーナーを見てください。

例(ルート権限で):


 # kill 1163

 

そして、そのプロセスが消えていることを確認するために、 もう一度 topps を走らせてください。


 # kill -KILL 1163

 

この二番目に出ている "KILL" に注意してください。 この命令は、 そのプロセスを所有しているユーザか、またはルートのどちらかによって、 実行されなければなりません。さて、このプロセスがどこからどうやって 開始されたか調べにいきましょう ;-)

/proc ファイルシステムは各プロセスについての さらなる情報を見つけ出すために用いることもできます。 PID を使って、謎のプロセスへのパスを見つけることができます。


 $ /bin/ps ax|grep tcpgate
  921 ?   S    0:00        tcpgate

 


 # ls -l /proc/921/exe
 lrwxrwxrwx 1 root  root  0 July 21 12:11 /proc/921/exe -> /usr/local/bin/tcpgate

 

3.4. 例外事項

上では、全ての不必要なサーヴィスを 停止する基準を用いましたが、 時にそれはそんなに明白なことではありません。 そして、時折、ある人の設定で要求されていることは、 他の人にとってのものと異なるかも知れません。 このようなカテゴリーに入る二、三の一般的なサーヴィスを見てみましょう。

再び、我々の目安となるのは、 必要としていないものはそもそも走らせない、という単純なルールです。 もしそれらのどれも必要としていないなら、 ファイヤーウォールのルールや他の仕組み(以下を見てください) によるこの種の制限ポリシーを運営するにあたって、 一番に停止するべき候補です。

3.5. ステップ1のまとめと結論

この章では、 システム上でどんなサーヴィスが走っているかを同定する方法を学び、 どれが必要なサーヴィスかを決めるためのポイントをいくつか紹介しました。 さらに、そのサーヴィスがどこで開始されたのかを見つけ、 それらを停止する方法を学びました。 もしこれがよく分っていないようなら、今が上を読み返す良いチャンスです。

望むらくは、 あなたは上で示したステップを既にとってくれていることでしょう。 その結果を netstat で再度テストして、 望みの結果が達成されていること、そして、 本当に必要なサーヴィスだけが走っていることを確認してください。

次回のリブート時、パッケージを更新した時 (新しい設定がそっと忍び込んでいないことを確認するためです)、 そしてシステムがアップグレードされた時や新たにインストールされた時は常に、 このようなチェックをすることをお勧めします。