[前に戻る: パケットのタグ付け] [目次] [次に進む: 性能]
ログを読むためには、以下のようにします。
# 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) のユーザ名やパスワードのような) 注意を要するパケットのペイロードに部分的にアクセスすることができてしまうことを意味します。
# 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 上でブロックされた着信パケットのログを リアルタイムに表示します。
まず、ユーザ 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
ここで、ホスト syslogger が hosts(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 分程度でしょう。
[前に戻る: パケットのタグ付け] [目次] [次に進む: 性能]