6.1.1 安全准则

在连接到 Internet 的计算机上使用 MySQL 的任何人都应阅读本节,以避免最常见的安全错误。

在讨论安全性时,有必要考虑完全保护整个服务器主机(不仅仅是 MySQL 服务器)免受所有类型的适用攻击:窃听,更改,回放和拒绝服务。在此,我们不涵盖可用性和容错性的所有方面。

MySQL 对所有连接,查询和用户可以尝试执行的其他操作使用基于访问控制列 table(ACL)的安全性。 MySQLClient 端和服务器之间还支持 SSL 加密的连接。这里讨论的许多概念根本不是特定于 MySQL 的。相同的基本思想适用于几乎所有应用程序。

运行 MySQL 时,请遵循以下准则:

  • 请勿授予任何人(除 MySQL root帐户外)对mysql系统数据库中的usertable 的访问权限! 这很关键。

  • 了解 MySQL 访问权限系统的工作原理(请参见第 6.2 节“访问控制和帐户 Management”)。使用GRANTREVOKE语句控制对 MySQL 的访问。不要授予不必要的特权。切勿向所有主机授予特权。

Checklist:

  • 尝试mysql -u root。如果您能够成功连接到服务器而无需 Importing 密码,则任何人都可以以具有完全特权的 MySQL root用户身份连接到 MySQL 服务器!查看 MySQL 安装说明,特别注意有关设置root密码的信息。参见第 2.10.4 节“保护初始 MySQL 帐户”

    • 使用SHOW GRANTS语句检查哪些帐户有权访问哪些帐户。然后使用REVOKE语句删除那些不必要的特权。
  • 不要在数据库中存储明文密码。如果您的计算机受到威胁,入侵者可以获取完整的密码列 table 并使用它们。而是使用SHA2()或其他一些单向哈希函数并存储哈希值。

为了防止使用彩虹 table 恢复密码,请勿在普通密码上使用这些功能;相反,请选择一些字符串用作盐,然后使用 hash(hash(password)salt)值。

  • 不要从词典中选择密码。存在特殊程序来破解密码。甚至“ xfish98”之类的密码也非常糟糕。更好的是“ duag98”,它包含相同的单词“ fish”,但在标准 QWERTY 键盘的左侧键入了一个键。另一种方法是使用从句子中每个单词的第一个字符获取的密码(例如,“四分之七年前”的密码为“ Fsasya”)。密码很容易记住和 Importing,但是对于不知道该句子的人来说很难猜出来。在这种情况下,您可以另外用数字代替数字单词以获得短语“ 4 score and 7 years ago”,从而产生密码“ 4sa7ya”,这更加难以猜测。

  • 投资防火墙。这可以保护您免受任何软件中至少 50%的所有利用类型的攻击。将 MySQL 放在防火墙后面或非军事区(DMZ)中。

Checklist:

  • 尝试使用nmap之类的工具从 Internet 扫描端口。 MySQL 默认使用端口 3306.无法从不受信任的主机访问此端口。作为检查 MySQL 端口是否打开的简单方法,请从某些远程计算机尝试以下命令,其中* server_host *是运行 MySQL 服务器的主机的主机名或 IP 地址:
shell> telnet server_host 3306

如果 telnet 挂起或拒绝连接,则该端口被阻止,这就是您想要的状态。如果获得连接和一些垃圾字符,则该端口是打开的,并且应该在防火墙或 Router 上关闭该端口,除非您确实有充分的理由将该端口保持打开状态。

  • 访问 MySQL 的应用程序不应信任用户 Importing 的任何数据,而应使用适当的防御性编程技术来编写。参见第 6.1.7 节“Client 端编程安全性准则”

  • 不要通过 Internet 传输纯数据(未加密)。有时间和能力的人都可以访问此信息,并将其用于自己的目的。而是使用加密协议,例如 SSL 或 SSH。 MySQL 支持内部 SSL 连接。另一种技术是使用 SSH 端口转发来创建用于通信的加密(和压缩)隧道。

  • 学习使用 tcpdumpstrings Util。在大多数情况下,您可以通过发出以下命令来检查 MySQL 数据流是否未加密:

shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

这可以在 Linux 下使用,并且应该可以在其他系统上进行一些小的修改。

Warning

如果看不到明文数据,则并不总是意味着该信息实际上是加密的。如果需要高安全性,请咨询安全 maven。