[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の利用を考えると,
ログが大量になり, 最悪ディスクを埋めつくす恐れがあるため,
以下のようにケアする必要がある.
2003 年度の経験から, だいたい 1 日に 1.0 GB のログが溜まることが分かった.
よって 90 日分のログをまともにテキストで保管するとほぼ 90 GB になってしまう.
しかし, gzip で圧縮を掛けることでデータはほぼ 1/100 に圧縮できる.
- sysklogd(8) を用い,
/var/log/kern.log
,
/var/log/messages
を毎日ローテーションさせる.
(デフォルトでは, syslogd によって, 毎週ローテーションされる).
昨日以前のものは gzip で圧縮してデータサイズを小さくする.
-
/var/log/kern.log.*.gz
,
/var/log/messages.*.gz
は 90 個分 (つまり約3か月分) 保存する.
(デフォルトでは, syslogd によって, 4 週分保存される.)
[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
によって実行されるため, 管理者が手動で入力する必要はない.
ただし, gate-toroku-system の設定ファイルである
gate.conf(5) の $IPTABLES_LOG
が以下のようになっている必要があるので注意.
$IPTABLES_LOG = 1;
[2.2] kern.log と messages のローテーション動作変更
/var/log/kern.log
と /var/log/messages
を
[1.2] ポリシー のようにローテーション
させるには, 以下の作業を行う必要がある.
- debianutils, sysklogd,
cron のインストール
-
/etc/cron.weekly/sysklogd
から
/var/log/kern.log
, /var/log/messages
のローテーションを分離.
-
/etc/cron.daily/sysklogd
に
/var/log/kern.log
, /var/log/messages
のローテーションをまかせる.
[2.2.1] 必要なパッケージのインストール
以下の必要なパッケージをインストールする.
# apt-get install debianutils sysklogd cron
[2.2.2] /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
:
これによって, /var/log/kern.log
と
/var/log/messages
は, 毎週ローテーションされることは無くなる.
※ なお, このファイルは本来
sysklogd(8) によって管理されているので,
このパッケージをアップデートすることで書き換えられてしまう.
アップデートの際には注意すること.
[2.2.4] /etc/cron.daily/sysklogd への記述
/etc/cron.daily/sysklogd
の
:
do
if [ -s $LOG ]; then
chown root.adm $LOG
chmod o-rwx $LOG
fi
done
# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
の部分に, 以下の 6 行を追記する.
:
do
if [ -s $LOG ]; then
chown root.adm $LOG
chmod o-rwx $LOG
fi
done
if [ -f /var/log/kern.log ]; then
savelog -g adm -m 640 -u root -c 90 /var/log/kern.log >/dev/null
fi
if [ -f /var/log/messages ]; then
savelog -g adm -m 640 -u root -c 90 /var/log/messages >/dev/null
fi
# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
これによって, /var/log/kern.log
と
/var/log/messages
は, 毎日ローテーションされ,
90 日分保管される.
※ なお, このファイルも本来
sysklogd(8) によって管理されているので,
このパッケージをアップデートすることで書き換えられてしまう.
アップデートの際には注意すること.
[2.3] 確認
以上で必要な設定は完了であるが,
実際に[1.2] ポリシーのように
ログがとれているか確認すること.
[2.4] ログの見方
簡単ではあるが, ログの見方を説明する.
以下は, /var/log/kern.log
に書き出されるメッセージである.
(見やすさのため, 改行してある).
:
Mar 10 18:27:57 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
SRC=192.168.16.55 DST=133.87.45.70 LEN=123 TOS=0x00 PREC=0x00
TTL=127 ID=1152 PROTO=UDP SPT=1210 DPT=53 LEN=103
Mar 10 18:31:14 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
SRC=192.168.16.41 DST=133.50.135.142 LEN=60 TOS=0x00 PREC=0x00
TTL=31 ID=8850 PROTO=ICMP TYPE=8 CODE=0 ID=512 SEQ=32782
Mar 10 18:33:54 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
SRC=192.168.16.55 DST=207.46.249.57 LEN=48 TOS=0x00 PREC=0x00
TTL=127 ID=1225 DF PROTO=TCP SPT=1217 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
Mar 10 18:33:54 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
SRC=192.168.16.55 DST=207.46.249.57 LEN=48 TOS=0x00 PREC=0x00
TTL=127 ID=1225 DF PROTO=TCP SPT=1217 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
Mar 10 18:39:40 blue kernel: IPTABLES-LOG: IN=eth1 OUT=eth0
SRC=192.168.16.55 DST=133.87.45.115 LEN=48 TOS=0x00 PREC=0x00
TTL=127 ID=1431 DF PROTO=TCP SPT=1235 DPT=22 WINDOW=64240 RES=0x00 SYN URGP=0
:
ある一行を説明すると,
Mar 10 18:27:57 <- [日時]
blue <- [ルータのホスト名]
kernel: <- [kernel からのメッセージであることを示す]
IPTABLES-LOG: <- [--log-prefix で指定されたフラグ]
IN=eth1 OUT=eth0 <- [データがどちらのネットワークデバイスから入り, どちらから出るかを示す]
SRC=192.168.16.55 <- [データの送信元]
DST=133.87.45.70 <- [データの宛先]
LEN=123 TOS=0x00 <- [その他色々]
PREC=0x00 TTL=127 ID=1152 <- [ 〃 ]
PROTO=UDP <- [TCP or UDP or ICMP]
SPT=1210 <- [送信元ポート]
DPT=53 <- [宛先ポート]
LEN=103 <- [その他色々]
となる. 運悪くログを眺めなければならなくなった場合は参照して欲しい.
なお, このログの整形プログラムとして,
gate-toroku-system(1) で
gate-log-iptables(8) を用意している.
例えば /var/log/kern.log
を手元に ipmasq.logとして
整形しようとすると,
# /usr/local/sbin/gate-log-iptables /var/log/kern.log ipmasq.log
とすれば良い.
すると, 上記のログは整形され, ipmasq.log に以下のように書き出される.
(ログのサイズが GB クラスになると, 出力されるまでに時間がかかるので,
コマンド入力後しばらく待つこと).
:
Mar 10 18:27:57 UDP 192.168.16.55 :1210 > 133.87.45.70 :53 (1 times)
Mar 10 18:31:14 ICMP 192.168.16.41 : > 133.50.135.142 : (1 times)
Mar 10 18:33:54 TCP 192.168.16.55 :1217 > 207.46.249.57 :80 (2 times)
Mar 10 18:39:40 TCP 192.168.16.55 :1235 > 133.87.45.115 :22 (1 times)
:
以下の作業は必須ではない.
…が, もの好きな方は挑戦してもらえると嬉しい.
上記で紹介した
gate-log-iptables(8) を/etc/cron.daily/sysklogd
の中に直接用いることで, 必要な部分のみを抜き出し,
ファイルサイズを圧縮したログを取ることもできる.
[3.1.1] 前準備
まず, [2.1]と
[2.2]の作業を行なっておくこと.
gate-log-iptables(8)は
gate-toroku-system(1) をインストールすることで自動的にシステムに組み込まれているはずである.
# /usr/local/sbin/gate-log-iptables
というコマンド入力し, ヘルプメッセージが出力されれば OK である.
[3.1.3] /etc/cron.daily/sysklogd への記述
今回は, /etc/cron.daily/sysklogd
の
:
do
if [ -s $LOG ]; then
chown root.adm $LOG
chmod o-rwx $LOG
fi
done
# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
の部分に, 以下の 8 行を追記する.
:
do
if [ -s $LOG ]; then
chown root.adm $LOG
chmod o-rwx $LOG
fi
done
if [ -f /var/log/kern.log ]; then
/usr/local/sbin/gate-log-iptables /var/log/kern.log /var/log/ipmasq.log >/dev/null
savelog -g adm -m 640 -u root -c 90 /var/log/ipmasq.log >/dev/null
savelog -g adm -m 640 -u root -c 7 /var/log/kern.log >/dev/null
fi
if [ -f /var/log/messages ]; then
savelog -g adm -m 640 -u root -c 7 /var/log/messages >/dev/null
fi
# Restart syslogd
#
/etc/init.d/sysklogd reload-or-restart
x
これによって, /var/log/kern.log
と
/var/log/messages
は, 毎日ローテーションされ,
7 日分保管される.
そして, /var/log/kern.log
から必要な部分だけを抽出されて整形されたログファイル
/var/log/ipmasq.log
が毎日生成され, 90 日分保管される.
※ なお, 繰り返しになるが, このファイルも本来
sysklogd(8) によって管理されているので,
このパッケージをアップデートすることで書き換えられてしまう.
アップデートの際には注意すること.