任何在连接到 Internet 的计算机上使用 MySQL 的人都应该阅读本节以避免最常见的安全错误。
在讨论安全性时,有必要考虑完全保护整个服务器主机(而不仅仅是 MySQL 服务器)免受所有类型的适用攻击:窃听、篡改、回放和拒绝服务。我们不会在这里涵盖可用性和容错的所有方面。
MySQL 将基于访问控制列表 (ACL) 的安全性用于用户可以尝试执行的所有连接、查询和其他操作。还支持 MySQL 客户端和服务器之间的 SSL 加密连接。这里讨论的许多概念根本不是 MySQL 特有的;相同的一般思想适用于几乎所有应用程序。
运行 MySQL 时,请遵循以下准则:
永远不要让任何人(MySQL
root
帐户除外)访问 系统数据库user
中的表mysql
!这很关键。了解 MySQL 访问权限系统的工作原理(请参阅 第 6.2 节“访问控制和帐户管理”)。使用
GRANT
andREVOKE
语句控制对 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
如果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 下工作,并且应该在其他系统下进行小的修改。
警告如果您没有看到明文数据,这并不总是意味着信息实际上是加密的。如果您需要高安全性,请咨询安全专家。