タグ・アーカイブ: syslog

ルーターやスイッチのsyslogをRHELなマシンのsyslog-ngで受け取るという要件があったので、練習がてらうちで実験してみました。うちにはsyslog飛ばせるマシンがなかったので、2組のサーバをCentOSで構築し、1台目のマシンのログを2台目のマシンへ飛ばすことでリハーサルとしました。

ログ受信側では、/var/log/syslog-ng ディレクトリの下に、IPアドレスとファシリティごとにログを取るようにします。

参考サイト
http://www.kuwazou.net/blog/cat21/syslogng/
http://d.hatena.ne.jp/ragtarou/20080505

■■ ログ送信側サーバ環境

[oresama@vh010 ~]$ cat /etc/redhat-release
CentOS release 4.6 (Final)

[oresama@vh010 ~]$ uname -a
Linux vh010.example.com 2.6.9-67.0.22.EL #1 Wed Jul 23 17:17:45 EDT 2008 i686 i686 i386 GNU/Linux

IPアドレスは 192.168.0.10

※ 今時点では、syslog-ngではなくsyslogdを使う

■■ ログ受信側サーバ環境

[oresama@vh020 ~]$ cat /etc/redhat-release
CentOS release 4.6 (Final)

[oresama@vh020 ~]$ uname -a
Linux vh020.example.com 2.6.9-67.0.22.EL #1 Wed Jul 23 17:17:45 EDT 2008 i686 i686 i386 GNU/Linux

IPアドレスは 192.168.0.20

■■ ログ送信側の設定

vh020 (192.168.0.20)へログを飛ばすには、syslog.confの末尾に一行
*.*                                                     @192.168.0.20
と追加し、syslogdを再起動するだけです。

[oresama@vh010 ~]$ sudo cp -p /etc/syslog.conf /etc/syslog.conf.orig
[oresama@vh010 ~]$ sudo vi /etc/syslog.conf

ここを
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

こうする
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
*.*                                                     @192.168.0.20

[oresama@vh010 ~]$ sudo /etc/init.d/syslog restart
Shutting down kernel logger:                               [  OK  ]
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
Starting kernel logger:                                    [  OK  ]

■■ ログ受信側にてsyslog-ng インストール

本日時点で最新のファイルを確認します。
http://rpm.pbone.net/index.php3?stat=26&dist=52&size=168335&name=syslog-ng-2.0.9-4.el5.i386.rpm

が、これだとglibcを最新にしないといけないので、el4対応の少しバージョンが下がったものをもってきます。
http://rpm.pbone.net/index.php3?stat=26&dist=42&size=157664&name=syslog-ng-2.0.9-3.el4.i386.rpm

[oresama@vh020 ~]$ wget ftp://ftp.pbone.net/mirror/ftp.silfreed.net/repo/rhel/4/i386/silfreednet/RPMS/syslog-ng-2.0.9-3.el4.i386.rpm

[oresama@vh020 ~]$ rpm --test -ivh syslog-ng-2.0.9-3.el4.i386.rpm
warning: syslog-ng-2.0.9-3.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
error: Failed dependencies:
        libevtlog.so.0 is needed by syslog-ng-2.0.9-3.el4.i386

libevtlog.so.0 がないって怒られた・・・。なので
http://rpm.pbone.net/index.php3/stat/4/idpl/3648483/com/eventlog-0.2.5-1.el4.i386.rpm.html
から libevtlog.so.0 を含む eventlog パッケージをもってきてインストールします。

[oresama@vh020 ~]$ wget ftp://ftp.pbone.net/mirror/ftp.silfreed.net/repo/rhel/4/i386/silfreednet/RPMS/eventlog-0.2.5-1.el4.i386.rpm

[oresama@vh020 ~]$ rpm --test -ivh eventlog-0.2.5-1.el4.i386.rpm
warning: eventlog-0.2.5-1.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
Preparing...                ########################################### [100%]
[oresama@vh020 ~]$ rpm --test -ivh eventlog-0.2.5-1.el4.i386.rpm syslog-ng-2.0.9-3.el4.i386.rpm
warning: eventlog-0.2.5-1.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
Preparing...                ########################################### [100%]

依存関係のエラーはなくなった(・∀・)!

[oresama@vh020 ~]$ sudo rpm -ivh syslog-ng-2.0.9-3.el4.i386.rpm eventlog-0.2.5-1.el4.i386.rpm
Password:
warning: syslog-ng-2.0.9-3.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
Preparing...                ########################################### [100%]
   1:eventlog               ########################################### [ 50%]
   2:syslog-ng              ########################################### [100%]

■■ syslog 自動起動設定を止める

[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog off
[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog --list
syslog          0:off   1:off   2:off   3:off   4:off   5:off   6:off

■■ syslog-ng 自動起動設定

[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog-ng on
[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog-ng --list
syslog-ng       0:off   1:off
   2:on    3:on    4:on    5:on    6:off

■■ syslog-ng 設定

[oresama@vh020 ~]$ sudo cp -p /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.orig
[oresama@vh020 ~]$ sudo vi /etc/syslog-ng/syslog-ng.conf

ここを
source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
    # udp(ip(0.0.0.0) port(514));
};

こうする
source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
    # udp(ip(0.0.0.0) port(514));
};

#
# Remote logging
#
source s_remote {
        tcp(ip(0.0.0.0) port(514));
        udp(ip(0.0.0.0) port(514));
};

ここを
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages"); };
destination d_auth { file("/var/log/secure"); };
destination d_mail { file("/var/log/maillog" sync(10)); };
destination d_spol { file("/var/log/spooler"); };
destination d_boot { file("/var/log/boot.log"); };
destination d_cron { file("/var/log/cron"); };
destination d_kern { file("/var/log/kern"); };
destination d_mlal { usertty("*"); };

こうする
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages.$YEAR$MONTH$DAY"); };
destination d_auth { file("/var/log/secure.$YEAR$MONTH$DAY"); };
destination d_mail { file("/var/log/maillog.$YEAR$MONTH$DAY" sync(10)); };
destination d_spol { file("/var/log/spooler.$YEAR$MONTH$DAY"); };
destination d_boot { file("/var/log/boot.log.$YEAR$MONTH$DAY"); };
destination d_cron { file("/var/log/cron.$YEAR$MONTH$DAY"); };
destination d_kern { file("/var/log/kern.$YEAR$MONTH$DAY"); };
destination d_mlal { usertty("*"); };

destination d_separatedbyhosts {
        file("/var/log/syslog-ng/$HOST-$FACILITY-$YEAR$MONTH$DAY.log");
};

ここを
#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };

こうする
#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };
log { source(s_remote); destination(d_separatedbyhosts); };

■■ ログディレクトリ作成

[oresama@vh020 ~]$ sudo mkdir /var/log/syslog-ng

■■ syslog-ng 起動

[oresama@vh020 ~]$ sudo /etc/init.d/syslog-ng start
Starting syslog-ng:                                        [  OK  ]

■■ 自分自身のログが書き込まれているか確認する

[oresama@vh020 ~]$ logger -p local0.info -t test hogehoge
[oresama@vh020 ~]$ sudo tail -f /var/log/messages.20080830
Aug 30 20:48:52 vh020 syslog-ng: syslog-ng startup succeeded
Aug 30 20:50:10 vh020 test: hogehoge

書き込まれていた

■■ 他ホストからログが書き込まれているか確認する

[oresama@vh020 ~]$ cd /var/log/syslog-ng/
[oresama@vh020 syslog-ng]$ ll
total 32
-rw-------  1 root root  856 Aug 30 22:25 192.168.0.10-auth-20080830.log
-rw-------  1 root root 1069 Aug 30 22:22 192.168.0.10-authpriv-20080830.log
-rw-------  1 root root  422 Aug 30 22:24 192.168.0.10-cron-20080830.log
-rw-------  1 root root  652 Aug 30 21:00 192.168.0.10-daemon-20080830.log
-rw-------  1 root root  219 Aug 30 20:54 192.168.0.10-kern-20080830.log
-rw-------  1 root root  356 Aug 30 20:55 192.168.0.10-local7-20080830.log
-rw-------  1 root root  705 Aug 30 20:55 192.168.0.10-mail-20080830.log
-rw-------  1 root root  103 Aug 30 20:54 192.168.0.10-syslog-20080830.log

書き込まれている

[oresama@vh020 syslog-ng]$ sudo cat 192.168.0.10-auth-20080830.log
Aug 30 20:54:49 192.168.0.10 su(pam_unix)[2258]: session closed for user root
Aug 30 20:54:54 192.168.0.10 sshd(pam_unix)[2339]: session opened for user oresama by (uid=0)
Aug 30 20:54:56 192.168.0.10 sshd(pam_unix)[2339]: session closed for user oresama
Aug 30 20:55:15 192.168.0.10 su(pam_unix)[2380]: session opened for user root by oresama(uid=0)
Aug 30 20:56:54 192.168.0.10 su(pam_unix)[2380]: session closed for user root
Aug 30 20:57:26 192.168.0.10 su(pam_unix)[2430]: session opened for user root by oresama(uid=0)
Aug 30 22:21:49 192.168.0.10 su(pam_unix)[2430]: session closed for user root
Aug 30 22:21:50 192.168.0.10 sshd(pam_unix)[2170]: session closed for user oresama
Aug 30 22:22:49 192.168.0.10 sshd(pam_unix)[2502]: session opened for user oresama by (uid=0)
Aug 30 22:25:41 192.168.0.10 sshd(pam_unix)[2502]: session closed for user oresama

■■ logrotateの設定変更

■ /etc/logrotate.d/syslog の設定削除

syslogのローテーションが不要になるので、/etc/logrotate.d/syslog の設定を削除します。

[oresama@vh020 ~]$ cd /etc/logrotate.d
[oresama@vh020 logrotate.d]$ sudo rm -f syslog

※ なぜならsyslog-ngが日付ごとのログを吐くからです

■ 前日のログを圧縮する

syslog-ngで日付ごとのログをとっているのですが、これだけだと圧縮されないので、ログ圧縮のスクリプトを書いてあげます。bashのスクリプトで配列変数を使うのは久しぶりなので、ちょっとだけド忘れしてました(^^;
bashで配列変数を使うときには、
ほにゃらら[0]=~~~
ほにゃらら[1]=~~~
ほにゃらら[2]=~~~
と変数を作ってやり、これらの変数をまとめて使うには
${ほにゃらら[@]}
としてやります。決して
$ほにゃらら[@]
ではありません。

[oresama@vh020 ~]$ sudo vi /root/bin/logrotate
[oresama@vh020 ~]$ sudo chmod 700 /root/bin/logrotate
#!/bin/sh

### FOR local logs
cd /var/log
LOG[0]=boot.log
LOG[1]=cron
LOG[2]=maillog
LOG[3]=messages
LOG[4]=secure
Y=`date +%Y%m%d --date='1days ago'`
for l in `echo ${LOG[@]}`
do
if [ -f $l.$Y ];
    then
        gzip $l.$Y
fi
done

### FOR remote logs
cd /var/log/syslog-ng
LOGS=`ls * | grep $Y | grep -v .gz$`
for n in `echo $LOGS`
do
if [ -n $f ];
    then
        gzip $n
fi
done

あとはこのスクリプトを1日1回、適当なタイミングでcronに登録してやればOKです。
以上です。

ね、簡単でしょ?

sudoを使ってると、使うたびに /var/log/messages へ
ログが吐き出されます。これでいいっちゃーいいのですが

1) sudoのログを別にとって、監査証跡にしたい
  (auditでもいい気がするが)

2) 実は /var/log/messages にsudoのログが吐かれるのは生理的にウザい

というわけで、sudoのログを分離することにします。

■■ sudoのログを取る

ここを見て、このとーりにやればできます。ただし、これだけだと、 /var/log/sudo.log にsudoに関するログが出力されるのはいいのですが、 /var/log/messages の出力がなくなるわけではありません。

■■ syslog.conf でsudoのログに関する設定

前の項では、local1でsudo.logをとる設定をしました(お手本サイトではlocal3と書いてありましたが、local0からlocal7まで、あいているものなら何でもよいです)。今度は、syslog.confで

1) /var/log/messagesにlocal1のログを吐かない
2) local1のログを /var/log/sudologとして吐き出す

という設定をします。

■ visudoコマンドでログに関する記述をする

sh-3.00# visudo

### 末尾に以下を追記
Defaults syslog=local1

■ syslog.conf修正

sh-3.00# cd /etc/
sh-3.00# cp -p syslog.conf syslog.conf.orig
sh-3.00# vi syslog.conf

ここを
local7.*                                                /var/log/boot.log

こうする
local1.*                                                /var/log/sudolog
local7.*                                                /var/log/boot.log

ここを
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

こうする
#*.info;mail.none;authpriv.none;cron.none               /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages

■■ 反映

sh-3.00# /etc/init.d/syslog restart
Shutting down kernel logger:                              [  OK  ]
Shutting down system logger:                            [  OK  ]
Starting system logger:                                     [  OK  ]
Starting kernel logger:                                       [  OK  ]

■■ 確認

sh-3.00$ sudo tail /var/log/sudolog
Jan  8 23:39:54 intra1 sudo:   shasta : TTY=pts/1 ; PWD=/home/shasta ; USER=root ; COMMAND=/usr/bin/tail /var/log/sudolog

sh-3.00# grep sudo /var/log/messages
※ 何も出力されていないこと

以上で設定は完了です。

※ 余談ですが・・・

以前、誤って syslog.conf で
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages
とするべきところを
*.info;mail.none;authpriv.none;cron.none;sudo.none    /var/log/messages
としてしまい、一切のsyslog(/var/log/messages)が出力されなかったことがあります。。。その他のアプリケーションでエラーログが出て「あー俺バカだなー。こんな凡ミスしてらー」と気が付くことはあっても、そもそものsyslogが出力されないと、全く気が付く術がありません。この時は、コンソールに流れるメッセージで気が付きましたが、手元にないサーバだったら、きっとハマってたかもです。。。

毎日のログ監視のために、logsurferを導入することにしました。
swatchよりも高機能らしいのですが、とりあえずは動けばいいかな・・・と。
まずは、syslogで不穏な文字列を検出したら、携帯電話にアラートを飛ばすようにしました。

参考サイトはこちらですが、
私の環境はCentOS4.5なので、どうせならrpmでインストールしたく、rpmsearchから探してきました。

■■ パッケージの入手

まずyumでインストールしたかったので、rpmforgeをenableにして探しても出てきませんでした。
$ sudo yum --enablerepo=rpmforge search logsurfer

というわけで、rpmsearchへ。

logsurfer
で検索し、
RedHat 9     www.spenneberg.org/IDS/logsurfer/logsurfer-1.5a-rh9_2.i386.rpm
がよさげなので落としてきました。

■ パッケージのダウンロード

$ wget ftp://ftp.pbone.net/mirror/www.spenneberg.org/IDS/logsurfer/logsurfer-1.5a-rh9_2.i386.rpm

■ パッケージの依存関係調査

$ sudo rpm --test -ivh logsurfer-1.5a-rh9_2.i386.rpm
Password:
警告: logsurfer-1.5a-rh9_2.i386.rpm: V3 DSA signature: NOKEY, key ID f5648477
Preparing...                ########################################### [100%]

鍵がないって言われた以外は問題なく、依存関係のエラーは出ませんでした。

…続きを読む