[OpenBSD]

[前に戻る: パケットのタグ付け] [目次] [次に進む: 性能]

PF: ログの取得


目次


はじめに

PF におけるパケットのログの取得は、 pflog0 インターフェイスをリスンしている pflogd(8) によって行われ、パケットはログファイル (通常は /var/log/pflog) に tcpdump(8) のバイナリフォーマットで書き込まれます。loglog-all キーワードが指定されたフィルタルールは、 この方法でログを取得します。

ログファイルを読む

pflogd によって書き込まれたログファイルはバイナリフォーマットですので、テキストエディタを使用して これを読むことはできません。ログを読むためには、tcpdump を使用する必要があります。

ログを読むためには、以下のようにします。

# tcpdump -n -e -ttt -r /var/log/pflog

pflog ファイルを見るために tcpdump を使用しても、リアルタイムで表示されるわけではない ことに注意してください。取得されたパケットのログをリアルタイムで表示させるためには、 pflog0 インターフェイスを使用して、以下のようにします。

# tcpdump -n -e -ttt -i pflog0

注: ログを調べる場合には、(-v コマンドラインオプションによって有効化される) tcpdump の冗長なプロトコルデコーディングを使用して、 特に注意して行うべきです。tcpdump のプロトコルデコーダは、 完全なセキュリティの履歴を持ちません。少なくとも理論的には、 ログデバイスによって記録される部分的なパケットのペイロードを利用した 遅延攻撃が可能です。この方法でログを調べる前に、ログファイルを ファイアウォールから移動させておくことを推奨します。

また、ログに安全にアクセスするためには、さらなる注意が必要です。デフォルトでは、 pflogd は、パケットの 96 バイトをログファイルに記録します。 ログにアクセスするということは、 (telnet(1)ftp(1) のユーザ名やパスワードのような) 注意を要するパケットのペイロードに部分的にアクセスすることができてしまうことを意味します。

ログ出力のフィルタリング

pflogd は tcpdump のバイナリフォーマットでログを記録するので、ログを表示する際に tcpdump の機能をフルに使用することができます。ですので、たとえば、ある特定の ポートにマッチするパケットを見たいだけでしたら、以下のようにすると良いでしょう。
# tcpdump -n -e -ttt -r /var/log/pflog port 80

これによって、たとえば以下のように、ある特定のホストとポートの組み合わせによって パケットの表示を限定することで、より洗練された表示を行うことができるようになります。

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

pflog0 インターフェイスから読み込む場合にも、同様のアイディアを適用可能です。

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

これ自体は、pflogd のログファイルにパケットのログを取得する際にも一切のインパクトを 与えてはいないことに注意してください。上記のコマンドは、ログを取得中のパケットを 表示するだけです。

標準的な tcpdump(8) のフィルタルールだけでなく、OpenBSD の tcpdump フィルタ言語は、 pflogd の出力を読むために拡張されています。

例:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

これは、インターフェイス wi0 上でブロックされた着信パケットのログを リアルタイムに表示します。

syslog 経由のパケットロギング

多くの場面で、ファイアウォールのログが ASCII フォーマットで存在することが望ましかったり、 そして/あるいは、それをリモートのログ取得用サーバに送りたい場合があったりします。これらは すべて、ふたつの小さなシェルスクリプトを使用し、OpenBSD の設定ファイルにいくつかの小さな 変更を加え、そしてログ取得用デーモンである syslogd(8) があれば可能なことです。syslogd は ASCII でログを取得しますし、また、 リモートのログ取得用サーバにログを取得させることも可能となります。

まず、ユーザ pflogger を、/sbin/nologin をシェルとして作成してください。 このユーザを作成するのに最も簡単な方法は、 adduser(8) を使用することでしょう。

pflogger ユーザの作成後、以下のふたつのスクリプトを 作成してください。

/etc/pflogrotate

	FILE=/home/pflogger/pflog5min.$(date "+%Y%m%d%H%M")
	kill -ALRM $(cat /var/run/pflogd.pid)
	if [ $(ls -l /var/log/pflog | cut -d " " -f 8) -gt 24 ]; then
	   mv /var/log/pflog $FILE
	   chown pflogger $FILE
	   kill -HUP $(cat /var/run/pflogd.pid)
	fi

/home/pflogger/pfl2sysl

	for logfile in /home/pflogger/pflog5min* ; do
	   tcpdump -n -e -ttt -r $logfile | logger -t pf -p local0.info
	   rm $logfile
	done

次に root ユーザの crontab を編集します。

# crontab -u root -e

以下の 2 行を追加してください。

# rotate pf log file every 5 minutes
0-59/5 * * * * /bin/sh /etc/pflogrotate

そして、pflogger ユーザ用の crontab を生成します。

# crontab -u pflogger -e

こちらには以下の 2 行を追加します。

# feed rotated pflog file(s) to syslog
0-59/5 * * * * /bin/sh /home/pflogger/pfl2sysl

また、/etc/syslog.conf ファイルに以下の行を追加します。

local0.info     /var/log/pflog.txt

そして、リモートサーバにログを取得させる場合には、以下の行を追加しておいてください。

local0.info     @syslogger

ここで、ホスト sysloggerhosts(5) ファイル内に定義されていることを確認しておいてください。

上記のファイルに syslog でログを取得するため、以下のように /var/log/pflog.txt ファイルを生成します。

# touch /var/log/pflog.txt

最後に syslogd に HUP シグナルを送信して、設定の変更を通知します。

# kill -HUP $(cat /var/run/syslog.pid)

これで、すべての取得したパケットのログは /var/log/pflog.txt に送り込まれるようになります。もし、ふたつ目の行が追加されていれば、 リモートのログ取得用ホスト syslogger にログを送信します。

これからは、スクリプト /etc/pflogrotate が処理を行うようになりますので、 newsyslog(8) による pflog のローテーションは不要になりますので、 これを無効化して、/var/log/pflog ファイルも削除してください。 しかし、/var/log/pflog.txt/var/log/pflog が置き換えられますので、 そのローテーションが有効化されなければなりません。 そのためには、/etc/newsyslog.conf を以下のように変更してください。

    #/var/log/pflog       600    3    250    *    ZB /var/run/pflogd.pid
    /var/log/pflog.txt    600    7    *      24

これで、PF は ASCII で /var/log/pflog.txt にログを取得するようになりました。 もし、/etc/syslog.conf 内にそのように設定すれば、PF はリモートサーバにログを 送信します。ログの取得は直ちに行われるわけではありませんが、取得したパケットのログが ファイルに記録されるまでの遅延時間は、(cron ジョブの間隔である) およそ 5 〜 6 分程度でしょう。

[前に戻る: パケットのタグ付け] [目次] [次に進む: 性能]


[back] www@openbsd.org
Originally [OpenBSD: logging.html,v 1.13 ]
$Translation: logging.html,v 1.11 2004/01/03 05:12:49 toshi Exp $
$OpenBSD: logging.html,v 1.10 2004/01/04 22:47:55 horacio Exp $