第22回 「syslog-ng によるセキュアなログサーバー構築」
apt-get してインストールする。と、ざっくりいきたいところだけど、シミュレーションすると syslog-ng をインストールする代わりに、sysklogd と klogd をアンインストールしてしまうみたいだ。/etc/syslog.conf を全くいじっていない場合は、置き換えられても問題ないようにはできている。だが、カスタマイズしている場合は、取得できないログが発生する可能性があるので、基幹部分のサーバーなどにインストールする場合は、予めテスト環境を作成し、検証しておいた方が良いだろう。なお、新規にdeb パッケージをインストールしようとしたが、sysklogd とconflict し、インストールすることはできなかった。
landisk:~# apt-get install syslog-ng |
■/etc/syslog-ng/syslog-ng.conf の編集
/etc/syslog-ng/syslog-ng.conf を開いてみてみると、なにやら物凄く難解な構文がずらずらと…めまいがしてきそうです。syslog-ng には以下の5つの設定を行います。
⇒syslog-ng マニュアル
■source(ログ受信に関する設定) の設定
デフォルトでは以下のようになっています。通常はデフォルトのままで問題ありません(と、私が言い切るのもどうかと思いますが…)。「udp();」はログを他のマシンから受信しない場合は先頭に#をつけてコメントしてください。
source src { unix-stream("/dev/log"); internal(); file("/proc/kmsg" log_prefix("kernel: "));udp(); }; 見やすく改行すると… source src { |
とりあえず、これがなにを意味するのかわからないことには不安でたまりません。sourceの記述形式は以下の通りです。identifier は、syslog-ng 内で一意となる名前を指定する。debian の場合は、/proc/kmsg よりカーネルログを取得し、log_prefixによって、メッセージの先頭に"kernel: "を追加して、従来のsyslogdと同じ出力形式にする。
source |
以下はsource-driverの意味です。
■filter (フィルタ処理)の設定
デフォルトでは以下のようになっている。これも…ほぼデフォルトで問題ないでしょう(笑)。
# Here's come the filter options. With this rules, we can set which # message go where. filter f_authpriv { facility(auth, authpriv); }; filter f_news { facility(news); }; filter f_debug { not facility(auth, authpriv, news, mail); }; filter f_info { level(info); }; filter f_cnews { level(notice, err, crit) and facility(news); }; filter ppp { facility(local2); }; |
とりあえず、どのような意味があるのかぐらいは知っておきたい。filterでは、出力するログメッセージのフィルタが行われ、上記で記述されている条件に合致したログメッセージに対して、destinationでログの出力先を決定させる。filterの記述形式 は以下のとおり。
filter |
expression の値は以下のとおり。
例1) filter f_authpriv { facility(auth, authpriv); };
Facility が auth と authpriv を対象とする場合。
例2) filter f_syslog { not facility(auth, authpriv); };
Facility が auth と authpriv を除いたもの全て。
例3) filter f_messages { level(info .. warn) and not facility(auth, authpriv, cron, daemon, mail, news); };
priority が info から warn までを対象とする場合で、auth,authpriv,cron,daemon,mai,news のFacility は含まない。
■destinations (ログの出力に関する設定)の設定
上記で設定したfilter 条件のログ出力先を指定します。以上のfilter と destinations をまとめてみました。ここでは、debian 風のログ出力形式をある程度、継投しつつ、尚且つ、Red Hat 風のログ出力形式に変えてみる(単にログは1箇所に集中させて記録したいという筆者の好み)。こんな感じかな〜。debian のログ出力形式って無駄に多いなぁ〜。
filter f_authpriv { facility(auth, authpriv); }; filter f_syslog { not facility(auth, authpriv); }; filter f_cron { facility(cron); }; filter f_kern { facility(kern); }; filter f_mail { facility(mail); }; filter f_user { facility(user); }; filter f_uucp { facility(uucp); }; filter f_news { facility(news); }; filter f_messages { level(info .. emerg) filter f_emergency { level(emerg); }; destination authlog { file("/var/log/auth.log" owner("root") group("adm") perm(0640)); }; destination newscrit { file("/var/log/news/news.crit" owner("root") group("adm") perm(0640)); }; |
■log の設定
最後に、ログの設定を行います。source、destination、filterで定義した各ルール名(
log { source(src); filter(f_authpriv); destination(authlog); }; log { source(src); filter(f_syslog); destination(syslog); }; log { source(src); filter(f_cron); destination(cron); }; # log { source(src); filter(f_daemon); destination(daemon); }; log { source(src); filter(f_kern); destination(kern); }; # log { source(src); filter(f_lpr); destination(lpr); }; log { source(src); filter(f_mail); destination(mail); }; log { source(src); filter(f_user); destination(user); }; log { source(src); filter(f_uucp); destination(uucp); }; # log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); }; # log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); }; # log { source(src); filter(f_mail); filter(f_err); destination(mailerr); }; log { source(src); filter(f_news); filter(f_crit); destination(newscrit); }; log { source(src); filter(f_news); filter(f_err); destination(newserr); }; log { source(src); filter(f_news); filter(f_notice); destination(newsnotice); }; # log { source(src); filter(f_debug); destination(debug); }; log { source(src); filter(f_messages); destination(messages); }; log { source(src); filter(f_emergency); destination(console); }; #log { source(src); filter(f_cnews); destination(console_all); }; # log { source(src); filter(f_cnews); destination(xconsole); }; # log { source(src); filter(ppp); destination(ppp); }; DNSとDHCPをインストールする方法 |
完成〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜!!
繰り返しになるけど、以上で設定した項目を綺麗に見やすく、且つ、自分なりにまとめてみた。う〜ん、最初は暗号のようだったsyslog-ng.conf も解析してしまえば簡単ですね。なお、筆者のルータは、ファシリティコードが user に固定されているので、オリジナルなフィルタを作成しても user ファシリティコードからしかログは出力されませんでした(local1〜7 とかをルータに割り当てることはできませんでした)。dhcp,samba,cron のログは必要ないので/var/log/messages には記録せず、別ファイルに保存している。また、必要のない特定の文字列に関してはファイルに出力しないようにしてある(/dev/null)。ssh のログイン記録(Accepted publickey〜・・・)は、確認のためによく見たりするので、/var/log/messages に吐くようにしてある(デフォルト)。
# -----------------------------------------------------------------OPTIONS options { long_hostnames(off); sync(0); stats(86400); log_fifo_size (1000); keep_hostname (yes); time_reopen (10); use_dns (yes); use_fqdn (no); dir_perm(0755); perm(0644); owner(root); group(adm); create_dirs (no); }; # -----------------------------------------------------------------SOURCE source src { unix-stream("/dev/log"); unix-stream("/var/bind/dev/log"); # chrootしているデーモンからのログを収集する internal(); file("/proc/kmsg" log_prefix("kernel: ")); udp(ip("0.0.0.0") port(514)); }; # -----------------------------------------------------------------DESTINATION destination authlog { file("/var/log/auth.log"); }; destination syslog { file("/var/log/syslog"); }; destination cron { file("/var/log/cron.log"); }; destination kern { file("/var/log/kern.log"); }; destination mail { file("/var/log/mail.log"); }; destination uucp { file("/var/log/uucp.log"); }; destination user { file("/var/log/router.log"); }; destination newscrit { file("/var/log/news/news.crit"); }; destination newserr { file("/var/log/news/news.err"); }; destination newsnotice { file("/var/log/news/news.notice"); }; destination console { usertty("root"); }; destination console_all { file("/dev/tty8"); }; destination xconsole { pipe("/dev/xconsole"); }; destination messages { file("/var/log/messages"); }; destination d_dhcpd { file("/var/log/dhcpd.log"); }; destination d_crond { file("/var/log/cron.log"); }; destination d_samba { file("/var/log/samba/log.smbd"); }; destination d_trash { file("/dev/null"); }; # -----------------------------------------------------------------FILTER filter f_authpriv { facility(auth, authpriv); }; filter f_syslog { not facility(auth, authpriv, user, cron, kern, mail); }; filter f_cron { facility(cron); }; filter f_kern { facility(kern); }; filter f_mail { facility(mail); }; filter f_uucp { facility(uucp); }; filter f_news { facility(news); }; filter f_user { facility(user); }; filter f_messages { level(info .. emerg) and not facility(authpriv, cron, mail, user) and not filter("f_origin"); }; filter f_info { level(info); }; filter f_notice { level(notice); }; filter f_warn { level(warn); }; filter f_crit { level(crit); }; filter f_err { level(err); }; filter f_emergency { level(emerg); }; ##### ORIGINAL FILTER ##### filter f_origin { filter(f_dhcpd) or filter(f_crond) or filter(f_samba); }; filter f_dhcpd { level(info..emerg) and program("dhcpd") or match("dhclient.*"); }; filter f_samba { level(info..emerg) and program("smbd"); }; filter f_crond { match("CRON") or match("crond\(.*\)"); }; filter f_trash { match("last.*message.*repeated.*"); }; # -----------------------------------------------------------------LOG log { source(src); filter(f_authpriv); destination(authlog); }; log { source(src); filter(f_syslog); destination(syslog); }; log { source(src); filter(f_cron); filter(f_crond); destination(cron); }; log { source(src); filter(f_kern); destination(kern); }; log { source(src); filter(f_mail); destination(mail); }; log { source(src); filter(f_uucp); destination(uucp); }; log { source(src); filter(f_user); destination(user); }; log { source(src); filter(f_news); filter(f_crit); destination(newscrit); }; log { source(src); filter(f_news); filter(f_err); destination(newserr); }; log { source(src); filter(f_news); filter(f_notice); destination(newsnotice); }; log { source(src); filter(f_messages); destination(messages); }; log { source(src); filter(f_emergency); destination(console); }; log { source(src); filter(f_samba); destination(d_samba); }; log { source(src); filter(f_dhcpd); destination(d_dhcpd); }; log { source(src); filter(f_trash); destination(d_trash); }; |
■syslog-ng の起動
起動させる前に、構文チェックを行う。なにも出力されなければOK!
landisk:~# syslog-ng -s landisk:~# ps aux | grep syslog-ng root 18742 0.0 1.3 2100 872 ? Ss 03:56 0:00 /sbin/syslog-ng |
■ログのローテーション
ログのローテーションは、syslog-ng をインストールすれば自動で行われている。/etc/logrotate.d/syslog-ng というファイルがあるので設定を変更したい場合は編集しておこう。
■ユーザ権限で起動させる
セキュリティを高めるために、syslog-ng をユーザ権限で起動させます。
landisk:~# adduser --shell /bin/false --home /dev/null --disabled-login --disabled-password syslog |
起動スクリプトを編集します。但し、この方法でやる場合は、/var/log 以下にワンクッション、ディレクトリを作成しないと書き込み権限がないために、ログに出力されないでしょう。
landisk:~# vi /etc/init.d/syslog-ng SYSLOGD="-u syslog -g syslog" ・・・ start-stop-daemon --start --quiet --exec /sbin/syslog-ng -- $SYSLOGD ・・・ start-stop-daemon --start --quiet --exec /sbin/syslog-ng -- $SYSLOGD landisk:~# ps aux | grep syslog-ng |
0 コメント:
コメントを投稿