2016/11/090 Shares

Loop-Detect(2)

こんにちは。
さて、昨日の続きですが、ループ検知の機能を実装するのはいいのですが、実はそれだけだと機能が動作(ちゃんとループを止めて被害が拡大していない)事が多々あります。一定時間経てば自動復旧させる方式があるのは説明しました。その場合単に「ん。ネットワークが遅いな」ぐらいで終わってしまう場合があります。意図しないでループを発生させた人はループ遮断で使えないと分かればあきらめて接続を外します。外してしまうと一定時間するとループが解消されたので
ポートは閉塞から開放に遷移します。あとは普通に使えてしまうので使えるようになれば誰も管理者に文句は言いませんので、わからずじまいです。
なので、私は手動復旧の方式を採用する訳なんですが(この辺昨日と話がカブっちゃってるかな?)部分的に止まっているだけではその人は困っているけど他の人が困っていない訳です。困っている人は「使えないからもういいや」ぐらいの意識しかなかった場合(ゲストユーザとかの場合ですかね)ポート閉塞したままで放置される事になるやも知れません。
いつしか「開かずの扉」チックなポートとなるかも知れません。
なので検知した事を管理者にキチンと伝える仕組みが必要です。
さて、以前にお話しましたでしょうか。ループ検知機能はあとからネットワークベンダ、メーカーが付加的機能として実装しているもので、まだ標準化されておりません。独自仕様色が強いのです。ですのでSNMP-TRAPの規定とかがない為にネットワーク監視装置で検知させるのもなかなか困難です。
そこで私が取る手段はスイッチのsyslogメッセージと連携させます。
凡そスイッチは自身が保持するsyslogはsyslogサーバ宛に転送させる機能があります。あとはsyslogサーバでメッセージ内容を抽出して、特定のメッセージが来た場合に外部機能と連携させることができれば、ゴールです。
当初、私が扱っていたlinuxはsyslogdが標準でした。キーワード抽出はswatchを使う事で先ほどの仕組みを作り上げる事ができます。イヤ、できるそうです。
実はやった事がございません。私が試そうとしたときにはsyslogd+swatchの組合せはもう古い!ということだったんですね。なので私はsyslog-ngでしかこの仕組みを利用した事がございません。
syslog-ngは(次世代next-generationのsyslogd)らしいです。これにはフィルタ機能がありますので単体で同様の仕組みが形成されます。まぁ、そっちのほうがいいですよね。
設定はsyslog-ng.confになります。パスは、ディストリによりマチマチでした。centosはたしか/etc/syslog-ng/だったような。。
こっからは実configを参考に

******************************************************************************
#
# configuration file for syslog-ng, customized for remote logging
#

source s_internal { internal(); };
destination d_syslognglog { file(“/var/log/syslog-ng.log”); };
log { source(s_internal); destination(d_syslognglog); };

#options {
# keep_hostname (yes);
# };

# Local sources, filters and destinations are commented out
# If you want to replace sysklogd simply uncomment the following
# parts and disable sysklogd
#
# Local sources
#
#source s_local {
# unix-dgram(“/dev/log”);
# file(“/proc/kmsg” log_prefix(“kernel:”));
#};
#
# Local filters
#
#filter f_messages { level(info..emerg); };
#filter f_secure { facility(authpriv); };
#filter f_mail { facility(mail); };
#filter f_cron { facility(cron); };
#filter f_emerg { level(emerg); };
#filter f_spooler { level(crit..emerg) and facility(uucp, news); };
#filter f_local7 { facility(local7); };
#
# Local destinations
#
#destination d_messages { file(“/var/log/messages”); };
#destination d_secure { file(“/var/log/secure”); };
#destination d_maillog { file(“/var/log/maillog”); };
#destination d_cron { file(“/var/log/cron”); };
#destination d_console { usertty(“root”); };
#destination d_spooler { file(“/var/log/spooler”); };
#destination d_bootlog { file(“/var/log/boot.log”); };
#
# Local logs – order DOES matter !
#
#log { source(s_local); filter(f_emerg); destination(d_console); };
#log { source(s_local); filter(f_secure); destination(d_secure); flags(final); };
#log { source(s_local); filter(f_mail); destination(d_maillog); flags(final); };
#log { source(s_local); filter(f_cron); destination(d_cron); flags(final); };
#log { source(s_local); filter(f_spooler); destination(d_spooler); };
#log { source(s_local); filter(f_local7); destination(d_bootlog); };
#log { source(s_local); filter(f_messages); destination(d_messages); };

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

destination d_separatedbyhosts {
file(“/var/log/syslog-ng/$HOST/messages_$year$month$day” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes));
};

log { source(s_remote); destination(d_separatedbyhosts); };

##### Alert_Mail_LoopDetect #####
destination d_loop { program(“/usr/local/bin/mail_loop.sh” flush_lines(0) flush_timeout(0)); };
filter f_loop { match(“Loop detection”); };
log { source(s_remote); filter(f_loop); destination(d_loop); };

##### Alert_Mail_StormDetect #####
destination d_storm { program(“/usr/local/bin/mail_storm.sh” flush_lines(0) flush_timeout(0)); };
filter f_storm { match(“Storm detected”); };
log { source(s_remote); filter(f_storm); destination(d_storm); };

******************************************************************************

おそらく手入れたのは55-76行目までだったと
destionationとfilterとlogの3部構成ですね
filterが分かりやすいかなsyslogのメッセージの抽出ワードの指定ですね。
ここでは2つ
“Loop detection”と”Storm detected”と作っています。
これはなぜかというと対象のスイッチがアライドテレシス製の9424T/SP-EとGS924Mでして
GS924Mにはloop detectの機能は実装されていたんですが、9424T/SP-Eには実装されていなかったんですね。
なのでやむなくstorm detectで逃げ切っています。
おっと!思い出しました。単体ではないですね。外部.shを作ってました。
destinationはそのありかを指定しています。
このときの.shですが
**********mail_loop.sh**********

#!/bin/sh
TO=xxxxxxxx@xxxxx.ne.jp,yyyyyyyy@yyyy.com,zzzzzzzz@zzzzz.jp←メールの宛先
while read line
do
echo $line | /bin/mail -s “Loop Detect!!” $TO — -f aaaaaaaa@aaaa.jp←SMTPサーバ
done

******************************
ただのmailコマンドですね。
mail_storm.shも同じ内容です。5行目の-s (メールの表題)が違うだけです。
logがsourceとfilterとdestinationを括りつけるコマンドです。
こんな感じですかね?
では本日はこの辺で。。。