9.4. コンソールメッセージを制限する

9.4.1. システムログが出力するコンソールメッセージを制限する

コンソールメッセージを間断無く流すようにしておくと、 簡単に 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

9.4.2. コンソールに対するブロードキャストメッセージを制限する

シリアルコンソールにログインしているユーザーは、 ブロードキャストメッセージを受け取らないでください。 そうするには、 /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.shmesg.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