| トップ | Solaris | FreeBSD | Gentoo | CentOS | Fedora | Windows | Tips | 自宅サーバの動作確認 | サイト内検索(Namazu) | サイト内検索(HE) |
多くのUNIX系OSではログの管理に「syslogd」が採用されている。
ほとんどの場合これで問題ないが、より高機能の「syslog-ng」を導入する。
また、不正アクセスがあった場合、ファイアウォールによりアクセスを遮断する。
ファイアウォールには「iptables」、
「IP Filter」、
「Packet Filter」、
のいずれかを用いるものとする。
よって、それぞれの設定はすでに完了済みとする。
なお、「iptables」の設定については、Linuxの自宅サーバの構築のページを参照。
また、「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シグナルの送り方はローテートソフトによって違うので、それぞれの設定方法に応じて変更。