防止对MySQL的暴力攻击?


9

我需要为MySQLd打开网络,但是每次这样做,服务器都会被强行淘汰。一些卑鄙的密码猜测脚本开始在服务器上运行,在端口3306上打开连接并永久尝试随机密码。

我该如何阻止这种情况的发生?

对于SSH,我使用denyhosts,效果很好。有没有办法使denyhosts与MySQLd一起使用?

我也考虑过更改MySQL正在运行的端口,但这并不理想,只是一个权宜之计(如果他们发现了新端口,该怎么办?)

还有其他想法吗?

如果有所不同,我在FreeBSD 6.x上运行MySQL5.x。

Answers:


9

我不知道用于MySQL的任何类似于denyhosts的软件包,但是我确实有几个解决方案:

  • 将登录名限制为特定的IP地址。不要使用%来允许所有主机连接到服务器。
  • 更加安全,将iptables设置为仅允许从授权IP地址访问3306。
  • 使用ssh将您的流量隧道传输到盒子,然后通过localhost连接
  • 修改Denyhosts或BFD脚本以分析mysql访问日志并阻止防火墙上的任何蛮力尝试

编辑

要回答您的评论,请尝试以下操作

iptables -A INPUT -p tcp -s 202.54.1.50 --sport 1024:65535 -d 202.54.1.20 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 202.54.1.20 --sport 3306 -d 202.54.1.50 --dport 1024

.20是MySQL,而.50是远程连接IP地址。


一些注意事项:如何将对端口3306的访问限制为仅给定的IP地址集?仅限制MySQL用户是行不通的,因为远程计算机仍可以连接并强行输入密码。为最终用户设置SSH隧道似乎有些不便。您是否有IPTables示例这样做?
凯思·帕尔默(

2

1:将端口从3306更改。不是出于提高安全性的原因,而是要承担服务器的负载以应对错误的登录攻击

2:创建SSL证书并在您的MySQL服务器上启用它(无论如何都要加密客户端-服务器连接)

3:创建一个或多个客户端证书(所有客户端都需要具有该证书,并且需要将客户端软件配置为使用它)。如果您的客户端是.Net,则需要将客户端证书转换为pkcs12格式,但这很容易做到,请参阅指南。

4:将MySQL用户帐户设置为需要x509客户端证书,然后攻击者都需要登录凭据和客户端证书(您甚至可以在客户端证书上输入密码,然后攻击者也需要密码)。

我使用指南制作证书和密钥文件,但那里有许多指南。

我只希望使用SSH连接访问Linux框用于管理目的,而不是用于客户端访问。


感谢您的回答。我用这个导向做#2,3和4:digitalocean.com/community/tutorials/...
ofri cofri

1

使用MySQL代理,您可以编写一个小的LUA脚本,该脚本采用用户/密码组合,但是如果连接请求来自未经批准的IP范围,则需要等待X秒来处理登录。

您还可以在LUA脚本中添加一些额外的逻辑,以在三次失败尝试后将IP范围列入黑名单。

总而言之,这在技术上是可行的,但我会提出其他建议,即通过SSH或VPN隧道连接到常见的白名单(通过FW或其他方式)的IP范围。


+1 MySQL代理的另一种用法:)
Andy

0

为什么不只允许安全主机访问mysqld端口?


我考虑了这一点,但这意味着我必须监视1000多个客户端的IP地址更改。那将是巨大的屁股痛...无论如何我该怎么做?将它们锁定在MySQL内无济于事,因为它们仍然可以连接到MySQL服务器,只是实际上没有选择任何数据库...
Keith Palmer Jr.

1
引用上面的戴夫·德拉格:“修改Denyhosts或BFD脚本以分析mysql访问日志并阻止对防火墙的任何强行尝试”似乎是最好的主意,或使用一些象形文字的密码:)
quaie

0

虽然这不是一个“真实”的答案-我不知道您为什么需要直接将其公开给外界。

您不能在该框中启用ssh并使用隧道访问数据库引擎吗?

或任何其他访问它的VPN解决方案(想到了openvpn)。


0

这不是真正的解决方案,但是如果仅在其他端口上运行服务器,则可能会有所帮助。这些扫描程序中的大多数可能已被编程为仅检查3306。它不能解决问题,但是仅更改端口,您的扫描次数可能会少很多。


-1出于隐晦的安全性
thepocketwade

@thepocketwade-这就是为什么我说这不是解决问题的真正方法。但这可能仍然有帮助。
Eric Petroelje 09年

0

我认为连接应该经过防火墙保护:快速又不错。有很多关于iptables的教程:

您还可以在客户端主机上安装cronjob,该客户端将在服务器上运行smth以防止防火墙阻止已知主机。


0

使用ssh进行隧道传输是最好的,但是您可以尝试使用fail2ban代替denyhosts,因为我认为它旨在监视更多不同的应用程序,因此向其添加mysql日志应该不是问题。


0

建议为您的my.cnf-ini [mysqld]部分考虑

max_connect_errors=10  # to limit hacker/cracker attempts to guess a password.

避免在90秒内进行数百次尝试。尝试10次将其切碎。

考虑每天清理一次主机,以清除尝试使用您的系统的合法人员,而这些人根本无法记住他们的密码。也许几天后,他们会接受的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.