2012年3月15日木曜日

第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 {
      unix-stream("/dev/log");
      internal();
      file("/proc/kmsg" log_prefix("kernel: "));
      udp();
};


とりあえず、これがなにを意味するのかわからないことには不安でたまりません。sourceの記述形式は以下の通りです。identifier は、syslog-ng 内で一意となる名前を指定する。debian の場合は、/proc/kmsg よりカーネルログを取得し、log_prefixによって、メッセージの先頭に"kernel: "を追加して、従来のsyslogdと同じ出力形式にする。
source { source-driver(params); source-driver(params); …… };

以下は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_syslog { not facility(auth, authpriv); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_user { facility(user); };
filter f_uucp { facility(uucp); };


IPアドレスは、linuxを変更した後、何をすべきか

filter f_news { facility(news); };

filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info .. warn)
and not facility(auth, authpriv, cron, daemon, mail, news); };
filter f_emergency { level(emerg); };

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_cnews { level(notice, err, crit) and facility(news); };
filter f_cother { level(debug, info, notice, warn) or facility(daemon, mail); };

filter ppp { facility(local2); };


とりあえず、どのような意味があるのかぐらいは知っておきたい。filterでは、出力するログメッセージのフィルタが行われ、上記で記述されている条件に合致したログメッセージに対して、destinationでログの出力先を決定させる。filterの記述形式 は以下のとおり。
filter { expression; };

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)
and not facility(authpriv, cron, mail, user); };

filter f_emergency { level(emerg); };
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); };


どのようにiPodのロックを解除しない

destination authlog { file("/var/log/auth.log" owner("root") group("adm") perm(0640)); };
destination syslog { file("/var/log/syslog" owner("root") group("adm") perm(0640)); };
destination cron { file("/var/log/cron.log" owner("root") group("adm") perm(0640)); };
destination kern { file("/var/log/kern.log" owner("root") group("adm") perm(0640)); };
destination mail { file("/var/log/mail.log" owner("root") group("adm") perm(0640)); };
destination user { file("/var/log/user.log" owner("root") group("adm") perm(0640)); };
destination uucp { file("/var/log/uucp.log" owner("root") group("adm") perm(0640)); };

destination newscrit { file("/var/log/news/news.crit" owner("root") group("adm") perm(0640)); };
destination newserr { file("/var/log/news/news.err" owner("root") group("adm") perm(0640)); };
destination newsnotice { file("/var/log/news/news.notice" 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_cother); destination(console_all); };

# log { source(src); filter(f_cnews); destination(xconsole); };
# log { source(src); filter(f_cother); 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
syslog 19559 0.5 1.1 1768 720 ? Ss 06:51 0:00 /sbin/syslog-ng -u syslog -g syslog

 



These are our most popular posts:

@IT:システム管理の基礎 syslogdの設定をマスターしよう(2/3)

2002年9月7日 ... syslog.confの書式は、スペースあるいはタブで分けられた2つのフィールド「selector」と 「action」で構成されています(フィールドを分けるため .... actionには、selectorで指定 したメッセージをどこに、あるいはどのように出力するかを設定します。 read more

第22回 「syslog-ng によるセキュアなログサーバー構築」

と、ざっくりいきたいところだけど、シミュレーションすると syslog-ng をインストールする 代わりに、sysklogd と klogd をアン ... とりあえず、どのような意味があるのかぐらいは 知っておきたい。filterでは、出力するログメッセージのフィルタが行われ、上記で記述 され ... read more

設定ファイル(/etc/syslog.conf)の詳細

... の重要度を意味します。syslogd デーモンの設定ファイルである /etc/syslog.conf に は、どのファシリティで、どのプライオリティを持つメッセージをどこに ... SELECTORS を 複数指定したい場合は以下のように ;(セミコロン)で接続して指定することができます。 read more

RFC 3164: The BSD syslog Protocol (日本語)

どのような場合でも、メッセージを生成する「デヴァイス」が1つ存在する。そのデヴァイス で動作するsyslogプロセスは、メッセージをコレクターに送信できる。メッセージを 受け取った旨の確認通知は発せられない。 syslogプロトコルやプロセスの基本方針の1 つに、 ... read more

Related Posts



0 コメント:

コメントを投稿