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()或其他一些单向散列函数并存储散列值。

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

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

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

    清单:

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

      $> telnet server_host 3306

      如果telnet挂起或连接被拒绝,端口将被阻塞,这正是您想要的。如果你得到一个连接和一些垃圾字符,端口是打开的,应该在你的防火墙或路由器上关闭,除非你真的有充分的理由保持它打开。

  • 访问 MySQL 的应用程序不应信任用户输入的任何数据,并且应使用适当的防御性编程技术编写。请参阅 第 6.1.7 节,“客户端编程安全指南”

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

  • 学习使用tcpdump字符串实用程序。在大多数情况下,您可以通过发出如下命令来检查 MySQL 数据流是否未加密:

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

    这在 Linux 下工作,并且应该在其他系统下进行小的修改。

    警告

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