8.1.1 安全性指南
使用 MySQL 连接到因特网的计算机的人员应该阅读本节,以避免最常见的安全错误。
在讨论安全时,需要考虑完全保护整个服务器主机(而不是 MySQL 服务器)对所有类型的攻击:窃听、篡改、回放和拒绝服务。我们不涵盖可用性和容错性方面的所有方面。
MySQL 使用基于访问控制列表(ACL)对所有连接、查询和其他操作的用户尝试进行的安全性。还支持 SSL 加密连接之间的客户端和服务器之间的连接。许多这里讨论的概念都不是特定于 MySQL 的;类似的想法几乎适用于所有应用程序。
在运行 MySQL 时,遵循以下指南:
-
绝不将任何人(除了 MySQL
root
帐户)授予访问user
表在mysql
系统数据库中的权限! 这是非常重要的。 -
了解 MySQL 访问权限系统是如何工作的(见 第8.2节,“Access Control and Account Management”)。使用
GRANT
和REVOKE
语句来控制对 MySQL 的访问。不要授予超过必要的权限。从不授予所有主机的权限。检查清单:
-
尝试
mysql -u root
。如果您可以成功连接到服务器而不需要输入密码,那么任何人都可以连接到您的 MySQL 服务器作为 MySQLroot
帐户拥有全权权限!查看 MySQL 安装指南,特别是关于设置root
密码的信息。见 第2.9.4节,“Securing the Initial MySQL Account”。 -
使用
SHOW GRANTS
语句检查哪些帐户访问了什么,然后使用REVOKE
语句删除不必要的权限。
-
-
不要将明文密码存储在数据库中。如果您的计算机被渗透,攻击者可以使用完整的密码列表。相反,使用
SHA2()
或其他一种一向散列函数,并将哈希值存储在数据库中。为了防止使用彩虹表恢复密码,不要使用这些函数在明文密码上;相反,选择一个字符串作为盐,然后使用 hash(hash(password)+salt) 值。
-
假设所有密码都将被自动破解尝试使用已知密码列表,以及针对您的公开信息,例如社交媒体帖子。不要选择容易被破解或猜测的项目,例如字典单词、姓名、运动队名、缩写或常见短语,特别是如果它们与您相关。使用大写字母、数字替换和添加、特殊字符等方法不管这些方法是可预测的。也不要选择任何您曾经见过的示例密码或其变体,即使它被呈现为强密码。
相反,选择尽可能长且不可预测的密码。这不意味着组合需要是一个难以记忆和复制的随机字符序列,虽然这是一种好方法,如果您拥有密码管理软件,可以生成和填充这样的密码并安全存储。包含多个单词的密码很容易创建、记忆和复制,并且比典型的用户选择的密码更加安全。要创建安全的密码,确保单词和其他项目不是已知短语或引用,不是预测的顺序,并且尽量没有任何关系。
-
投资防火墙。这可以保护您至少50%的所有软件类型的漏洞。将MySQL置于防火墙或非军事区(DMZ)中。
检查清单:
-
尝试使用工具,如
nmap
,从Internet扫描您的端口。MySQL默认使用端口3306。这端口不应该从未受信任的主机访问。作为简单的检查方法,请从某个远程机器上尝试以下命令,其中server_host
是MySQL服务器运行主机的主机名或IP地址:$> telnet server_host 3306
如果telnet卡住或连接被拒绝,端口被阻止,这是您想要的结果。如果您获得连接并一些垃圾字符,端口开放,应该在防火墙或路由器上关闭,除非您真的有好的理由保持开放。
-
-
访问MySQL的应用程序不应该信任用户输入的数据,并且应该使用正确的防御编程技术。见第8.1.7节,“客户端编程安全指南”。
-
不要在Internet上传输明文(未加密)数据。这信息可以被任何人截取和使用,以满足他们自己的目的。相反,使用加密协议,如SSL或SSH。MySQL支持内部SSL连接。另一种技术是使用SSH端口转发创建加密(并压缩)隧道进行通信。
-
学习使用tcpdump和strings实用工具。在大多数情况下,可以通过以下命令检查MySQL数据流是否未加密:
$> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
这在Linux上工作,应该在其他系统上工作。
Warning如果您不看到明文数据,这并不总是意味着信息实际上是加密。如果您需要高安全性,咨询安全专家。