はじめに
Red Hat系のLinuxディストリビューションでfirewallを有効化すると、セキュリティが向上しますが、必要な通信もブロックしてしまいます。
また、ブロックされた側は何が原因でブロックされているのか特定するのも困難です。
そのため、firewalldのログを利用して、ブロックされた通信を特定してfirewallの穴あけを行うための調査を可能にします。
firewalldのログ有効化
firewalldのログはデフォルトでは有効化されていません。 そのため、以下の設定でログを有効化します。
まずは以下のコマンドでfirewalldのログの有効化状況を確認します。
sudo firewall-cmd --get-log-denied# off
なお、/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: offLogDenied=off
上記のコメントに記載している通り、LogDenied
の値は以下のいずれかです。
いずれも拒否パケットに対する設定です。
種類 | 意味 |
---|---|
all | 全てのパケット |
unicast | unicastパケット |
broadcast | broadcastパケット |
multicast | multicastパケット |
上記のLogDeniedを変更するには以下のコマンドを実行します。 実行後、即座に設定が反映されます。
sudo firewall-cmd --set-log-denied=all# sudo firewall-cmd --get-log-denied# all
ログ確認
以下のようなログが/var/log/messeges
に出力されます。
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
を作成します。(実際にはもう少し精査して振り分けルールを作成してください。)
# firewalldのREJECTログを専用ファイルに転送:msg,contains,"filter_IN_public_REJECT" /var/log/firewall-rejected.log& stop
また、ログあふれを防ぐためにログローテーション設定も合わせて入れておくことをお勧めします。
/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を再起動します。
sudo systemctl restart rsyslog
以上