はじめに
AlumaLinux8/9で色々動作検証していたらproftpdで認証エラーを拾っていない事が判明した。
色々調査した結果、どうやらproftpdのログに認証エラーのログが出ていない。/var/log/messagesの方に出ている事が判明した。
proftpdのバグ?
今までの設定は ExtendedLog を設定して proftpd のサービスログを個別に設定していたが、同じ設定にしているにも関わらず、ftpの操作ログは出るのに認証エラーのログが出ない。
どうもproftpd1.3.6以降がおかしい。1.3.8でも結果は変わらない。proftpdのドキュメントを見ても変更があったようには見えず、恐らくバグなのかもしれない・・・。
色々試してみたが認証エラーについてはsyslogにしか出ないので、rsyslogdに吐き出すproftpdのログだけを別ファイルに出力させることにした。
rsyslogd で出力されるproftpdのログを別ファイルに
/etc/rsyslog.d/proftpd.conf ファイルを作成し、proftpdをキーにして proftpd.log に出力させる
:programname, isequal, "proftpd" -/var/log/proftpd.log
& stop
これでようやく出力されるようになった
が、syslog形式になった為、fail2banでディフォルトで用意されているフィルターでは拾う事ができないので、新たにフィルターを作成する。
fail2banのフィルターを作成する
/etc/fail2ban/filter.d 以下に proftpd_custom.conf という名前でフィルターを作成する。ユーザが存在しないメッセージ以外にも幾つかあるのでディフォルトで用意されている proftpd.conf ファイルを参考に
[INCLUDES]
before = common.conf
[Definition]
_daemon = proftpd
failregex = \(\S+\[<HOST>\]\)[: -]+ USER \S+: no such user found from \S+ \[[0-9.]+\] to \S+:\S+\s*$
\(\S+\[<HOST>\]\)[: -]+ USER \S+ \(Login failed\):.*\s+$
\(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \([0-9]+\) exceeded, connection refused.*\s+$
\(\S+\[<HOST>\]\)[: -]+ SECURITY VIOLATION: \S+ login attempted\s+$
\(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \(\d+\) exceeded\s+$
ignoreregex =
[Init]
journalmatch = _SYSTEMD_UNIT=proftpd.service
最後にfail2banの設定を変更
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 600
findtime = 300
maxretry = 3
[sshd]
enabled = true
[proftpd_custom]
enabled = true
[postfix]
enabled = true
[dovecot]
enabled = true
[postfix-sasl]
enabled = true
rsyslogとfail2banを再起動して完了
実際にftpを失敗してみて、/var/log/fail2ban.log ログに [proftpd_custom] Found というメッセージが出ていれば成功だ。
最後に
ソースを追いかけたわけではないので、もしかするとproftpdの設定が悪いだけなのかもしれない。バグにしても1.3.6~1.3.8まで同じ動きをするので、修正されててもいいとは思うのだが・・・。時間がある時にでもソースを追ってみても面白いかもしれない。