Hello Guest    ログイン
top > Linux > syslog-ngを使う

syslog-ngを使う

カテゴリー: Linux| 公開: 2009/7/20 | コメント(0)

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); };

参考サイト

syslog-ngの導入

トラックバックURL

コメント送信

メールアドレスが公開されたり他で使用されたりすることはありません。