Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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_safemysql.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”

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

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

    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为安全写入目录来预防。