限制来自本地主机的 MySQL 连接以提高安全性

Posted

技术标签:

【中文标题】限制来自本地主机的 MySQL 连接以提高安全性【英文标题】:Restricting MySQL connections from localhost to improve security 【发布时间】:2012-10-23 21:38:59 【问题描述】:

我听说任何知道我的 mysql 用户名和密码的人都可以访问它,即使它只监听 localhost

假设我的信息如下:

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

那里的任何人(本地)怎么可能访问它?

【问题讨论】:

问题是什么?你能把问题写清楚吗? 最近,有人得到了我的 MySQL 信息(用户和密码)并搞砸了一切。所以,我提高了安全性,让它只听本地主机连接......不管怎样,他又得到了我的数据库信息,并说他可以做任何他想做的事。由于它只监听本地主机连接,他可以访问它的方式是什么?他肯定没有我的服务器密码,所以他不能在本地操作。 【参考方案1】:

如果您将远程主机的访问限制为您的用户名和密码,那么其他人将无法从外部访问数据库。

您还可以将防火墙配置为仅允许从 localhost 机器到 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] 部分来做到这一点:

[mysqld]
bind-address = 127.0.0.1

【讨论】:

那么,这不可能吗?? 是的 - 如果您在 3306 上阻止防火墙与外部连接,他无法以这种方式访问​​,并且如果您将 MySQL 用户设置为仅从本地计算机访问,他将需要在本地机器获得访问权限。 我没有设置任何防火墙,但只有允许的主机可以连接到它。我只是想确保不知道的主机无法连接到它,即使该主机背后的人拥有我的数据库的用户名和密码。 如果您将 MySQL 用户名配置为仅允许来自 LOCALHOST 的连接,则该用户必须在本地计算机上才能连接 - 您可以通过尝试从另一个服务器连接到您的 MySQL 服务器来自行测试机器。 绑定地址设置应位于 my.cnf 或 my.ini 的 [mysqld] 部分。来自the manual:“mysqld 从 [mysqld] 和 [server] 组读取选项。”【参考方案2】:

您可以在防火墙或 MySQL 内部阻止对 MySQL 的直接访问,但最有可能被黑客入侵的方式是通过不安全的 Web 应用程序 - 在这种情况下,攻击者很可能能够读取您的数据库登录信息并从服务器连接。

因此,请确保您的应用程序安全 - 保持一切更新,不允许文件上传,如果您有多个帐户,请使用 suphp 等。

如果您限制您的 mysql 应用程序,请按照以下步骤操作:

1.您可以只阻止端口 3306。如果站点在同一台服务器上,那么它仍然可以使用 localhost 作为主机名访问数据库。

2.只需将“bind-address = 127.0.0.1”添加到他们的 my.cnf 文件的“[mysqld]”部分,以限制仅访问本地主机。

大多数人都使用这种类型的限制。

【讨论】:

【参考方案3】:

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

如果被入侵,那么除了限制连接外,还要更改所有密码。

【讨论】:

你能链接到这个“老问题”吗?在您的答案中链接到它和/或在此处包含更多详细信息对您来说非常有用。 @verdammelt 我相信史蒂夫说这是自 2012 年以来的一个较老的问题(整个线程),但史蒂夫无论如何都会在 2015 年回答。【参考方案4】:

我没有看到回答他(调整后的)问题的答案 - 他已将其锁定到 localhost 并且攻击者仍在进入。

如果您确实将其限制到本地主机(使用 netstat -an | egrep 3306 检查它是否正在侦听 127.0.0.1 而不是 0.0.0.0), 那么访问它的唯一方法是从该本地主机发起连接。

要采取的初步步骤:

    可能从头开始重建替换系统并在公开访问之前对其进行强化(拥有可重复的配方,例如使用 ansible 会有所帮助,因为您可能需要经过几次迭代才能了解他是如何进入的) 使用信誉良好的安全扫描器检查您的明显漏洞是什么, 从安全专家那里获得帮助(取决于您是否想花费美元或时间和挫折来修复) 应用安全补丁, 删除不需要的服务, 将数据库访问权限限制为仅对需要它的程序进行访问, 重做所有密码, 检查已安装的 root 工具包和其他病毒, 如果在您自己的办公室,请保护您的服务器并培训员工处理社会工程, 使用将监视和过滤通过的请求并拒绝直接访问的服务(例如,使用 cloudflare 作为起点) 检查用于访问服务器的所有计算机上的键盘记录器(物理和软件以及其他病毒), 检查在访问服务器时记录击键的物理方式(例如 atm 中使用的网络摄像头样式),更奇特的包括声音(https://en.wikipedia.org/wiki/Acoustic_cryptanalysis),使用附近的 wifi 接入点打字(例如 https://www.schneier.com/blog/archives/2016/08/keystroke_recog.html) 添加审计跟踪并监控数据库活动以了解他是如何通过的,但至少您需要先进行所有明显的保护,否则他只会从一个安全漏洞跳到另一个安全漏洞

他也可以通过使用:

    通过您正在运行的某个程序(例如 Web 服务器)进行访问,该程序可从外部访问,并且有一个安全漏洞,允许他通过其现有的数据库连接运行任意 sql 命令 - 请参阅 https://www.w3schools.com/sql/sql_injection.asp

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

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

    中间人攻击具有合法访问权限的连接

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

    社会工程是一种让人们为您提供访问权限的方法

    设法将硬件设备连接到可以访问的计算机(有多少人会在工作停车场中拿起“记忆棒”并检查它而不是“可编程键盘”,以及所有计算机都信任键盘!)

    还有更多我不知道的所有其他类型的方法,但所涉及的方法共享...

请记住,你需要有实际的安全性,我认为 xkcd 说得恰到好处:https://xkcd.com/538/

【讨论】:

+1 表示入侵可能来自 SQL 注入而不是捕获的凭据

以上是关于限制来自本地主机的 MySQL 连接以提高安全性的主要内容,如果未能解决你的问题,请参考以下文章

HTTP/2 是不是提高了每个主机的连接限制?

SSH 绑定本地端口

MySQL服务安全加固

MySQL服务安全加固

如何使我的电脑作为主机服务器工作?

xampp从连接在同一网络中的不同系统将数据发送到MySQL db到本地主机[重复]