syslogよりも細かいログの制御ができるsyslog-ngを使ってみる。
インストール
aptでインストールする。
# apt-get install syslog-ng
設定はsyslog.confから引き継いでいるようなので修正はなし。
リモートログを受信
ルータなどのログをホスト毎に分ける。
/var/log/remote/(IPアドレス).logに保存するように設定する。
# vi /etc/syslog-ng/syslog-ng.conf
# remote log
source s_remote { udp(ip("0.0.0.0") port(514)); };
destination d_remote { file("/var/log/remote/$HOST.log" perm(0640)); };
filter f_remote { level(info..emerg); };
log { source(s_remote); filter(f_remote); destination(d_remote); };
設定ファイルの確認。エラーがあれば出力される。
# syslog-ng -s
再起動して設定を反映させる。
# /etc/init.d/syslog-ng restart
リモートログのlogrotate設定
# vi /etc/logrotate.d/syslog-ng
/var/log/remote/*.log {
rotate 4
missingok
notifempty
weekly
}
総当たり攻撃(Brute force attack)対策
FTPやPOP3サーバに指定回数ログインに失敗するとiptablesでアクセスを拒否するようにする。
iptablesの設定スクリプトにチェーンを追加するように修正。
# チェーンの初期化 iptables -F # ポリシーの設定 (デフォルトで拒否) iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 新規チェーンの作成 iptables -N ATTACKCHEAK iptables -N ATTACKDROP # ATTACKDROPチェーンはログをとってDROP iptables -A ATTACKDROP -j LOG --log-prefix 'iptables attack-drop: ' iptables -A ATTACKDROP -j DROP # LoopBack iptables -A INPUT -i lo -j ACCEPT # セッション確立後のパケット疎通は許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ATTACKCHEAKチェーンで評価 iptables -A INPUT -p tcp -m multiport --dports 21,110,995 -j ATTACKCHEAK # 公開ポート iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT (以下公開ポートの設定)
スクリプトの修正内容。
- ATTACKCHEAK、ATTACKDROPチェーンを作成。
- ATTACKDROPチェーンではすべてDROPする。
- 公開ポートの前にATTACKCHEAKチェーンで評価する。
アクセスを制限するIPを追加するとき
# iptables -A ATTACKCHEAK -p tcp --dport (ポート) -s (IPアドレス) -j ATTACKDROP
解除するとき
# iptables -D ATTACKCHEAK -p tcp --dport (ポート) -s (IPアドレス) -j ATTACKDROP
ログインに失敗したときに実行するスクリプトの作成。
# vi /usr/local/syslog-ng/filter_brute_force.pl
#!/usr/bin/perl
$subject = 'syslog-ng';
$mailto = 'root@parlia.net';
$mailfrom = 'root@parlia.net';
$sendmail = '/usr/sbin/sendmail';
$iptables = '/sbin/iptables';
$logfile = '/usr/local/syslog-ng/log.txt';
use Jcode;
while (<STDIN>) {
if (/ proftpd\[\d*\]:.*\[(\d+\.\d+\.\d+\.\d+)\]/) {
$port = '21';
$ip = $1;
} elsif (/ pop3d:.* ip=\[.*:(\d+\.\d+\.\d+\.\d+)\]/) {
$port = '110';
$ip = $1;
} elsif (/ pop3d-ssl:.* ip=\[.*:(\d+\.\d+\.\d+\.\d+)\]/) {
$port = '995';
$ip = $1;
} else {
exit;
}
if ($ip =~ /^192\.168\./) { exit; }
$count = 0;
open(LOG, "+<$logfile");
while ($line = <LOG>) {
if ($line =~ /IP=([\d\.]+) PORT=(\d+)/) {
if ($ip eq $1 && $port eq $2) {
$count++;
}
}
}
print LOG &get_time()." IP=$ip PORT=$port\n";
close(LOG);
$ret = `$iptables -n -L ATTACKCHEAK | grep -F '$ip' | grep -F 'dpt:$port'`;
if ($count >= 2 && !$ret) {
system("$iptables -A ATTACKCHEAK -p tcp --dport $port -s $ip -j ATTACKDROP");
$message = "ATTACKCHEAKチェーンに追加\n";
$message .= "ポート: $port\n";
$message .= "IP: $ip\n";
$message .= "\n$_";
Jcode::convert(\$subject,jis);
Jcode::convert(\$message,jis);
open(MAIL,"| $sendmail -t");
print MAIL "To: $mailto\n";
print MAIL "From: $mailfrom\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "$message\n";
close(MAIL);
}
}
sub get_time {
@time = localtime(time());
return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $time[5]+=1900, $time[4]+=1, $time[3], $time[2], $time[1], $time[0]);
}
ログインに失敗したら/usr/local/syslog-ng/filter_brute_force.plを実行するように、/etc/syslog-ng/syslog-ng.confに設定を追加する。
# vi /etc/syslog-ng/syslog-ng.conf
# Brute force attack
destination d_attack { program("/usr/local/syslog-ng/filter_brute_force.pl"); };
filter f_ftp_attack { program("proftpd") and (match("Login failed") or match("no such user found")); };
filter f_pop3_attack { (program("pop3d") or program("pop3d-ssl")) and match("LOGIN FAILED"); };
log { source(s_all); filter(f_ftp_attack); destination(d_attack); };
log { source(s_all); filter(f_pop3_attack); destination(d_attack); };
トラックバックURL