6.1.1 安全指南

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

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

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

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

  • 永远不要让任何人(MySQL root帐户除外)访问 系统数据库user中的表mysql这很关键。

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

    清单:

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

    • 使用该SHOW GRANTS 语句检查哪些帐户可以访问哪些内容。然后使用该REVOKE 语句删除那些不需要的权限。

  • 不要在数据库中存储明文密码。如果您的计算机受到威胁,入侵者可以获取完整的密码列表并使用它们。相反,使用 SHA2()或其他一些单向散列函数并存储散列值。

    为防止使用彩虹表恢复密码,请不要在普通密码上使用这些功能;相反,选择一些字符串用作盐,并使用散列(散列(密码)+盐)值。

  • 假设所有密码都将受到使用已知密码列表的自动破解尝试的影响,并且还会使用有关您的公开信息(例如社交媒体帖子)进行有针对性的猜测。不要选择由容易破解或猜到的项目组成的密码,例如字典单词、专有名称、运动队名称、首字母缩略词或常用短语,尤其是当它们与您相关时。如果以可预测的方式使用大写字母、数字替换和添加以及特殊字符,这些都无济于事。也不要选择您在任何地方看到的任何密码或其变体,即使它是作为强密码的示例提供的。

    相反,选择尽可能长且不可预测的密码。这并不意味着组合必须是难以记忆和重现的随机字符串,尽管如果您有密码管理器软件可以生成和填充此类密码并安全地存储它们,那么这是一个很好的方法。包含多个单词的密码短语易于创建、记忆和复制,并且比由单个修改的单词或可预测的字符序列组成的典型用户选择的密码安全得多。要创建安全密码,请确保其中的单词和其他项目不是已知短语或引语,不会以可预测的顺序出现,

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

    清单:

    • 尝试使用诸如nmap. MySQL 默认使用端口 3306。不应从不受信任的主机访问此端口。作为检查您的 MySQL 端口是否打开的简单方法,请从某个远程计算机尝试以下命令,其中server_host运行 MySQL 服务器的主机的主机名或 IP 地址在哪里:

      $> telnet server_host 3306

      If telnet hangs or the connection is refused, the port is blocked, which is how you want it to be. If you get a connection and some garbage characters, the port is open, and should be closed on your firewall or router, unless you really have a good reason to keep it open.

  • Applications that access MySQL should not trust any data entered by users, and should be written using proper defensive programming techniques. See Section 6.1.7, “Client Programming Security Guidelines”.

  • Do not transmit plain (unencrypted) data over the Internet. This information is accessible to everyone who has the time and ability to intercept it and use it for their own purposes. Instead, use an encrypted protocol such as SSL or SSH. MySQL supports internal SSL connections. Another technique is to use SSH port-forwarding to create an encrypted (and compressed) tunnel for the communication.

  • Learn to use the tcpdump and strings utilities. In most cases, you can check whether MySQL data streams are unencrypted by issuing a command like the following:

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

    This works under Linux and should work with small modifications under other systems.

    Warning

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