_fail2ban
_は失敗した公開鍵sshログインを認識しません。これは、_/etc/fail2ban/filter.d/sshd.config
_のfailregex
を次の行と一致するように変更することで解決できると思います。
_<date> <time> <server-hostname> sshd[25917]: Connection closed by <client-ip> [preauth]
_
しかし、このfailregexを正しく変更する方法についてのきちんとした紹介が見つかりません。 ^%(__prefix_line)s
のような変数がどの変数に含まれているかは本当にわからないので、正常な正規表現を取得するのは困難です。
最新バージョン0.9.1には「[preauth]によって閉じられた接続」行に一致する正規表現が含まれていることを理解していますが、Debianリポジトリのfai2banを使用しており、0.9.1の構成は私が使用しているものと互換性がありません持ってる。
この行はそれを行います:
^%(__prefix_line)sConnection closed by <Host> \[preauth\]$
次のログ文字列でテスト:
Apr 29 12:30:12 sendai sshd[25917]: Connection closed by 127.0.0.1 [preauth]
正常にテストされた:
$ fail2ban-regex ~/ssh.log sshd.conf
Running tests
=============
Use regex file : sshd.conf
Use log file : /home/user/ssh.log
Results
=======
Failregex
|- Regular expressions:
[...]
| [12] ^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*Connection closed by <Host> \[preauth\]$
|
`- Number of matches:
[...]
[12] 1 match(es)
Summary
=======
Addresses found:
[...]
[12]
127.0.0.1 (Wed Apr 29 12:30:12 2015)
[..]
Success, the total number of match is 1
少なくともopenssh 7.3では、ログメッセージにポート番号も含まれています。そのため、sebixのソリューションを次のように変更する必要がありました。
^%(__prefix_line)sConnection closed by <Host> port \d+ \[preauth\]$
正規表現のハッキングは必要ありません(少なくともfail2ban 0.10.4以降)。 /etc/fail2ban/jail.conf
は次の情報です。
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
したがって、/etc/fail2ban/jail.local
他のカスタマイズとともに、より厳しいモードの1つと一緒に、たとえば、
[sshd]
mode = aggressive
このモードは、失敗した公開鍵をカバーするようになりました。
OpenSSH 7.6p1を搭載したUbuntu 18.04では、/ etc/fail2ban/filter.d/sshd.confの "cmnfailre"ルールを次のように拡張する必要がありました。
^%(__prefix_line)sConnection closed by authenticating user <F-USER>.+</F-USER> <Host> port \d+ \[preauth\]$
正しいsshキーなしでsshログイン試行を照合するには:
Apr 14 15:27:15 ubuntu-server sshd[8719]: Connection closed by authenticating user root x.x.x.x port 42664 [preauth]
Apr 14 15:27:15 ubuntu-server sshd[8721]: Connection closed by authenticating user root x.x.x.x port 42666 [preauth]
Apr 14 15:27:16 ubuntu-server sshd[8723]: Connection closed by authenticating user root x.x.x.x port 42668 [preauth]
Apr 14 15:27:16 ubuntu-server sshd[8725]: Connection closed by authenticating user root x.x.x.x port 42670 [preauth]
Apr 14 15:27:17 ubuntu-server sshd[8727]: Connection closed by authenticating user root x.x.x.x port 42672 [preauth]
私にとっては、少なくともOpenSSH 6.6.1のバリエーションでは、「接続が閉じました」正規表現と一致する大量の正当なログエントリを取得するので、これはうまく機能します。 「ポート」を含む新しいOpenSSHログ形式もカバーしていると考えてください。
^%(__prefix_line)sDid not receive identification string from <Host>\s*$
^%(__prefix_line)sReceived disconnect from <Host>: (port \d*: ){,1}11: (Bye Bye){,1} \[preauth\]\s*$
$ cat /etc/*relea* | grep -i desc
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
$ fail2ban-regex /var/log/auth.log filter.d/sshd.conf
Running tests
=============
Use failregex file : filter.d/sshd.conf
Use log file : /var/log/auth.log
Results
=======
Failregex: 39 total
|- #) [# of hits] regular expression
| 12) [16] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*Did not receive identification string from <Host>\s*$
| 13) [23] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*Received disconnect from <Host>: (port \d*: ){,1}11: (Bye Bye){,1} \[preauth\]\s*$
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [62412] MONTH Day Hour:Minute:Second
`-
Lines: 62412 lines, 0 ignored, 39 matched, 62373 missed
Missed line(s):: too many to print. Use --print-all-missed to print all 62373 lines
$ grep "Did not receive identification string from" /var/log/auth.log | wc -l
16
$ grep "Received disconnect from" /var/log/auth.log | grep -v x.x.x.x | wc -l
23