この章では、新しくインストールした我々のシステムで、 どのサーヴィスが動いているかを見て、どれが本当に必要なものかを決め、 それ以外のものを切り捨てましょう。 どのようにサーバと TCP 接続が働いているかに詳しくない方は、 まず補遺のサーバとポートに ついての章を読むと良いでしょう。 また netstat ユーティリティに馴染みがないなら、 あらかじめその簡単な概説 を読むと良いでしょう。 さらに補遺には ポートについての章と、 それに対応するサーヴィスの章がありますので、参考になるかもしれません。
ここでの目的は可能な限り多くのサーヴィスを停止することです。 もし、その全部を停止できるなら、 または少なくとも外部に接続しているものを止められるなら、 大変に結構なことです。 以下に手引きにする簡単なルールを挙げましょう:
外部からアクセス可能であるようなサーヴィスが一つも走っていなくても、 十分完全なインターネット接続を持つことは完璧に可能です。 可能であるだけでなく、多くの場合それが望ましくもあります。 ここでの原則は、 そもそも開いていないポートを通って首尾よく侵入することは 決して出来ないということです。 なぜなら、開いていなければ、 どのサーバもそこで listen して(耳をすませて)いないからです。 サーバなし、開いているポートなし、弱点もなし、です。 すくなくとも外部からの接続に関してはそうです。
もしあなたがあるサーヴィスを認識していないとすると、 本当にはそれを必要としていない可能性はかなりあります。 そう仮定して、それを停止してしまうことにしましょう。 これは危険に聞こえるかもしれませんが、頼るに足るなかなか良いルールです。
いくつかのサーヴィスはそもそも、 インターネット上を走らせるように設計されていません。 もしあなたがそれを本当に必要なものだと決定したとしても。 これらについては危険だと旗を立てておいて、後の章で取り組むことにしますので、 それらが本当に必要なサーヴィスで、 他に良い代替策がない場合には、そちらを見てください。
# 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 |
上の例はたくさんのシステム設定のほんの一つの例に過ぎない、 ということに注意してください。 あなたの場合にはずいぶんと違ったものであるかも知れません。
このどれも何のことやら分らない? 補遺の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" の名前でホームディレクトリに保存されます。
ここで残すことに決めたものも、 そもそも安全なものだとは言えません。 単に、これらが必要であろう、というだけです。 ですから、 ファイアーウォールや(以下にあるような)他の方法を通して、 これらを扱わなければいけません。
上の例の中の telnet と ftp デーモンはサーバであり、 "リスナー"(ポートで耳をすませているもの)だということは、 注意しておく価値があるでしょう。 これらはあなたのマシンに入ってくる接続を受け付けます。 あなたが単に ftp または telnet クライアントを使うためには、 これらは必要ないし、望んでもいないことです。 例えば、あなたは単に ftp クライアントを用いて、 FTP サイトからファイルをダウンロードすることができます。 あなたの側で ftp サーバを走らせる必要はまったくありませんし、 深刻なセキュリティ上の問題を持つことになります。
個々の事情によっては、 上で得た結論に例外を設けた方が良いこともあるでしょう。 後の章を参照してください。
rpc.* サーヴィス、リモートプロシージャ Call.*, など。 典型的なのは NFS と NIS に関係したもの(上を参照)です。
BIND (named), DNS パッケージ。いくらか手をかければ、 これは大きなリスクなしに使えますが、多くの場合には必要のないものですし、 それをどう使うにせよ特別な扱いが要求されます。 例外の章と、 個別のアプリケーション の特別な扱い方を参照してください。
メイル配送エージェント、つまり "MTA" (sendmail, exim, postfix, qmail)。 一台のコンピュータ上のインストールではほとんどの場合、 これらが本当に必要になることはないでしょう。 あなたが、インターネットホストから(指定された MX box として) 直接にメイルを受け取るのではなく、 プロバイダの POP サーバを使うのなら必要ありません。 LAN 上の他のホストから直接 メイルを受け取っているのならば、必要かもしれませんが、 最初はこれを動かさない方が安全です。 後に、ファイアーウォールとアクセスポリシーが設定されてから、 ローカルインターフェース上で動かすことができますから。
以上は必ずしも完全なリストではありません。 ただ、デフォルトの Red Hat インストールでは時々、 最初から動いているサーヴィスとして良く見られるものだということです。 そして逆に言えば、 このリストに出ていない他のサーヴィスがもとより 安全なものだということでもありません。
次のステップは我々の「殺しのリスト」に挙がっている各サーバが どこで開始されたのかを調べることです。 これが netstat の出力から明らかでないならば、 最後のコラムの "Program name" か "PID" の 情報から、ps, find, grep, locate などのコマンドを 使ってさらなる情報を得てください。 この例が補遺の netstat チュートリアルの プロセスの所有者 の章に挙げられています。 もしサーヴィス名かポート番号が馴染みのないものなら、 そのシステムの /etc/services ファイルに 簡単な解説があります。
chkconfig は init スクリプトで 開始されたサーヴィスをコントロールするには非常に便利なコマンドです (以下の例を見てください)。 また、xinetd が使われているなら、 同様にそのサーヴィスもコントロールできます。 chkconfig は、 どのサーヴィスがそのシステムで走るように設定されているかを教えてくれますが、 これは必ずしも本当に、実際に、動作している全てのサーヴィスではありません。 つまり、他の方法で、例えば rc.local から、 開始されているかもしれないサーヴィスもあるからです。 それはリアルタイムのシステム監査ツールというよりも、 設定用のツールなのです。
今、我々は自分のシステムを壊しつつあって、 覆水盆に返らずなどということにならないか、 と心配しているのではないですか? もしそうなら、こうしてみてください: つまり、"危険地帯"で上のリストに挙がった全てを停止し、 そしてしばらくの間システムを走らせてみます。 大丈夫ですか? 上で不必要だと判断したものたちの一つを止めてみましょう。 それでしばらくシステムを走らせてみます。 この手続きを最小の状態になるまで繰り返します。 これがうまくいけば、この変更を採用してそのまま保ちましょう。 (以下を参照してください。)
究極の目的は今そのサーヴィスを停止することではなくて、 それが恒常的に停止されていることをはっきりさせることです! ですから、あなたがここでどのようなステップをとったにせよ、 次にリブートした後には必ず確認してください。
システムのサーヴィスは様々の場所で色々な方法で開始されます。 その最も普通の方法を見てみましょう。 あなたのシステムもおそらくそのように動いているだろうと思います。 ほとんどのディストリビューションにおいて、 システムのサーヴィスは典型的には "init" スクリプト、または inetd (またはその代替物である xinetd) のどちらかによって開始されます。
以下のようにすれば、 このスクリプトのリストを得ることができます。
# ls -l /etc/rc.d/init.d/ | less |
走っているサーヴィスを今、止めるには、 root になって以下のようにします:
# /etc/init.d/<$SERVICE_NAME> stop |
# chkconfig --list | less |
# chkconfig --list | grep "\bon\b" | less |
# chkconfig portmapper off # chkconfig nfs off # chkconfig telnet off # chkconfig rlogin off |
RPM でパッケージをアンインストールするには 以下のようにします:
# rpm -ev telnet-server rsh rsh-server |
以下は典型的な 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> |
# /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 |
またしても、それが何だか知らないものが出てきましたか? でしたら、十中八九あなたはそれを使っていないので、 無効化すべきです。
# 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 |
# /etc/rc.d/init.d/xinetd restart |
もしあなたがサーヴィスを停止する"正しい" 方法を見つけられないとしても、または、 開始されているあるサーヴィスが どうやってどこで開始されたのかわからないとしても、大丈夫。 そのプロセスを"殺す"ことができます。 これを行うには、PID(プロセスI.D.)を知る必要があります。 これは ps, top, fuser といったコマンド、 または他のシステムユーティリティを使って見つけることができます。 top と ps については、 最初のコラムに出ている数字がこれです。 例については、 補遺のポートとプロセスオーナーを見てください。
例(ルート権限で):
# kill 1163 |
そして、そのプロセスが消えていることを確認するために、 もう一度 top か ps を走らせてください。
# 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 |
もし、identd が必要ならば、 以下のように、 報せる情報を大いに減らしてくれる設定オプションがあります:
/usr/sbin/in.identd in.identd -l -e -o -n -N |
BIND (named) - これはしばしばデフォルトでインストールされていますが、 実際に必要になるのは、あるドメインの、 オーソライズされたネームサーバを運用するときだけです。 もしあなたがこれが何を意味しているのかよくわからないなら、 これは絶対に不要です。おそらく、BIND はインターネット上で 一番狙われているターゲットでしょう。 BIND は、 "キャッシング" オンリーモードでしばしば用いられていて、 これは大変便利ですが、 インターネットに完全にさらす必要はありません。 つまり、それは適用を制限するか、 ファイアーウォールで守るべきです。 以下の 個別のアプリケーション の 特別な運用法の箇所を参照してください。