Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Making MySQL Secure Against Attackers

8.1.3 保护 MySQL 免受攻击

当您连接到 MySQL 服务器时,应该使用密码。密码不会以明文形式传输到连接中。

所有其他信息都以文本形式传输,可以被任何能够监视连接的人读取。如果连接经过不安全的网络,并且您担心这点,可以使用压缩协议使流量变得非常难以破译。您也可以使用 MySQL 的内部 SSL 支持来使连接变得更加安全。见 第 8.3 节,“使用加密连接”。或者,使用 SSH 获取加密的 TCP/IP 连接 zwischen MySQL 服务器和 MySQL 客户端。您可以在 http://www.openssh.org/ 找到开源 SSH 客户端,并在 http://en.wikipedia.org/wiki/Comparison_of_SSH_clients 中找到开源和商业 SSH 客户端的比较。

要使 MySQL 系统安全,您应该强烈考虑以下建议:

  • 要求所有 MySQL 账户都有密码。客户程序并不一定知道运行它的人的身份。常见于客户/服务器应用程序中,用户可以指定任何用户名给客户程序。例如,任何人都可以使用 mysql 程序连接到其他人的账户,只需以 mysql -u other_user db_name 的形式运行它,如果 other_user 没有密码。如果所有账户都有密码,那么使用其他用户的账户连接将变得非常困难。

    关于设置密码的方法的讨论,见 第 8.2.14 节,“分配账户密码”

  • 确保只有用于运行 mysqld 的 Unix 用户账户拥有数据库目录的读取或写入权限。

  • 永远不要以 Unix 根用户身份运行 MySQL 服务器。这非常危险,因为任何拥有 FILE 权限的用户都可以使服务器以根用户身份创建文件(例如,~root/.bashrc)。为了防止这种情况,mysqld 拒绝以根用户身份运行,除非明确地使用 --user=root 选项。

    mysqld 可以(并且应该)以普通、非特权用户身份运行。您可以创建一个名为 mysql 的单独 Unix 账户,以使一切变得更加安全。使用这个账户仅用于管理 MySQL。要以不同的 Unix 用户身份启动 mysqld,请在 [mysqld] 组的 my.cnf 选项文件中添加一个 user 选项,指定用户名。例如:

    [mysqld]
    user=mysql

    这将使服务器以指定的用户身份启动,无论您是手动启动还是使用 mysqld_safemysql.server 启动。更多详细信息,见 第 8.1.5 节,“如何以普通用户身份运行 MySQL”

    以普通 Unix 用户身份运行 mysqld 不意味着您需要更改 root 用户名在 user 表中。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 节,“加密二进制日志文件和中继日志文件”

  • 不要将PROCESSSUPER权限授予非管理员用户。mysqladmin processlistSHOW PROCESSLIST的输出显示当前执行的语句的文本,因此任何被允许查看服务器进程列表的用户都可能会看到其他用户发出的语句。

    mysqld为拥有CONNECTION_ADMINSUPER权限的用户保留了一个额外的连接,以便 MySQL root用户可以登录并检查服务器活动,即使所有正常连接都在使用中。

    SUPER权限可以用于终止客户端连接,通过更改系统变量的值来更改服务器操作,并控制复制服务器。

  • 不要允许使用符号链接到表格。(可以使用--skip-symbolic-links选项禁用该功能。)这尤其重要,如果您以 root 身份运行mysqld,因为任何拥有服务器数据目录写入权限的人都可以删除系统中的任何文件!请参阅第 10.12.2.2 节,“使用 Unix 上的 MyISAM 表的符号链接”

  • 存储程序和视图应该按照第 27.6 节,“存储对象访问控制”中讨论的安全指南编写。

  • 如果您不信任 DNS,那么您应该在授权表中使用 IP 地址而不是主机名。在任何情况下,您都应该非常小心地创建使用通配符的主机名值的授权表条目。

  • 如果您想限制单个帐户允许的连接数,可以通过在 max_user_connections 变量中设置限制,在 mysqld 中。 CREATE USERALTER USER 语句也支持资源控制选项,以限制服务器使用的范围。请参阅 第 15.7.1.3 节,“CREATE USER 语句”第 15.7.1.1 节,“ALTER USER 语句”

  • 如果插件目录可由服务器写入,用户可能可以使用 SELECT ... INTO DUMPFILE 将可执行代码写入目录中的文件。可以通过使 plugin_dir 只读或将 secure_file_priv 设置为一个安全的目录来防止这种情况,其中 SELECT 可以安全地写入文件。