jieiku
(jieiku)
1
我希望 Discourse 能够将无效的登录尝试记录到文件中,即使这需要手动配置。这样我就可以为 Discourse 创建自定义的过滤器和封禁规则。
我使用一个集中式的 fail2ban 服务器。其工作原理是:我所有的容器、Docker 镜像和虚拟机都配置了自定义的封禁动作:
在 fail2ban 中,你可以在 jail 里指定要执行的动作,例如:
action = iptables-allports
然后你只需编辑该动作配置:
sudo nano /etc/fail2ban/action.d/iptables-allports.conf
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
curl -s "https://fail2ban.YourDomain.com:35553/fail2ban.php?token=D2f3Ydy45f6y5FRTfyeFrtYErt&action=add&source=TEST_HOST&reason=TEST_FILTER&ip=111.222.333.444"
通过这种设置,你的容器/Docker/虚拟机会在本地执行 fail2ban 封禁,同时也会将相关信息中继到你的中央 fail2ban 服务器。中央服务器可以收集所有被封禁的 IP,并将其作为文本格式的封禁列表提供,例如:https://fail2ban.YourDomain.com/banned.txt
随后,你可以让 pfSense 防火墙订阅这份封禁列表,甚至可以将该列表与其他 pfSense 路由器共享。这样一来,如果攻击者试图入侵某个应用,他们就会被封禁所有服务。这种方法多年来一直为我提供出色的防护效果。
而要在 Discourse 中实现这一功能,我只需要 Discourse 在发生无效登录尝试时将条目写入日志文件即可🙂
1 个赞
cron
3
顶一下。这看起来是个非常好的主意!
Discourse 在哪里存储和显示日志?
NGINX 日志
偶尔 NGINX 日志可能会提供一些额外提示,它们位于:
cd /var/discourse
./launcher enter app
cd /var/log/nginx
该目录下会有 access.log 和 error.log 文件,以及一堆轮转压缩后的文件。运行 less access.log.2.gz 会自动解压并为你显示日志文件。
该目录在主机上的 /var/discourse/shared/standalone/log/var-log/nginx 也可访问。
遗憾的是,nginx 的 error.log 和 access.log 文件并未记录任何无效登录尝试。
有人能建议其他途径吗?
谢谢。
1 个赞
同意。如果能接入类似 fail2ban 的自动化指数退避机制就太好了。
1 个赞
好奇——这个功能请求是否正在被跟踪或计划中?这将是一个很好的安全功能。
记录(或挂钩)按 IP 地址失败的登录尝试
谢谢!
1 个赞
Falco
(Falco)
6
nginx access.log 文件应包含您需要的、响应 403 的登录路由的行。您检查过日志了吗?
1 个赞
啊,谢谢!我想知道如何从 Docker 镜像/容器外部访问它。
jieiku
(jieiku)
9
你好 @Falco,感谢你的回复。我刚才立即检查了日志,在我看来,正确的密码尝试和不正确的密码尝试看起来是一样的(200 响应):
(我已经对 IP 地址和域名进行了清理,其余部分保持不变)
错误的密码:
[20/Dec/2021:08:07:31 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.016 0.017 "-"
[20/Dec/2021:08:07:32 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 1111 "https://community.example.com/" 0.552 0.550 "-"
正确的密码:
[20/Dec/2021:08:24:50 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.020 0.020 "-"
[20/Dec/2021:08:24:51 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 2251 "https://community.example.com/" 1.216 1.216 "-"
因此,由于它们都返回 200 响应,你无法将其用于 fail2ban,你会封禁所有用户,无论密码正确与否。
2 个赞
Falco
(Falco)
10
Twitter 在密码错误时使用 400,但 Facebook、LinkedIn、Google 和 Amazon 返回 200。IMO 200 听起来不对,但这似乎是“正常”的做法?
也许你可以从一个钩入此方法的插件开始
并完成你需要的操作?
3 个赞
jieiku
(jieiku)
11
太棒了,感谢您的回复!一旦我有点空闲时间,就会尝试制作一个插件来生成这些信息!(我只需要在有人尝试使用错误密码登录时将 IP 地址记录到一个文件中,例如:invalid login attempt from IP 10.111.222.33)
3 个赞
谢谢!我希望使用这个插件;如果您能提供,请告诉我。
Danran
(Dan Ran)
13
您是否曾成功运行过?我也非常有兴趣在我的 discourse 实例上使用 fail2ban。
Jagster
(Jakke Flemming)
14
我正在撰写关于自学成才的网站管理员和纯粹的最终用户角色的文章,但是……
根据定义,无效登录是错误 200。当然,它可以并且应该是应用程序的内部错误,并在某个时候生成其他内容,例如错误 403 加上其他内容,例如发送恢复链接,但这不应该或不能立即发生。
Fail2ban 是一个不错的工具,但确实被高估了。让我们忘记 docker,因为它让一切都变得更难,但它能够绕过 VPS 的 iptables 这一事实对我来说确实很模糊。但是,机器人倾向于在每次尝试 3 次后更改 IP,这使得 Fail2ban 在纯粹的登录暴力攻击面前显得无能为力。
当然,脚本小子是另一回事。他们复制粘贴他们找到的一切,稍微修改一下,并且不更改 IP。然后 Fail2ban 可以阻止他们,即使他们很少能造成任何损害,但会增加负载。真正的问题是当有即时洪水时脚本小子的数量。
但是,只要 VPS 能够处理这种情况,它就无关紧要了。现在是 2023 年,而且这些混蛋大多在 discourse-site 上利用 WordPress 的古老漏洞;)
但我认为,我们应该有一些逻辑来阻止持续的登录尝试,即使它不是每天都会发生的威胁。