syslog-ngによるsyslog転送

複数の端末からsyslog転送を行い、そのログを端末毎に振り分けたい。syslogdではそれが難しいため、syslog-ngでやってみようと調べてみました。

syslog-ngの特長 (syslogdとの違い)

  • syslogdで提供される機能はすべて同様に利用できる
  • ログの出力先をアプリケーションやIPアドレス毎に制御できる
  • swatchのように特定の文字列が出力された際にメール通知等のアクションができる
  • udp514ポート以外にTCPや任意のポート番号でログ受信ができる
    • TCPだとログの消失が無くなる
  • root以外のユーザで動作させることができる
    • セキュリティ的に望ましい

syslog-ng Ver.1 と Ver.2 との違い

2006年11月に公開された syslog-ng Ver.2 は、Ver.1 とは以下の違いがあるようです。見たところ Ver.2 を使っておけば間違いなさそうです。

  • マイナー不具合対応
  • 将来の開発を考慮し、ゼロから作り直した
  • CPU使用率の効率改善
  • 異なるタイムゾーン間の変換が可能
  • IPv6対応
  • DNSを使わず、ログにホスト名を含めることが可能
    • /etc/hosts 同様の専用ファイルで →動作に支障を出さずに可動性向上
  • 信頼性の向上(メッセージの喪失防止制御)

参考: インタビュー:syslog-ng 2.0の開発者Balázs Scheidler氏に聞く | OSDN Magazine

やりたいこと

端末A(CentOS 5.1)からログ収集サーバ(CentOS 5.1)へSyslog転送をする

ログ収集サーバへのsyslog-ngインストール

yumによるインストールは残念ながらできないようです。
Identity & Access Management for the Real World | One Identity にソースが置いてありますが、今回はパッケージ(RPM)でのインストールを行います。(ver1.6 まではライブラリとして libol が必要でしたが、ver2 からは eventlog が必要となります)

RPM Search から、以下のCentOS5用RPMパッケージをダウンロード

eventlog-0.2.5-6.el5.kb.i386.rpm (Syslog-ng v2 support library)
ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/eventlog-0.2.5-6.el5.kb.i386.rpm
syslog-ng-2.0.3-1.el5.kb.i386.rpm
ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/syslog-ng-2.0.3-1.el5.kb.i386.rpm

syslog-ngからインストールしようとすると、libevtlog.so.0というライブラリが無いと言われてしまうので、「eventlog→syglog-ng」の順にインストール

# rpm -ivh eventlog-0.2.5-6.el5.kb.i386.rpm
# rpm -ivh syslog-ng-2.0.3-1.el5.kb.i386.rpm

syslog-ng 2.0.3-1 では以下のファイルがコピーされます。起動スクリプトやログのローテーション設定も入るようです。

# rpm -qlp syslog-ng-2.0.3-1.el5.kb.i386.rpm
/etc/logrotate.d/syslog
/etc/rc.d/init.d/syslog-ng
/etc/sysconfig/syslog-ng
/etc/syslog-ng
/etc/syslog-ng/syslog-ng.conf
/sbin/syslog-ng
/usr/share/doc/syslog-ng-2.0.3
/usr/share/doc/syslog-ng-2.0.3/AUTHORS
/usr/share/doc/syslog-ng-2.0.3/COPYING
/usr/share/doc/syslog-ng-2.0.3/ChangeLog
/usr/share/doc/syslog-ng-2.0.3/NEWS
/usr/share/doc/syslog-ng-2.0.3/README
/usr/share/doc/syslog-ng-2.0.3/bof-2002-09-27.txt
/usr/share/doc/syslog-ng-2.0.3/dos-2000-11-22.txt
/usr/share/doc/syslog-ng-2.0.3/relogger.pl
/usr/share/doc/syslog-ng-2.0.3/syslog-ng.conf.doc
/usr/share/doc/syslog-ng-2.0.3/syslog-ng.conf.sample
/usr/share/doc/syslog-ng-2.0.3/syslog-ng.txt
/usr/share/doc/syslog-ng-2.0.3/syslog2ng
/usr/share/man/man5/syslog-ng.conf.5.gz
/usr/share/man/man8/syslog-ng.8.gz
/usr/share/syslog-ng
/usr/share/syslog-ng/syslog-ng.vim

自動起動設定

# chkconfig syslog off
# chkconfig syslog-ng on

設定ファイルの修正

# vi /etc/sysconfig/syslog-ng

# 実行ユーザ・グループを 「root → nobody」へ
SYSLOGNG_OPTIONS="-u nobody -g nobody -p /var/run/syslogd.pid"
# vi /etc/syslog-ng/syslog-ng.conf

options {
    	sync (0);               # (DEPLICATED) Obsolete aliases for flush_lines()
    	                        #     ログ出力の際のバッファリング容量 (default:2048)
    	time_reopen (10);       # Connection切断後の再接続WAIT時間
    	log_fifo_size (1000);   # TCPメッセージをバッファリングするメッセージ数
    	long_hostnames (off);   # ホスト名の前に source を出力 (s_sys@CENTOS5)
    	use_dns (no);           # DNSの使用
    	use_fqdn (no);          # FQDNの使用
    	create_dirs (no);       # 転送先ファイルのディレクトリ作成許可
    	keep_hostname (yes);    # hostnameの上書き
    	# ---以下、設定追加---
    	stats (86400);          # syslog-ngの監視報告を 86400 秒間隔で行う (default:600)
    	perm(0644);             # 出力ファイルの Default Permission
    	owner(nobody);          # 出力ファイルの Default Owner
    	group(nobody);          # 出力ファイルの Default Group
	};

source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
    udp(ip(0.0.0.0) port(514));     # udp514 でログ待ち受け
};

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_mlal { usertty("*"); };
destination d_host { file("/var/log/syslog-ng/$HOST"); };    # ログの保存場所を指定

#filter f_filter1   { facility(kern); };
filter f_filter2   { level(info..emerg) and
                     not facility(mail,authpriv,cron); };
filter f_filter3   { facility(authpriv); };
filter f_filter4   { facility(mail); };
filter f_filter5   { level(emerg); };
filter f_filter6   { facility(uucp) or
                     (facility(news) and level(crit..emerg)); };
filter f_filter7   { facility(local7); };
filter f_filter8   { facility(cron); };
filter f_filter9   { host("192.168.0.1") and level(info..emerg); };
# ↑端末AのIPアドレスとファシリティ・プライオリティを指定

#log { source(s_sys); filter(f_filter1); destination(d_cons); };
log { source(s_sys); filter(f_filter2); destination(d_mesg); };
log { source(s_sys); filter(f_filter3); destination(d_auth); };
log { source(s_sys); filter(f_filter4); destination(d_mail); };
log { source(s_sys); filter(f_filter5); destination(d_mlal); };
log { source(s_sys); filter(f_filter6); destination(d_spol); };
log { source(s_sys); filter(f_filter7); destination(d_boot); };
log { source(s_sys); filter(f_filter8); destination(d_cron); };
log { source(s_sys); filter(f_filter9); destination(d_host); };
# ↑この行で上記の distinationとfilter を指定

最後にsyslog-ngプロセスを再起動し、設定を反映

# /etc/init.d/syslog-ng restart

ディレクトリを作ったり、syslog-ngが書き込みを行うログファイルの所有者変更したり

# mkdir /var/log/syslog-ng
# cd /var/log/
# chown nobody.nobody syslog-ng/ messages secure maillog spooler boot.log cron

端末AのSyslog転送設定

端末AではSyslog-ngは導入せず、syslogdを使用し転送を行います。

# vi /etc/syslogd.conf

*.*            @192.168.0.2         # 最終行にログ転送サーバのIPアドレスを追加

syslogプロセスを再起動し、設定を反映

# /etc/init.d/syslogd restart

動作確認方法は、端末Aでloggerコマンドを実行し、ログ収集サーバにログが転送されていればOKです。

参考URL

■第9回 安全性の高いログ・サーバへの乗り換えのススメ(1)
http://www.atmarkit.co.jp/fsecurity/rensai/unix_sec09/unix_sec01.html
■第10回 安全性の高いログ・サーバへの乗り換えのススメ(2)
http://www.atmarkit.co.jp/fsecurity/rensai/unix_sec10/unix_sec01.html
■syslog-ng.confの設定(マロンくん.NET)
http://www.marronkun.net/linux/other/syslogng_000047.html
■syslog-ngでログ監査の自動化(マロンくん.NET)
http://www.marronkun.net/linux/other/syslogng_000087.html
■リファレンスマニュアル(英)
http://www.syslog.org/syslog-ng/v2/
■Syslog-ng FAQ(英)
http://www.campin.net/syslog-ng/faq.html