6.1.3 使 MySQL 安全防范攻击者
连接到 MySQL 服务器时,应使用密码。密码不会以明文形式通过连接传输。Client 端连接序列中的密码处理已在 MySQL 4.1.1 中升级,以确保其安全性。如果仍在使用 4.1.1 之前的密码,则加密算法的强度不如较新的算法强。通过一些努力,可以嗅探 Client 端和服务器之间的流量的聪明攻击者可以破解密码。 (有关各种密码处理方法的讨论,请参见第 6.1.2.4 节“ MySQL 中的密码哈希”。)
所有其他信息都以文本形式传输,并且任何能够查看连接的人都可以阅读。如果 Client 端和服务器之间的连接通过不受信任的网络,并且您对此感到担心,则可以使用压缩协议使通信更难以解密。您还可以使用 MySQL 的内部 SSL 支持来使连接更加安全。参见第 6.3 节“使用加密的连接”。或者,使用 SSH 获取 MySQL 服务器和 MySQLClient 端之间的加密 TCP/IP 连接。您可以在http://www.openssh.org/找到一个开源 SSHClient 端,在http://en.wikipedia.org/wiki/Comparison_of_SSH_clients可以找到一个开源 SSHClient 端和商业 SSHClient 端的比较。
为了使 MySQL 系统安全,您应该强烈考虑以下建议:
- 要求所有 MySQL 帐户都具有密码。Client 程序不一定知道运行它的人的身份。对于 Client 端/服务器应用程序,用户通常可以为 Client 端程序指定任何用户名。例如,如果*
other_user
*没有密码,则任何人都可以使用mysql程序与其他任何人连接,只需以mysql -u other_user db_name
的身份调用即可。如果所有帐户都有密码,则使用其他用户的帐户进行连接将变得更加困难。
有关设置密码的方法的讨论,请参见第 6.2.10 节“分配帐户密码”。
-
确保数据库目录中唯一具有读取或写入特权的 Unix 用户帐户是用于运行mysqld的帐户。
-
切勿以 Unix
root
用户身份运行 MySQL 服务器。这是非常危险的,因为具有FILE特权的任何用户都可以使服务器将文件创建为root
(例如~root/.bashrc
)。为避免这种情况,除非使用--user=root选项明确指定,否则mysqld拒绝以root
的身份运行。
mysqld可以(并且应该)以普通,无特权的用户身份运行。您可以创建一个名为mysql
的单独的 Unix 帐户,以使所有内容更加安全。此帐户仅用于 ManagementMySQL。要以另一个 Unix 用户身份启动mysqld,请在my.cnf
选项文件的[mysqld]
组中添加一个指定用户名的user
选项,您可以在其中指定服务器选项。例如:
[mysqld]
user=mysql
无论您手动启动服务器还是使用mysqld_safe或mysql.server来启动服务器,它都以指定用户身份启动。有关更多详细信息,请参见第 6.1.5 节“如何以普通用户身份运行 MySQL”。
以root
以外的 Unix 用户身份运行mysqld并不意味着您需要在user
table 中更改root
用户名。 * MySQL 帐户的用户名与 Unix 帐户的用户名*无关。
- 不要将FILE特权授予非 Management 用户。具有此特权的任何用户都可以使用mysqld守护程序的特权将文件写入文件系统中的任何位置。这包括服务器的数据目录,该目录包含实现特权 table 的文件。为了使FILE -privilege 操作更加安全,用选择...进入外档生成的文件不会覆盖现有文件,并且每个人都可以写入。
FILE特权还可以用于读取服务器可读的世界上可读的文件或 Unix 用户可以访问的任何文件。拥有此特权,您可以将任何文件读入数据库 table。例如,使用LOAD DATA将/etc/passwd
加载到 table 中,然后可以将其与SELECT一起显示,这可能会被滥用。
要限制文件的读写位置,请将secure_file_priv系统设置为特定目录。参见第 5.1.7 节“服务器系统变量”。
- 不要向非 Management 用户授予PROCESS或SUPER特权。 mysqladmin processlist和SHOW PROCESSLIST的输出显示当前正在执行的任何语句的文本,因此任何被允许查看服务器进程列 table 的用户都可以看到其他用户(如
UPDATE user SET password=PASSWORD('not_secure')
)发出的语句。
mysqld为拥有SUPER特权的用户保留了一个额外的连接,以便 MySQL root
用户可以登录并检查服务器活动,即使所有正常连接都在使用中。
SUPER特权可用于终止 Client 端连接,通过更改系统变量的值来更改服务器操作以及控制复制服务器。
-
不允许使用符号链接到 table。 (可以使用--skip-symbolic-links选项禁用此功能。)如果您以
root
的身份运行mysqld,则这一点尤其重要,因为对服务器的数据目录具有写访问权的任何人都可以删除系统中的任何文件!参见第 8.12.3.2 节,“在 Unix 上为 MyISAMtable 使用符号链接”。 -
应使用第 23.6 节“存储的对象访问控制”中讨论的安全性准则编写存储的程序和视图。
-
如果您不信任 DNS,则应在授权 table 中使用 IP 地址而不是主机名。无论如何,您应该非常小心地使用包含通配符的主机名值创建授权 table 条目。
-
如果要限制单个帐户允许的连接数,可以通过在mysqld中设置max_user_connections变量来限制。 CREATE USER和ALTER USER语句还支持资源控制选项,用于限制允许帐户使用的服务器范围。参见第 13.7.1.2 节“ CREATE USER 语句”和第 13.7.1.1 节“ ALTER USER 语句”。
-
如果插件目录可被服务器写入,则用户可以使用选择...进入转储文件将可执行代码写入目录中的文件。通过将plugin_dir只读到服务器或将secure_file_priv设置到可以安全地写入SELECT的目录中,可以防止这种情况。