firewalldでブロックされた情報をログで確認する


はじめに

Red Hat系のLinuxディストリビューションでfirewallを有効化すると、セキュリティが向上しますが、必要な通信もブロックしてしまいます。
また、ブロックされた側は何が原因でブロックされているのか特定するのも困難です。

そのため、firewalldのログを利用して、ブロックされた通信を特定してfirewallの穴あけを行うための調査を可能にします。

firewalldのログ有効化

firewalldのログはデフォルトでは有効化されていません。 そのため、以下の設定でログを有効化します。

まずは以下のコマンドでfirewalldのログの有効化状況を確認します。

Terminal window
sudo firewall-cmd --get-log-denied
# off

なお、/etc/firewalld/firewalld.confでは以下のようになっています。

"/etc/firewalld/firewalld.conf
# LogDenied
# Add logging rules right before reject and drop rules in the INPUT, FORWARD
# and OUTPUT chains for the default rules and also final reject and drop rules
# in zones. Possible values are: all, unicast, broadcast, multicast and off.
# Default: off
LogDenied=off

上記のコメントに記載している通り、LogDeniedの値は以下のいずれかです。 いずれも拒否パケットに対する設定です。

種類意味
all全てのパケット
unicastunicastパケット
broadcastbroadcastパケット
multicastmulticastパケット

上記のLogDeniedを変更するには以下のコマンドを実行します。 実行後、即座に設定が反映されます。

Terminal window
sudo firewall-cmd --set-log-denied=all
# sudo firewall-cmd --get-log-denied
# all

ログ確認

以下のようなログが/var/log/messegesに出力されます。

Terminal window
May 4 12:27:34 nginx2 kernel: filter_IN_public_REJECT: IN=ens18 OUT= MAC=bc:24:11:7b:58:c8:14:eb:b6:d8:55:33:08:00 SRC=192.168.0.1 DST=192.168.0.81 LEN=78 TOS=0x00 PREC=0x00 TTL=64 ID=27999 PROTO=UDP SPT=46063 DPT=137 LEN=58
日時: 5月4日 12:27:34
# ホスト名: nginx2
# ログ元: kernel
# ルール名: filter_IN_public_REJECT (publicゾーンの入力パケットが拒否された)
# インターフェース: ens18
# MACアドレス: 宛先 bc:24:11:7b:58、送信元 14:eb:b6:d8:55:33
# 送信元IPアドレス): 192.168.0.1
# 宛先IPアドレス): 192.168.0.81
# プロトコル: UDP
# 送信元ポート: 46063
# 宛先ポート : 137
# パケット長 : 58

このままだと/var/log/messegesにそのまま出力されるため、その他サービスのメッセージと混じってしまいます。
このログはsyslogとして送信されるため、/etc/rsyslog.d/firewalld.confを作成します。(実際にはもう少し精査して振り分けルールを作成してください。)

/etc/rsyslog.d/firewalld.conf
# firewalldのREJECTログを専用ファイルに転送
:msg,contains,"filter_IN_public_REJECT" /var/log/firewall-rejected.log
& stop

また、ログあふれを防ぐためにログローテーション設定も合わせて入れておくことをお勧めします。

/etc/logrotate.d/firewalld.conf
/var/log/firewall-rejected.log {
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
/usr/bin/systemctl reload rsyslog.service > /dev/null 2>&1 || true
endscript
}

これらを設定後、rsyslogを再起動します。

Terminal window
sudo systemctl restart rsyslog

以上

参考文献

同じカテゴリの記事