Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Security Guidelines

8.1.1 安全性指南

使用 MySQL 连接到因特网的计算机的人员应该阅读本节,以避免最常见的安全错误。

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

MySQL 使用基于访问控制列表(ACL)对所有连接、查询和其他操作的用户尝试进行的安全性。还支持 SSL 加密连接之间的客户端和服务器之间的连接。许多这里讨论的概念都不是特定于 MySQL 的;类似的想法几乎适用于所有应用程序。

在运行 MySQL 时,遵循以下指南:

  • 绝不将任何人(除了 MySQL root 帐户)授予访问 user 表在 mysql 系统数据库中的权限! 这是非常重要的。

  • 了解 MySQL 访问权限系统是如何工作的(见 第8.2节,“Access Control and Account Management”)。使用 GRANTREVOKE 语句来控制对 MySQL 的访问。不要授予超过必要的权限。从不授予所有主机的权限。

    检查清单:

    • 尝试 mysql -u root。如果您可以成功连接到服务器而不需要输入密码,那么任何人都可以连接到您的 MySQL 服务器作为 MySQL root 帐户拥有全权权限!查看 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端口转发创建加密(并压缩)隧道进行通信。

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

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

    这在Linux上工作,应该在其他系统上工作。

    Warning

    如果您不看到明文数据,这并不总是意味着信息实际上是加密。如果您需要高安全性,咨询安全专家。