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