nginx ログで fail2ban を使用して、サイトの管理ページをスキャンしているスクリプトをブロックしようとしています。しかし、fail2ban-log に次のようなエラーが表示されます (異なる要求/ユーザーエージェント/リモートアドレス):
2015-09-18 14:45:42,137 fail2ban.filter : ERROR No 'host' found in ' +0200 - ***.**.***.*** http://www.example.com - - "GET /admin HTTP/1.1" 404 737 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/44.0.2403.89 Chrome/44.0.2403.89 Safari/537.36"' using '<_sre.SRE_Pattern object at 0xc53590>'
私のfail2ban-regexは次のようになります:
failregex = \+0200 - <HOST> https?://.*[Aa]dmin.* ((301)|(404))
私のnginx-logformatは次のようになります:
log_format vhosts '$time_local - $remote_addr $scheme://$host - $remote_user "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
そのログ行で fail2ban-regex を実行すると、次のようになります。
fail2ban-regex '18/Sep/2015:14:45:42 +0200 - ***.**.***.*** http://www.example.com - - "GET /admin HTTP/1.1" 404 737 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/44.0.2403.89 Chrome/44.0.2403.89 Safari/537.36"' '\+0200 - <HOST> https?://.*[Aa]dmin.* ((301)|(404))'
Running tests
=============
Use failregex line : \+0200 - <HOST> https?://.*[Aa]dmin.* ((301)|(404))
Use single line : 18/Sep/2015:14:45:42 +0200 - ***.**.***.*** http:/...
Results
=======
Failregex: 1 total
|- #) [# of hits] regular expression
| 1) [1] \+0200 - <HOST> https?://.*[Aa]dmin.* ((301)|(404))
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 1 lines, 0 ignored, 1 matched, 0 missed
IP は に置き換えられます。..* . www.example.com のホストアドレス。fail2ban-regex では、実際の IP とホストを使用しました。