在目前的设置中,我使用 NGINX 作为(多个)内部虚拟机的代理。现在,我想保护这些虚拟机免受暴力破解,这样,如果出现大量 401 错误,IP 就应该被阻止。
我已经在 Google 上搜索过如何使用 fail2ban,但我不明白它在我的情况下如何发挥作用。
nginxaccess.log
看起来像这样(我隐藏了一些敏感信息)
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:43:32 +0100] "POST /v1/schemas/7...b8/documents HTTP/1.1" 200 364 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:43:32 +0100] "DELETE /v1/documents/fd7...09e1?force=true HTTP/1.1" 200 83 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:43:32 +0100] "GET /v1/schemas/713e4ee8-...b8/documents HTTP/1.1" 200 6689 "-" "python-requests/2.10.0"
47.XXX.XXX.XXX - - [09/Jan/2017:13:43:33 +0100] "GET /wp-login.php HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
47.XXX.XXX.XXX - - [09/Jan/2017:13:43:39 +0100] "GET /wp-login.php HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
47.XXX.XXX.XXX - - [09/Jan/2017:13:43:44 +0100] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "GET /v1/schemas/713e4e...d649b8/documents HTTP/1.1" 200 6689 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "POST /v1/schemas/713e4..fd649b8/documents HTTP/1.1" 200 364 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "DELETE /v1/documents/9f5....cadf29031c?force=true HTTP/1.1" 200 83 "-" "python-requests/2.10.0"
148.XXX.XXX.XXX - 92....396 [09/Jan/2017:13:44:33 +0100] "GET /v1/schemas/713e...649b8/documents HTTP/1.1" 200 6689 "-" "python-requests/2.10.0"
87.XXX.XXX.XXX - {{customerId [09/Jan/2017:13:45:08 +0100] "GET /v1/repositories HTTP/1.1" 401 101 "-" "PostmanRuntime/3.0.9"
87.XXX.XXX.XXX - {{customerId [09/Jan/2017:13:45:09 +0100] "GET /v1/repositories HTTP/1.1" 401 101 "-" "PostmanRuntime/3.0.9"
87.XXX.XXX.XXX - test [09/Jan/2017:13:45:20 +0100] "GET /v1/repositories HTTP/1.1" 401 101 "-" "PostmanRuntime/3.0.9"
如您所见,NGINX 充当服务以及网站和其他服务的代理。我想要阻止的是最后 3 行,其中返回代码为 401。
据我所知(主要是从这里)我可以创建一个正则表达式来拦截包含 401 的行,设置 3600 的突发时间(60 分钟锁定)和 100 次重试。这样每小时允许 100 次错误。
笔记:我必须弄清楚这个值(有什么想法吗?),有时可能会有人得到 401。
然而,我知道理论,但还不知道实践。有人能帮我设置一下吗,特别是如何为该条件编写正则表达式。
我想出了^<HOST>.* 401
但不知道是否足够我想避免错误地阻止所有人。
找到正则表达式后,我应该将此规则添加到一个文件中(我们将其命名nginx-401.conf
为/etc/fail2ban/filter.d/
[Definition]
failregex = ^<HOST> -.* 401
ignoreregex =
以及jail.conf
[nginx-401]
enabled = true
action = iptables-multiport[name=NoProxy, port="http,https"] # no idea of this, copied from somewhere else. what should I put here?
filter = nginx-401 # should be the file name
logpath = /var/log/nginx*/*access*.log
maxretry = 100 # my limit
bantime = 3600 # 1 hour
这里我真的不知道应该做什么action
以及其余部分是否设置正确。
答案1
登录对话框页面本身返回 401 代码。
失败的登录使用以下语法记录:
<host> - <user> [06/Jun/2018:11:18:55 +0300] "GET / HTTP/1.1" 401 ...
...其中给定的用户名在 '<user>' 中并且返回代码是 401
[Definition]
failregex = ^<HOST> - [^-[ ]+.+HTTP/1.[0-9]" 401
ignoreregex =
此正则表达式不会匹配用户名为空的登录尝试。在这种情况下,用户名将为“-”,这与登录对话框页面密不可分。
答案2
最后它似乎起作用了,这是我的配置,仅供参考:
/etc/fail2ban/filter.d/wrongauth.conf
[Definition]
failregex = ^<HOST> -.* 401
ignoreregex =
在/etc/fail2ban/jail.con
[wrongauth]
enabled = true
filter = wrongauth
action = shorewall
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
logpath = /var/log/nginx*/*access*.log
banTime = 600 # 10 minutes
findTime = 60
maxretry = 60
作为行动,我使用 shorewall,并在禁令发生时发送电子邮件,我必须根据您看到的设置相应地修改操作。