エラーメッセージに対応する
メールサーバー用のポートに朝から晩までのべつ幕無しにアタックしてくるIPアドレスにいちいち反応するのも癪だけどログが汚くなるのでFirewalldでドロップする事にした。とは言ってもログを見て手動で追加するのも面倒だしって事で、いろいろなサイトを参考にfirewall-cmdを吐き出すシェルを作ってみた。自動化には程遠いけど(笑) firewall-cmdで「–permanent」オプションを付けずに「–add-source」をすると次回の「–reload」でチャラになるのを逆手に取って、直近の「mail.log」で以下のようなログを5回吐いたIPアドレスを文字通りドロップゾーンに落とす(笑)設定です。
postfix/smtpd[8671]: warning: unknown[185.137.111.77]: SASL LOGIN authentication failed: authentication failure
作ったシェルはこんな感じ。前述したように「–reload」で一旦チャラにして、前回実行時の抽出結果と比較して差分があれば実行するってやりたかったけど、その部分は別シェルで手動で確認して「Firewalld」を再設定した方が良いと判断したら手で以下のシェルを起動するというとってもアナログな方法です(笑)
firewall-cmd --reload cat /var/log/mail.log |grep 'authentication failed' | egrep -o -e '\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\]' | sed -e 's/^\[\(.*\)\]$//g' | sort | uniq -c | awk '$1 > 5 {print $2}' > /etc/postfix/sals_failed_ip_list || exit 1 while read LINE do firewall-cmd --add-source $LINE --zone=drop done < /etc/postfix/sals_failed_ip_list firewall-cmd --list-all --zone=drop exit $?
ある程度の期間を見て、最終的に本当にドロップする必要があると判断した相手はVPC上のネットワークACLでしっかり「DENY」にしています。