「syslog-ng」の設定

多くのUNIX系OSではログの管理に「syslogd」が採用されている。
ほとんどの場合これで問題ないが、より高機能の「syslog-ng」を導入する。
また、不正アクセスがあった場合、ファイアウォールによりアクセスを遮断する。
ファイアウォールには「iptables」、 「IP Filter」、 「Packet Filter」、 のいずれかを用いるものとする。
よって、それぞれの設定はすでに完了済みとする。
なお、「iptables」の設定については、Linuxの自宅サーバの構築のページを参照。
また、「syslog-ng」のインストール方法は割愛する。

「syslog-ng」の設定

「syslog-ng」は以下の5項目が設定の中心となる。

項目名 説明
source ログの受信(入力)に関する設定
filter フィルタリングルール
destination ログの送信(出力)に関する設定
log source、filter、destinationの関連付け
options オプション

sourceの設定

sourceではログの受信(入力)に関する設定を行い、以下の内容を記述する。

項目 説明
internal syslog-ng内部で生成されるメッセージを出力
unix-stream SOCK_STREAMモードでUNIXソケットを開き、ログメッセージを受信(Linuxの場合)
unix-dgram SOCK_DGRAM モードでUNIXソケットを開き、ログメッセージを受信(BSD系UNIXの場合)
file ファイルを開き、メッセージを読む
pipe、fifo 名前付きパイプをオープンして、ログメッセージを読む
udp UDPポートを待機しログメッセージを受信
tcp TCPポートを待機しログメッセージを受信
sun-stream、sun-streams STREAMSデバイスを開き、ログメッセージsun-streamsを受信(Solaris等)

一般的な各OSの記述方法は以下の通り。
なお、src の部分は「syslog-ng」内で一意な名前を自由に記述できる。

Solarisの場合

source src {
    sun-streams("/dev/log" door("/etc/.syslog_door"));
    internal();
};

BSD系OSの場合

source src {
    unix-dgram("/var/run/log");
    internal();
};

Linuxの場合

source src {
    pipe ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream("/dev/log");
    internal();
 };

filterの設定

filterでは、出力するログメッセージのフィルタを指定し、以下の内容を記述する。
なお、それぞれの項目に対してand、or、notを組み合わせて記述できる。

項目 説明
facility ファシリティが一致したログが対象。
level プライオリティが一致したログが対象
program プログラム名が一致したログが対象。
なお、プログラム名には正規表現が利用可。
host ホスト名が一致したログが対象。
なお、ホスト名には正規表現が利用可。
match 指定した正規表現に一致したログメッセージが対象。
filter 別のfilterルールを呼び出す。

ファシリティがmailでプライオリティがinfoからemergまでのログの記述方法は以下の通り。
なお、ファシリティとプライオリティについてはこちらを参照。
また、f_mail の部分は「syslog-ng」内で一意な名前を自由に記述できる。

filter f_mail {
    facility(mail) and
    level(info..emerg);
 };

destinationの設定

destinationでは、送信(出力)するログメッセージのフィルタを記述し、以下の内容を記述する。

項目 説明
file ファイルにログを出力。
fifo、pipe FIFOやパイプにログを出力。
unix-stream UNIXドメインソケットのSOCK_STREAM形式でメッセージを送信(Linux syslog)。
unix-dgram UNIXドメインソケットのSOCK_DGRAM形式でメッセージを送信(BSD syslog)。
host udp指定したホストとUDPポートにログを送信。
usertty ログイン中のユーザーにログを出力。
program 外部プログラムにログを出力。

/var/log/mail.logにログを出力する記述方法は以下の通り。
なお、maillog の部分は「syslog-ng」内で一意な名前を自由に記述できる。

destination d_mail { file("/var/log/mail.log"); };

logの設定

logでは、source、destination、filterの関連付けを記述する。
上記で記述したメールログの設定を指定する場合、以下のように記述。

log {
    source(src);
    filter(f_mail);
    destination(d_mail);
};

optionsの設定

optionsは、必要に応じて「syslog-ng」に関する初期設定値等の設定を行う。
オプションの種類は多いが、ここでは一部を記述。
詳細はman参照。

項目 説明
sync バッファに保持するメッセージ数。
0にするとバッファに保持せず、そのまま出力する。
stats syslog-ngの状態ログの出力間隔を秒で指定。
sync(0)の場合、stats(0)で出力しないようにして構わない。
long_hostnames offを指定すると、ログの出力にsourceのidentifyを出力しない。
dir_perm 送信(出力)するログのディレクトリのパーミッションを指定。
dir_owner 送信(出力)するログファイルのディレクトリの所有者を指定。
dir_group 送信(出力)するログファイルのディレクトリのグループを指定。
perm 送信(出力)するログファイルのパーミッションを指定。
owner 送信(出力)するログファイルの所有者を指定。
group 送信(出力)するログファイルのグループを指定。
gc_idle_threshold syslog-ngが「100ミリ秒の間にメッセージが発生しない場合」、かつ
「割り当てたオブジェクトの数がgc_idle_threshold で指定した数に到達した場合」
ガーベジコレクタを実行する。
gc_busy_threshold syslog-ngが「100ミリ秒の間に入出力イベントが発生した状態」、かつ
「割り当てたオブジェクト数がgc_busy_threshold で指定した数に到達した場合、
ガーベジコレクタを実行する。
keep_hostname ローカルのsyslog-ngマシンの正確な名前を保存する。
このオプションを指定しないと、すべての警告のホスト名がローカル・ホストのものになってしまう。
use_dns ログ出力時にDNSを利用するかどうか。
use_fqdn ログ出力時にFQDNを利用するかどうか。
dns_cache DNSキャッシュを使うかどうか。
dns_cache_expire 成功したDNSキャッシュの保存時間を秒で指定。
dns_cache_expire_failed 失敗したDNSキャッシュの保存時間を秒で指定。
dns_cache_size DNSキャッシュのサイズを指定。
create_dirs destinationで指定したディレクトリを自動で作成するかどうか。
log_fifo_size TCPメッセージをバッファリングするメッセージ数。
log_msg_size 出力するログの最大バイト数を指定(1024byte以下)。
time_reopen 切断された接続を再確立する前に待つ時間。
mark ログにMARKを出力する間隔。
不正アクセスへの対応

「syslog-ng」の設定

不正アクセスがあった場合、シェルスクリプトを実行し、アクセスを遮断する。
ここではSSHでの不正アクセスを例にとる。
まず、以下のような感じでルールを作成する。

Unix# vi /etc/syslog-ng/syslog-ng.conf <= 設定ファイルの編集
filterを以下のように作成
filter f_authng {
    (facility(auth) or facility(authpriv)) and
     match("Invalid user");
};

destinationを以下のように作成
destination d_authng { program("/root/authdrop.sh"); };

logを以下のように作成
log {
    source(s_sys);
    filter(f_authng);
    destination(d_authng);
};

不正アクセス対応スクリプトの作成

次に上記で指定したシェルスクリプトによりパケットフィルタを行う。
パケットフィルタ用のスクリプトは「syslog-ng」起動時に読み込まれるので、 スクリプトを変更した場合「syslog-ng」を再起動する必要がある。
スクリプトのファイアウォールの操作部分は使用しているファイアウォールに合わせて設定する。
なお、不正アクセス先がDHCPで割り当てられたIPアドレスの可能性も考慮し、24時間後にルールを解除する。

Unix# vi /root/authdrop.sh <= スクリプトの作成
#!/bin/sh

PATH=/bin:/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

LOGPATH="/var/log/dropip"
MAX=3


read i
IP=`echo "$i" | awk '{print $10}'`
case "$IP" in
127.0.0.1)
  exit 0
  ;;
192.168.0.[0-9]*)
  exit 0
  ;;
*)
  echo "$i" >> "$LOGPATH"/"$IP"
  CNT=`cat "$LOGPATH"/"$IP" | wc -l`
  if [ "$CNT" -ge "$MAX" ]
  then
    「iptable」を使用している場合
    iptables -I INPUT -s "$IP" -j DROP > /dev/null 2>&1
    echo "iptables -D INPUT -s $IP -j DROP > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
    ここまで
    「IP Filter」を使用している場合
    echo "@1 block in quick from $IP to any" | ipf -f - > /dev/null 2>&1
    echo "echo \"block in quick from $IP to any\" | ipf -r -f - > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
    ここまで
    「Packet Filter」を使用している場合
    pfctl -t blacklist -Tadd "$IP" > /dev/null 2>&1
    echo "pfctl -t blacklist -Tdelete $IP > /dev/null 2>&1" | at now+24hour > /dev/null 2>&1
    ここまで
  fi
  ;;
esac

exit 0


Unix# chmod 700 /root/authdrop.sh <= 作成したスクリプトに実行権限付加
Unix# mkdir /var/log/dropip <= ログ格納用ディレクトリの作成
Unix# /etc/init.d/syslog-ng restart <= 「syslog-ng」の再起動
ログローテーション時の対応

「syslog-ng」が利用しているログファイルがローテートされた場合、「syslog-ng」のプロセスに対してHUPシグナルを送る。
HUPシグナルの送り方はローテートソフトによって違うので、それぞれの設定方法に応じて変更。

▲ページのトップへ