限制MySQL连接仅从本地主机进行以提高安全性

31

我听说只要知道我的MySQL用户名和密码,就可以访问它,即使只是在本地localhost上监听。

假设我的信息如下:

USER: root
PASS: 123456
Host: LOCALHOST (only)

有人在当地如何能够访问这个内容?


什么是问题?你能清楚地发布问题吗? - Ami
最近,有人获取了我的MySQL信息(用户名和密码),并搞乱了一切。因此,我加强了安全性,并使其仅监听本地连接...无论如何,他再次获取了我的数据库信息,并声称可以为所欲为。既然它只监听本地连接,那么他怎么能访问它呢?他肯定没有我的服务器密码,所以他无法在本地进行操作。 - Genesis
4个回答

55

如果您限制远程主机对用户名和密码的访问,则某人将无法从外部访问数据库。

您还可以配置防火墙,仅允许来自本地主机的3306端口(MySQL默认端口)的流量。

更新

要设置用户只能通过LOCALHOST访问,请使用:

GRANT ALL PRIVILEGES ON *.* TO db_user @'localhost' IDENTIFIED BY 'db_passwd';
GRANT ALL PRIVILEGES ON *.* TO db_user @'127.0.0.1' IDENTIFIED BY 'db_passwd';

另外,将MySQL服务器绑定到本地地址。您可以通过编辑my.cnf中的[mysqld]部分来实现此操作:

也就是说,在my.cnf文件中找到[mysqld]部分,并进行如下编辑以将MySQL服务器绑定到本地地址:

[mysqld]
bind-address = 127.0.0.1

是的 - 如果你在防火墙上阻止了3306端口的外部连接,他就无法通过这种方式进入,如果你设置了MySQL用户只能从本地机器访问,他需要在本地机器上才能获得访问权限。 - ajtrichards
如果您将MySQL用户名配置为仅允许从LOCALHOST进行连接,则用户必须在本地计算机上才能连接 - 您可以通过尝试从另一台计算机连接到MySQL服务器来测试此功能。 - ajtrichards
我知道,但我在想黑客是否可以绕过那个设置。 - Genesis
@Norman 是的,如果 bind-address=127.0.0.1,人们仍然可以查看网站及其内容。 - ajtrichards
3
bind-address 设置应该在 my.cnf 或 my.ini 文件的 [mysqld] 部分中。根据 手册: "mysqld 从 [mysqld] 和 [server] 组读取选项"。 - Bob Stein
显示剩余4条评论

5

我发现这是一个比较老的问题,但如果Darkeden有phpMyAdmin或类似的程序运行,任何人都可以使用有效的MySQL凭据登录。

如果它被攻击了,除了限制连接之外,还需要更改所有密码。


1
你能链接到这个“旧问题”吗?在你的回答中链接它并/或者包含更多细节将非常有用。 - verdammelt
3
我认为Steve的意思是,这个问题(整个讨论串)比较旧,因为它来自2012年,但是Steve仍然在2015年回答这个问题。 - thelogix

5
您可以在防火墙或MySQL本身中阻止直接访问MySQL,但您最可能被黑客攻击的方式是通过不安全的Web应用程序 - 在这种情况下,攻击者很可能能够读取您的数据库登录名并从服务器连接。因此,请保持应用程序的安全性 - 保持所有内容更新,不允许文件上传,如果您有多个帐户,请使用suPHP等。
如果您要限制mysql应用程序,请按照以下步骤操作:
1.您可以只阻止3306端口。如果站点位于同一台服务器上,则仍然可以使用localhost作为主机名访问数据库。
2.只需将“bind-address=127.0.0.1”添加到其my.cnf文件的“[mysqld]”部分,以仅限制对本地主机的访问。
大多数人使用这种类型的限制。

4
我没有看到回答他(修改后的)问题的答案 - 他已将其锁定为本地主机,但攻击者仍在进入。 如果您确实将其限制为本地主机(使用netstat -an | egrep 3306检查它是否正在侦听127.0.0.1而不是0.0.0.0),那么访问它的唯一方法是从该本地主机发起连接。
要执行的初始步骤:
  1. 在你将系统公开访问之前,最好从头开始重建一个替代系统并加强其安全性(使用ansible等可重复的配方将有所帮助,因为您可能需要经历几次迭代才能了解他是如何进入的)。
  2. 寻求安全专业人员的帮助(取决于您想花费多少金钱或时间和挫折来解决问题)。
  3. 应用安全补丁,
  4. 删除不必要的服务,
  5. 将数据库访问限制为仅限需要它的程序,
  6. 重新设置所有密码,
  7. 检查已安装的Rootkit和其他病毒,
  8. 如果在自己的办公室中,保护您的服务器并培训员工处理社交工程,
  9. 使用监视和过滤请求并拒绝直接访问的服务(例如使用Cloudflare作为廉价起点),
  10. 检查所有用于访问服务器的计算机上是否存在键盘记录器(物理和软件以及其他病毒),
  11. 检查记录您键入密码的物理手段(例如ATM中使用的网络摄像头样式),更奇特的包括声音(链接1: https://en.wikipedia.org/wiki/Acoustic_cryptanalysis),在附近的WiFi接入点上打字(例如链接2: https://www.schneier.com/blog/archives/2016/08/keystroke_recog.html)
  12. 添加审计跟踪并监视数据库活动以确定他是如何进入的,但至少您需要首先完成所有明显的安全保障,否则他将只是从一个安全漏洞跳到另一个。
他也可以通过以下方式进行:
  1. 通过运行的某个程序(例如Web服务器),该程序可以从外部访问并存在安全漏洞,允许他通过现有的数据库连接运行任意SQL命令 - 请参见https://www.w3schools.com/sql/sql_injection.asp

  2. 欺骗他可以从外部访问的某些程序代理与localhost:3306的连接(例如通过机器上错误配置的网络防火墙)

  3. 欺骗某个程序运行本地程序(bash、mysql等),然后从那里获得对数据库的访问权限 - 缓冲区溢出和其他特别设计的数据是运行任意代码的常见问题

  4. 在具有合法访问权限的连接上进行中间人攻击

  5. 处理来自外部的数据的程序中的错误,例如电子邮件、后置脚本/ PDF / 任何带有脚本处理的文档的处理 - 即使查看文本文件也可能很危险 - 请参见https://www.proteansec.com/linux/blast-past-executing-code-terminal-emulators-via-escape-sequences/

  6. 通过社交工程方式获得访问权限

  7. 设法将硬件设备连接到具有访问权限的计算机上(有多少人会在工作停车场捡起一个“存储器棒”并检查它,而不是一个“可编程键盘”,而且所有计算机都信任键盘!)

  8. 还有许多其他类型的方法我不知道,但其中涉及的人分享...

请记住,您需要拥有实用的安全措施,我认为xkcd说得很对:https://xkcd.com/538/


1
+1 分,因为妥协可能来自 SQL 注入而不是捕获的凭据。 - John Sherwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接