连接到 MySQL 服务器时,应使用密码。密码不会以明文形式通过连接传输。
所有其他信息都以文本形式传输,任何能够监视连接的人都可以读取。如果客户端和服务器之间的连接通过不受信任的网络,并且您对此感到担忧,则可以使用压缩协议使流量更难以解密。您还可以使用 MySQL 的内部 SSL 支持使连接更加安全。请参阅 第 8.3 节,“使用加密连接”。或者,使用 SSH 在 MySQL 服务器和 MySQL 客户端之间建立加密的 TCP/IP 连接。您可以在 http://www.openssh.org/ 找到一个开源 SSH 客户端,并在 http://en.wikipedia.org/wiki/Comparison_of_SSH_clients 找到开源和商业 SSH 客户端的比较。
为了确保 MySQL 系统的安全,您应该认真考虑以下建议
要求所有 MySQL 帐户都必须有密码。客户端程序不一定知道运行它的人员的身份。对于客户端/服务器应用程序来说,用户可以为客户端程序指定任何用户名,这是很常见的。例如,如果
other_user
没有密码,任何人都可以使用 mysql 程序以任何其他用户的身份连接,只需将其调用为mysql -u
即可。如果所有帐户都有密码,则使用其他用户的帐户进行连接会变得更加困难。other_user
db_name
有关设置密码方法的讨论,请参阅 第 8.2.14 节,“分配帐户密码”。
确保数据库目录中唯一具有读或写权限的 Unix 用户帐户是用于运行 mysqld 的帐户。
切勿以 Unix
root
用户身份运行 MySQL 服务器。这非常危险,因为任何具有FILE
权限的用户都可以使服务器以root
身份创建文件(例如,~root/.bashrc
)。为了防止这种情况,除非使用--user=root
选项明确指定,否则 mysqld 将拒绝以root
身份运行。可以(并且应该)以普通、非特权用户的身份运行 mysqld。您可以创建一个名为
mysql
的单独 Unix 帐户,以使所有内容更加安全。仅使用此帐户来管理 MySQL。要以其他 Unix 用户身份启动 mysqld,请在指定服务器选项的my.cnf
选项文件的[mysqld]
组中添加一个指定用户名的user
选项。例如[mysqld] user=mysql
这将导致服务器以指定的用户身份启动,无论您是手动启动它,还是使用 mysqld_safe 或 mysql.server 启动它。有关更多详细信息,请参阅 第 8.1.5 节,“如何以普通用户身份运行 MySQL”。
以非
root
的 Unix 用户身份运行 mysqld 并不意味着您需要更改user
表中的root
用户名。MySQL 帐户的用户名与 Unix 帐户的用户名无关。不要向非管理员用户授予
FILE
权限。拥有此权限的任何用户都可以使用 mysqld 守护程序的权限在文件系统中的任何位置写入文件。这包括服务器的数据目录,其中包含实现权限表的那些文件。为了使FILE
权限的操作更安全一些,使用SELECT ... INTO OUTFILE
生成的文件不会覆盖现有文件,并且任何人都可以写入。FILE
权限也可用于读取任何可公开读取或服务器运行所使用的 Unix 用户可访问的文件。利用此权限,您可以将任何文件读取到数据库表中。这可能会被滥用,例如,使用LOAD DATA
将/etc/passwd
加载到表中,然后可以使用SELECT
显示该表。要限制可以读取和写入文件的位置,请将
secure_file_priv
系统变量设置为特定目录。请参阅 第 7.1.8 节“服务器系统变量”。对二进制日志文件和中继日志文件进行加密。加密有助于保护这些文件以及其中包含的潜在敏感数据,防止被外部攻击者滥用,以及防止存储这些文件的操作系统用户未经授权查看。您可以通过将
binlog_encryption
系统变量设置为ON
,在 MySQL 服务器上启用加密。有关更多信息,请参阅 第 19.3.2 节“加密二进制日志文件和中继日志文件”。不要向非管理员用户授予
PROCESS
或SUPER
权限。mysqladmin processlist 和SHOW PROCESSLIST
的输出显示了当前正在执行的任何语句的文本,因此任何被允许查看服务器进程列表的用户都可能看到其他用户发出的语句。mysqld 为拥有
CONNECTION_ADMIN
或SUPER
权限的用户保留了一个额外的连接,以便 MySQLroot
用户即使在所有普通连接都在使用的情况下也可以登录并检查服务器活动。SUPER
权限可用于终止客户端连接,通过更改系统变量的值来更改服务器操作,以及控制复制服务器。不要允许对表使用符号链接。(可以使用
--skip-symbolic-links
选项禁用此功能。)如果以root
身份运行 mysqld,这一点尤其重要,因为任何对服务器数据目录具有写访问权限的人都可以删除系统中的任何文件!请参阅 第 10.12.2.2 节“在 Unix 上对 MyISAM 表使用符号链接”。存储程序和视图的编写应使用 第 27.6 节“存储对象访问控制” 中讨论的安全指南。
如果不信任 DNS,则应在授权表中使用 IP 地址而不是主机名。在任何情况下,创建包含通配符的主机名值的授权表条目时都应非常小心。
如果要限制允许连接到单个帐户的连接数,可以通过在 mysqld 中设置
max_user_connections
变量来实现。CREATE USER
和ALTER USER
语句还支持资源控制选项,用于限制允许帐户使用的服务器资源范围。请参阅 第 15.7.1.3 节“CREATE USER 语句” 和 第 15.7.1.1 节“ALTER USER 语句”。如果服务器可以写入插件目录,则用户可以使用
SELECT ... INTO DUMPFILE
将可执行代码写入目录中的文件。可以通过使plugin_dir
对服务器只读,或者将secure_file_priv
设置为可以安全进行SELECT
写入的目录来防止这种情况。