logwatchのiptables firewallが長すぎて困ったのでshorewallの設定変更

自分が個人で管理しているサーバはlogwatchで報告を上げさせているんだけど、インターネットに接しているサーバのiptables firewall部分が長すぎて困っていました。そのサーバはshorewallでiptablesの設定を入れているので、最初のうちは「しっかり守ってるなー」なんて思っていたのですが、やっぱり長過ぎるので設定を変えることにしました。

ところで、logwatchのiptables firewallってなんぞやって話をしておきます。まずlogwatchってのはLinuxなどのツールで、ログを解析して、だいたい何があったかをまとめてメールしてくれるやつです。解析内容に踏み込んだことはないけど、デフォルトでいい感じです。

そのlogwatchのiptables firewallの部分なのですが、言わずと知れたiptablesというファイアウォールのログを解析してくれています。例えばある日の内容。

--------------------- iptables firewall Begin ------------------------

Listed by source hosts:
Dropped 1596 packets on interface eth0
From *.*.*.* - 1 packet to tcp(23)

IPアドレスは伏せておきました。1596回Dropしたって言ってますね。例で挙げたのはTCPの23番ポート宛のパケット。今時23番ポートを全開しているホストも少ないだろうけど、見つかったら高い確率で入れるのかな?残念ながら、うちのサーバではファイアウォールを超えたとしてもサービスが動いていないので入ることはできません。

そんな感じで動いていないサービスへの攻撃もログに取っちゃってるんですよね。というのも、shorewallのデフォルト設定がたぶんDROPしてログなんだよね。なのでどんどん出てきちゃう。参考までに設定変更前のpolicyファイルの内容がこれ。

#############################################################
#SOURCE	DEST	POLICY		LOG	LIMIT:		CONNLIMIT:
#				LEVEL	BURST		MASK
$FW	net	ACCEPT
net	all	DROP		info
stub	all	DROP		info
all	all	REJECT		info

netがインターネットで、stubは未使用のインタフェース。未使用なのでパケットが入ってくることはないはずだけど、しっかり塞いでおいてあります。最後のall all REJECTの理由はなんだっけな。stubと合わせてall all DROPでいいんじゃないかな。むしろstub all REJECTがいいかもしれない。って、それは今は関係ないな。

とりあえず、policyはnet all DROP -に変更しておきます。LOG LEVEL列を – にするとログに出力されなくなるんだそうです。

net	all	DROP		-

ポリシーのログ出力を止めればlogwatchでも検出されなくなるのですが、ちょっと寂しい。なので接続元を制限して公開しているポートはログに出そうと思います。それはrulesに書けばOKです。

#ACTION		SOURCE		DEST		PROTO	DEST	SOURCE		ORIGINAL	RATE		USER/	MARK	CONNLIMIT	TIME         HEADERS         SWITCH
#							PORT	PORT(S)		DEST		LIMIT		GROUP
SECTION NEW
HTTP(ACCEPT)	net		$FW
HTTPS(ACCEPT)	net		$FW
Ping(ACCEPT)	net		$FW
SSH(ACCEPT:info)	net:*.*.*.*	$FW
SSH(DROP:info)	net		$FW
Munin(ACCEPT)	net:*.*.*.*	$FW
Munin(DROP:info)	net		$FW

またもIPは伏せておきました。自分の拠点だしね。インターネットからの通信はHTTPとHTTPSに加えてPingも許可しています。プロトコルの指定はマクロを利用していますので、Pingってのはicmpの8のことです。次いでSSHとMuninは拠点からの接続のみ許可して、それ以外はDROPしてinfoレベルのログ出力です。SSHは拠点からの接続でもログに出しておくことにしました。

設定ができたらmakeしてshorewallをreloadです。そして接続テスト。SSHで入れることを確認したら完了。

その結果、logwatchの内容はこうなりました。
--------------------- iptables firewall Begin ------------------------

Listed by source hosts:
Accepted 4 packets on interface eth0
From 202.231.70.100 - 4 packets to tcp(22)

Listed by source hosts:
Dropped 1 packet on interface eth0
From 103.24.176.78 - 1 packet to tcp(22)

すっきり。