コンソールメッセージを間断無く流すようにしておくと、 簡単に 9600bps のリンクが飽和することがあります。
すべての syslog メッセージをコンソールに表示するのはうまい考えのように見えますが、 実は、権限の無いユーザーが簡単な方法を使って、 リモートコンソールを実質的に使えなくしてしまえるのです。
ですから、 コンソールに出力するシステムログメッセージは、 本当に必要最小限にするように設定してください。 /etc/syslog.conf をちょっと覗いて、 /dev/console で終っている行を探してみて下さい。
この設定ファイルを変更して、 すべてのログメッセージを別のマシンに送り、 そこで記録し解析するという方法を考えてみましょう。 Red Hat Linux 7.2 標準の /etc/syslog.conf を、ログメッセージをログサーバーで記録するように修正したものを Figure 9-2 に示してあります。 syslog.conf の各行を繰り返して、 メッセージのコピーをログサーバーへ送るようにしました。 ログサーバーには loghost.example.edu.au という、DNS の別名があります。 こうしておくと、すべてのリモート機の設定を更新しなくても、 ログサーバーの移動が可能になります。 これで、システム障害の原因を特定する方法が、 もうログメッセージのローカルコピーしかないなどということは無くなります。 ですから、同期をとってファイルに書き込むのを止めれば、 ファイルシステムに不整合が発生する確率は増加しますが、 性能面で多少有利になります (これはファイルシステムがジャーナルを取らないから起こる問題点です)。 ファイル名の直前に - を置けば、 ファイルへの書き込みが同期しなくなります。
Figure 9-2. ログメッセージのコピーをログサーバーへ送るように修正した /etc/syslog.conf
# (メールを除く)info レベル以上のメッセージはログに採取する。 # プライベートな認証メッセージはログに取らない。 *.info;mail.none;authpriv.none;cron.none @loghost.example.edu.au *.info;mail.none;authpriv.none;cron.none -/var/log/messages # authpriv ファイルはアクセス制限をかけている。 authpriv.* @loghost.example.edu.au authpriv.* /var/log/secure # メールのメッセージはすべて一箇所でログに取る。 mail.* @loghost.example.edu.au mail.* -/var/log/maillog # cron関係のログ cron.* @loghost.example.edu.au cron.* -/var/log/cron # 緊急メッセージはみんなに流す *.emerg @loghost.example.edu.au *.emerg * # crit レベル以上のニュースのエラーは特別なファイルに保存する。 uucp,news.crit @loghost.example.edu.au uucp,news.crit -/var/log/spooler # ブートメッセージは boot.logにも保存する。 local7.* @loghost.example.edu.au local7.* -/var/log/boot.log |
ログサーバーは標準の /etc/syslog.conf を使って設定しますが、このファイルは、 リモートの syslog メッセージを受け取れるようにしておきます。 Red Hat Linux 用に設定したこのファイルを、 Figure 9-3 に示します。 システムのログデーモンの設定に加えて、 syslog メッセージの送信元を制限するように IP Tables を設定して、 サービス拒否攻撃も防御して下さい。 また、nscd が動いていて、DNS の逆引きをキャッシュしているのを確認して、 性能改善も行なって下さい。
Figure 9-3. /etc/sysconfig/syslog のオプションを設定して、 リモートのログメッセージを許可する。
# Red Hat Linux のデフォルト値。タイマー起動の ‘ --MARK-- ’ メッセージは書かない。 SYSLOGD_OPTIONS="-m 0" # リモートの syslog メッセージを受け取るようにオプションを追加。 SYSLOGD_OPTIONS="${SYSLOGD_OPTIONS} -r" |
Figure 9-4. remote.example.edu.au への syslog メッセージを制限する
bash# chkconfig iptables on bash# /etc/init.d/iptables restart # 本機からの IP トラフィックをすべて許可する bash# iptables --append INPUT --source 127.0.0.0/8 --in-interface lo --jump ACCEPT # たぶん、他のトラフィックをフィルターにかける … # remote.example.edu.au からの syslog メッセージを受け取る bash# iptables --append INPUT --source remote.example.edu.au --protocol udp --destination-port syslog -j ACCEPT # 予定外の syslog メッセージは黙って落とす bash# iptables --append INPUT --protocol udp --destination-port syslog -j DROP # 動作中の設定を保存する bash# /etc/init.d/iptables save |
Figure 9-5. nscd を使って DNS の 逆引きをキャッシュする。
bash# chkconfig nscd on bash# /etc/init.d/nscd restart |
シリアルコンソールにログインしているユーザーは、 ブロードキャストメッセージを受け取らないでください。 そうするには、 /etc/profile.d に新しいファイルを追加します。 Figure 9-6 に Bourneシェルで使うファイルを示しています。
Figure 9-6. コンソールユーザーへのメッセージ送信を制限する。
# # 参照されるファイルはあるか? if [ -x /usr/bin/mesg -a -x /usr/bin/tty ] then # シリアルコンソールにいるのか? if [ `/usr/bin/tty` = /dev/ttyS0 ] then # ブロードキャストメッセージは受け取らない /usr/bin/mesg n fi fi |
このファイルは頻繁に実行するので、 コードは今より読みずらくはなりますが、 もっと高速にした Figure 9-6 というバージョンを使うことにします。 このバージョンは Figure 9-7 に示しました。
Figure 9-7. /etc/profile.d/mesg.sh、コンソールユーザーへの メッセージ送信を制限する。
# # /etc/profile.d/mesg.sh -- 他の人がシリアルコンソールのユーザーを悩まさないようにする。 [ -x /usr/bin/mesg -a -x /usr/bin/tty -a `/usr/bin/tty` = /dev/ttyS0 ] && /usr/bin/mesg n |
C シェル用も必要ですから、 Figure 9-8 に示しました。
Figure 9-8. /etc/profile.d/mesg.csh、 コンソールユーザーへのメッセージ送信を制限する。
# # /etc/profile.d/mesg.csh -- 他の人がシリアルコンソールのユーザーを悩まさないようにする。 if (-X mesg && -X tty && `tty` == /dev/ttyS0) then mesg n endif |
mesg.sh と mesg.csh は 親シェルが実行するというよりも親シェルに付随するものですが、このファイル には実行パーミッションを設定する必要があります。 このファイルのインストールとパーミッションの設定は、 Figure 9-9 に示した手順で行ないます。
Figure 9-9. ファイルを /etc/profile.d にインストールする。
bash# cp mesg.*sh /etc/profile.d/ bash# chown root:root /etc/profile.d/mesg.*sh bash# chmod u=rwx,g=rx,o=rx /etc/profile.d/mesg.*sh |