[1.1] ログの必要性
IP マスカレードルータを運用する際に注意しなければならないのは,
グローバルなインターネットから見た場合,
ルータ以下のプライベートIPのマシンからの通信は全てルータが行っている
ように見えることである.
例えば, (ルータではなく) プライベートIPマシンがなんらかの不正なアクセスを
行った場合でも, 全てルータがその不正アクセスを行ったように (外部からは)
見える.
そのような場合に, ルータ自身が, いつ, どのマシンから,
どのマシンへ ルーティングを行ったのかわかっていれば,
不正に利用されてるマシンを特定することができる.
以下では, IPマスカレードルータが適切なログをとる方法を記す.
[1.2] ポリシー
専攻ネットワークで運用するIPマスカレードルータでは,
以下のようにログをとる.
-
iptables(8)
の機能を利用し, プライベートLAN側からグローバルな ネットワーク
へルーティングされる全ての通信に関してログをとる.
iptables(8) によるログは
/var/log/kern.log
に保存される.
(それに伴い /var/log/messages
,
/var/log/syslog
にも保存される).
ただし, 現専攻でのプライベートIPの利用を考えると,
ログが大量になり, 最悪ディスクを埋めつくす恐れがあるため,
以下のようにケアする必要がある.
- logrotate(8) を用い,
/var/log/kern.log
,
/var/log/messages
を毎日ローテーションさせる.
(デフォルトでは, syslogd によって, 毎週ローテーションされる.)
-
/var/log/kern.log.*.gz
,
/var/log/messages.*.gz
は 7 つ分 (つまり1週間分) 保存する.
(デフォルトでは, syslogd によって, 4 週分保存される.)
- 毎日,
/var/log/kern.log
から必要最低限の情報のみを取り出し, それを
/var/log/ipmasq.log
として保存し, 90
日分保存する.
[2.1]
iptables(8) でログをとるには?
iptables(8) でログをとるためには,
LOG チェインを用いる.
今回のように, 内部 (つまりはルータの eth1)
から外部 (つまりはルータの eth0) へルーティングされる
全ての通信に対してログをとりたい場合は,
# iptables -A FORWARD -i eth1 -j LOG --log-prefix "IPTABLES-LOG: "
とする.
ただし, 上記のコマンドは
gate-toroku-system(1) の
gate-db-to-iptables(8)
によって生成される
シェルスクリプト /usr/local/sbin/gate-ip-masq
によって実行されるため, 管理者が手動で入力する必要はない.
[2.2] kern.log と messages のローテーション動作変更
/var/log/kern.log
と /var/log/messages
を
[1.2] ポリシー のようにローテーション
させるには, 以下の作業を行う必要がある.
- debianutils, sysklogd, logrotate
cron のインストール
- 必要最低限の情報を
/var/log/kern.log
から取り出すスクリプトの用意
-
/etc/logrotate.conf
へ
/var/log/kern.log
, /var/log/messages
に関して追記.
-
/etc/cron.weekly/sysklogd
から
/var/log/kern.log
, /var/log/messages
のローテーションを分離.
[2.2.1] 必要なパッケージのインストール
以下の必要なパッケージをインストールする.
# apt-get install debianutils sysklogd logrotate cron
[2.2.2] 必要最低限の情報を取り出すスクリプトの用意
このスクリプトは
gate-toroku-system(1) に既に組み込まれているはずなので,
# /usr/local/sbin/gate-log-iptables
というコマンドが存在しておれば良い.
もしも存在しない場合は
こちらから持っていって頂きたい.
[2.2.3] /etc/logrotate.conf への記述
/etc/logrotate.conf
に以下の記述を追加すること.
/var/log/messages {
daily
create 0640 root adm
compress
rotate 7
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
/var/log/kern.log {
prerotate
/usr/local/sbin/gate-log-iptables /var/log/kern.log /var/log/ipmasq.log 2>/dev/null || true
/usr/bin/savelog -m 640 -u root -g adm -c 90 /var/log/ipmasq.log >/dev/null
endscript
daily
create 0640 root adm
compress
rotate 7
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
[2.2.4] /etc/cron.weekly/sysklogd への記述
/etc/cron.weekly/sysklogd
の
:
cd /var/log
for LOG in `syslogd-listfiles --weekly`
do
if [ -s $LOG ]; then
savelog -g adm -m 640 -u root -c 4 $LOG >/dev/null
fi
done
:
の部分に, 以下の 3 行を追記する.
:
cd /var/log
for LOG in `syslogd-listfiles --weekly`
do
if [ $LOG = /var/log/kern.log ] || [ $LOG = /var/log/messages ]; then
continue
fi
if [ -s $LOG ]; then
savelog -g adm -m 640 -u root -c 4 $LOG >/dev/null
fi
done
:
※ なお, このファイルは本来
sysklogd(8) によって管理されているので,
このパッケージをアップデートすることで書き換えられてしまう.
アップデートの際には注意すること.
[2.3] 確認
以上で必要な設定は完了であるが,
実際に[1.2] ポリシーのように
ログがとれているか確認すること.