任何在连接到Internet的计算机上使用MySQL的人都应该阅读本节,以避免最常见的安全错误。
在讨论安全性时,有必要考虑充分保护整个服务器主机(而不仅仅是MySQL服务器)免受所有类型的适用攻击:窃听、更改、播放和拒绝服务。我们在这里没有涵盖可用性和容错的所有方面。
MySQL对用户可以尝试执行的所有连接、查询和其他操作使用基于访问控制列表(ACL)的安全性。
MySQL客户端和服务器之间还支持SSL加密连接。
这里讨论的许多概念根本不是MySQL特有的;相同的一般思想适用于几乎所有的应用程序。
运行MySQL时,请遵循以下准则:
永远不要让任何人(MySQL根帐户除外)访问MySQL系统数据库中的用户表!这一点至关重要。
了解MySQL访问权限系统的工作原理(请参阅"访问控制和帐户管理")。使用GRANT和REVOKE语句来控制对MySQL的访问。
不要授予超过必要权限的权限。
从不向所有主机授予特权。
清单:
试试mysql-u root。如果您能够在不需要密码的情况下成功连接到服务器,任何人都可以作为MySQL根用户以完全权限连接到您的MySQL服务器!查看MySQL的安装说明,特别注意有关设置根密码的信息。请参阅"保护初始MySQL帐户"。
使用SHOW GRANTS语句检查哪些帐户可以访问什么。然后使用REVOKE语句删除那些不必要的特权。
不要在数据库中存储明文密码。如果你的电脑遭到破坏,入侵者可以获取完整的密码列表并使用它们。相反,使用SHA2()或其他单向哈希函数并存储哈希值。
为了防止使用彩虹表恢复密码,请不要在普通密码上使用这些功能;相反,选择一些字符串用作salt,并使用hash(hash(password)+salt)值。
假设所有密码都将使用已知密码列表进行自动破解,并使用有关您的公开信息(如社交媒体帖子)进行有针对性的猜测。
**不要选择由容易破解或猜测的项目组成的密码,**如字典单词、正确名称、运动队名称、首字母缩写或常见短语,尤其是与您相关的密码。
如果以可预测的方式使用大写字母、数字替换和添加以及特殊字符,则这些都没有帮助。此外,不要选择您在任何地方看到的用作示例的任何密码,或其变体,即使它是作为强密码的示例出现的。
相反,**请选择尽可能长且不可预测的密码。**这并不意味着组合需要是一个难以记忆和复制的随机字符串,尽管这是一个很好的方法,例如,如果你有密码管理软件,可以生成和填充这些密码并安全存储。
**包含多个单词的密码短语易于创建、记忆和复制,并且比由单个修改的单词或可预测的字符序列组成的典型用户选择的密码安全得多。**要创建安全的密码短语,请确保其中的单词和其他项目不是已知的短语或引号,不会以可预测的顺序出现,并且最好彼此之间没有以前的关系。
建立防火墙。这可以保护您免受任何软件中至少50%的所有类型的漏洞攻击。将MySQL放在防火墙后面或非军事区(DMZ)中。
尝试使用nmap等工具从Internet扫描端口。
MySQL默认使用端口3306。不应从不受信任的主机访问此端口。作为检查MySQL端口是否打开的一种简单方法,请在某台远程计算机上尝试以下命令,其中server_host是运行MySQL服务器的主机的主机名或IP地址:
$> telnet server_host 3306
如果telnet挂起或连接被拒绝,端口将被阻止,这就是OK的。
如果你得到一个连接和一些垃圾字符,端口是打开的,应该在防火墙或路由器上关闭,除非你真的有充分的理由保持它打开。
访问MySQL的应用程序不应该信任用户输入的任何数据,并且应该使用适当的防御编程技术来编写。
参见"客户端编程安全指南"。
不要在互联网上传输纯(未加密)数据。
每个有时间和能力拦截这些信息并将其用于自己的目的的人都可以访问这些信息。
相反,请使用加密协议,如SSL或SSH。MySQL支持内部SSL连接。
另一种技术是使用SSH端口转发 来创建用于通信的加密(和压缩)隧道。
学习使用tcpdump和字符串实用程序。在大多数情况下,您可以通过发出如下命令来检查MySQL数据流是否未加密:
$> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
这在Linux下可以工作,在其他系统下应该可以进行小的修改。
警告:
如果您没有看到明文数据 ,这并不总是意味着信息实际上是加密的。如果您需要高度安全性,请咨询安全专家。