fail2ban gitlab UI 登录尝试

Posted

技术标签:

【中文标题】fail2ban gitlab UI 登录尝试【英文标题】:fail2ban gitlab UI login attempts 【发布时间】:2018-12-01 00:08:59 【问题描述】:

我正在尝试使用fail2ban 来阻止通过 UI 进行过多登录尝试的来源的 IP 地址。 fail2ban 适用于 sshd,但不适用于我的 gitlab 访问日志自定义过滤器。

系统

ubuntu 服务器 16.04.4 LTS gitlab 10.8.4 fail2ban 0.9.3

访问日志权限/路径

-rw-r--r-- 1 root root 186726 Jun 21 09:54 /var/log/gitlab/nginx/gitlab_access.log

禁止访问日志示例

192.168.1.2 - - [21/Jun/2018:09:52:06 -0400] "POST /users/sign_in HTTP/2.0" 200 4199 "https://example.com:88/users/sign_in" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/66.0.3359.181 Safari/537.36"

fail2ban 配置

/etc/fail2ban/jail.conf

[nginx-gitlab]

enabled  = true
port     = http,https
filter   = nginx-gitlab
logpath  = /var/log/gitlab/nginx/gitlab_access.log
maxretry = 3

fail2ban 过滤器

/etc/fail2ban/filter.d/nginx-gitlab.conf

# Fail2Ban configuration file
#
# Author: Deac Karns 
#

[Definition]


failregex = ^<HOST> – -.*”POST /users/sign_in HTTP.*” 200.*$

ignoreregex =

fail2ban-regex 测试输出

sudo fail2ban-regex /var/log/gitlab/nginx/gitlab_access.log /etc/fail2ban/filter.d/nginx-gitlab.conf


Running tests
=============

Use   failregex filter file : nginx-gitlab, basedir: /etc/fail2ban
Use         log file : /var/log/gitlab/nginx/gitlab_access.log
Use         encoding : UTF-8


Results
=======

Failregex: 0 total

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1147] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-

Lines: 1147 lines, 0 ignored, 0 matched, 1147 missed [processed in 0.06 sec] 
Missed line(s): too many to print.  Use --print-all-missed to print all 1147 lines

【问题讨论】:

这可能是您的正则表达式中的引号“不正确。我建议使用 fail2ban-regex -D 并包含您的单行失败。您确定此 POST 不会在成功时发生登录?阅读FILTERS 避免由于正则表达式过于宽泛而导致的 DDoS。 【参考方案1】:

您的过滤器中有错误的字符。你是手动写的吗?相反,您应该复制并粘贴要匹配的日志,以避免输入相似的字符。

第一个错误字符是连字符。

你写了^&lt;HOST&gt; – - 但应该是^&lt;HOST&gt; - -

另一个错误字符是@danblack's comment 指出的双引号。

你写了.*”POST /users/sign_in HTTP.*” 200.*$ 但应该是.*"POST /users/sign_in HTTP.*" 200.*$

最后让我建议您在过滤器中添加关于匹配状态代码 200 的注释,这似乎是绝对有效的,它的存在可能会变得非常混乱。声明我们将状态码 200 视为登录尝试失败是合适的,因为如果成功,它将是 302(而不是重定向)。

过滤器的固定版本

/etc/fail2ban/filter.d/nginx-gitlab.conf

# Fail2Ban configuration file
#
# Authors: Deac Karns & jirislav
#

[Definition]

# We are considering status code 200 as failed login attempt 
# because if it was successfull, it would be 302
failregex = ^<HOST> - -.*"POST /users/sign_in HTTP.*" 200.*$

ignoreregex =

【讨论】:

【参考方案2】:

你的一些角色需要逃脱它们。我还用更多的锚改进了表达式,使其更安全。试试这个

failregex = ^<HOST> - - \[.+\] \"POST \/users\/sign_in HTTP\/.+\".*\b\"$

您可以在以下位置进行测试:regex101.com 替换为:

^(\d+.\d+.\d+.\d+) - - \[.+\] \"POST \/users\/sign_in HTTP\/.+\".*\b\"$

【讨论】:

以上是关于fail2ban gitlab UI 登录尝试的主要内容,如果未能解决你的问题,请参考以下文章

2FA + openssh 安全服务器上的 Gitlab

Gitlab 账户 2FA 丢失

fail2ban使用教程

当我尝试使用赛普拉斯登录帐户时如何使用 2FA?

gitlab的root用户双认证问题

GitLab 最重要 - 单点登录中断