任何在连接到Internet的计算机上使用MySQL的人都应该阅读本节,以避免最常见的安全错误。
在讨论安全性时,有必要考虑充分保护整个服务器主机(不仅仅是MySQL服务器)免受所有类型的攻击:窃听、修改、回放和拒绝服务。这里我们不涉及可用性和容错的所有方面。
MySQL对用户可以尝试执行的所有连接、查询和其他操作使用基于访问控制列表(acl)的安全性。MySQL客户端和服务器之间还支持ssl加密连接。这里讨论的许多概念根本不是MySQL特有的;同样的思路几乎适用于所有应用程序。
运行MySQL时,请遵循以下原则:
不要给任何人(除了MySQL
根
帐户)访问用户
表中的mysql
系统数据库!这是至关重要的。了解MySQL访问特权系统如何工作(参见第6.2节“访问控制及帐户管理”).使用
格兰特
而且撤销
语句来控制对MySQL的访问。不要授予不必要的特权。不要授予所有主机特权。检查表:
试一试
Mysql -u root
.如果您能够成功地连接到服务器而不需要密码,任何人都可以作为MySQL服务器连接到您的MySQL服务器根
具有完全权限的用户!查看MySQL安装说明,特别注意关于设置的信息根
密码。看到第2.10.4节,“保护初始MySQL帐户”.
不要在数据库中存储明文密码。如果你的电脑被侵入,入侵者就可以获取完整的密码列表并使用它们。相反,使用
SHA2 ()
或者其他单向哈希函数并存储哈希值。为防止使用彩虹表恢复密码,请不要对普通密码使用这些功能;相反,选择一些字符串作为salt,并使用hash(hash(password)+salt)值。
不要从字典中选择密码。有专门的程序可以破解密码。甚至像这样的密码”xfish98”非常糟糕。更好的是”duag98”哪个包含同一个单词”鱼”但在标准QWERTY键盘上向左按了一个键。另一种方法是使用一个句子中每个单词的第一个字符作为密码(例如,”八十七年以前”的密码”Fsasya”).密码很容易记住和输入,但对于不认识句子的人来说很难猜到。在这种情况下,您还可以用数字替换数字词以获得短语”4分7年前”,输入密码”4 sa7ya”这就更难猜测了。
投资防火墙。这可以保护您免受任何软件中至少50%的所有类型的攻击。将MySQL放在防火墙后面或非军事区(DMZ)中。
检查表:
尝试使用诸如。之类的工具从Internet扫描端口
nmap
.MySQL默认使用3306端口。不受信任的主机不能访问此端口。作为一种检查MySQL端口是否打开的简单方法,请在远程计算机上尝试以下命令,其中server_host
是运行MySQL服务器的主机名或IP地址:$ > telnetserver_host3306
如果远程登录挂起或连接被拒绝,端口被阻塞,这是您希望的情况。如果你得到一个连接和一些垃圾字符,端口是开放的,并且应该在你的防火墙或路由器上关闭,除非你真的有很好的理由保持它开放。
访问MySQL的应用程序不应该信任用户输入的任何数据,应该使用适当的防御性编程技术来编写。看到第6.1.7节,“客户端编程安全指南”.
不要在互联网上传输普通(未加密)数据。每个有时间和能力拦截这些信息并将其用于自己目的的人都可以访问这些信息。相反,应该使用加密协议,如SSL或SSH。MySQL支持内部SSL连接。另一种技术是使用SSH端口转发为通信创建加密(和压缩)隧道。
学会使用tcpdump而且字符串实用工具。在大多数情况下,您可以通过发出如下命令来检查MySQL数据流是否未加密:
$> tcpdump -l -i eth0 -w - SRC或DST端口3306 |字符串
这可以在Linux下工作,也可以在其他系统下进行小的修改。
警告如果您没有看到明文数据,这并不总是意味着信息实际上是加密的。如果需要高安全性,请咨询安全专家。