proftpdがfail2banで認識しなくなった!?

はじめに

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

これでようやく出力されるようになった

May  2 17:23:24 server proftpd[283265]: session[283265] 192.168.2.78 (192.168.2.78[192.168.2.78]): USER aaaaaaaa: no such user found from 192.168.2.78 [192.168.2.78] to 192.168.2.99:21

が、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まで同じ動きをするので、修正されててもいいとは思うのだが・・・。時間がある時にでもソースを追ってみても面白いかもしれない。