### 6.1.3 使 MySQL 免受攻击者的攻击

[](<>)[](<>)[](<>)[](<>)[](<>)

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

所有其他信息都以文本形式传输，任何能够观看连接的人都可以阅读。如果客户端和服务器之间的连接通过不受信任的网络，并且您对此感到担心，则可以使用压缩协议使流量更难以破译。您还可以使用 MySQL 的内部 SSL 支持来使连接更加安全。看[第 6.3 节，“使用加密连接”](encrypted-connections.html).或者，使用 SSH 在 MySQL 服务器和 MySQL 客户端之间获取加密的 TCP/IP 连接。您可以在以下位置找到开源 SSH 客户端<http://www.openssh.org/>，以及开源和商业 SSH 客户端的比较[http://en.wikipedia.org/wiki/Comparison\_的\_SSH\_客户](http://en.wikipedia.org/wiki/Comparison_of_SSH_clients).

为了使 MySQL 系统安全，您应该强烈考虑以下建议：

-   要求所有 MySQL 帐户都有密码。客户端程序不一定知道运行它的人的身份。对于客户端/服务器应用程序来说，用户可以为客户端程序指定任何用户名是很常见的。例如，任何人都可以使用[**mysql**](mysql.html)程序只需通过调用它来像任何其他人一样连接`mysql -u *`其他用户`* *`数据库名称`*`如果*`其他用户`*没有密码。如果所有帐户都有密码，则使用其他用户的帐户进行连接会变得更加困难。

    有关设置密码方法的讨论，请参阅[第 6.2.14 节，“分配帐户密码”](assigning-passwords.html).

-   确保在数据库目录中唯一具有读取或写入权限的 Unix 用户帐户是用于运行的帐户[**mysqld**](mysqld.html).

-   永远不要将 MySQL 服务器作为 Unix 运行`根`用户。这是非常危险的，因为任何拥有[`文件`](privileges-provided.html#priv_file)权限能够使服务器创建文件为`根`（例如，`~root/.bashrc`）。为了防止这种情况，[**mysqld**](mysqld.html)拒绝运行`根`除非使用[`--user=root`](server-options.html#option_mysqld_user)选项。

    [**mysqld**](mysqld.html)可以（并且应该）作为普通的非特权用户运行。您可以创建一个单独的 Unix 帐户，名为`mysql`让一切更加安全。此帐户仅用于管理 MySQL。开始[**mysqld**](mysqld.html)作为不同的 Unix 用户，添加一个`用户`指定用户名的选项`[mysqld]`组的`我的.cnf`指定服务器选项的选项文件。例如：

    ```
    [mysqld]
    user=mysql
    ```

    这会导致服务器以指定用户身份启动，无论您是手动启动还是使用[**mysqld\_安全的**](mysqld-safe.html)要么[**mysql.server**](mysql-server.html).有关更多详细信息，请参阅[第 6.1.5 节，“如何以普通用户身份运行 MySQL”](changing-mysql-user.html).

    跑步[**mysqld**](mysqld.html)作为 Unix 用户`根`并不意味着你需要改变`根`用户名在`用户`桌子。*MySQL 帐户的用户名与 Unix 帐户的用户名无关*.

-   不授予[`文件`](privileges-provided.html#priv_file)非管理用户的特权。任何拥有此权限的用户都可以使用[**mysqld**](mysqld.html)守护进程。这包括服务器的数据目录，其中包含实现权限表的文件。做[`文件`](privileges-provided.html#priv_file)-权限操作更安全，生成的文件是[`选择...进入文件`](select-into.html)不要覆盖现有文件，每个人都可以写。

    [](<>)

    这[`文件`](privileges-provided.html#priv_file)特权也可用于读取服务器运行的 Unix 用户可读取或可访问的任何文件。使用此权限，您可以将任何文件读入数据库表。这可能会被滥用，例如，通过使用[`加载数据`](load-data.html)载入`/etc/passwd`进入一个表格，然后可以显示[`选择`](select.html).

    要限制可以读取和写入文件的位置，请设置[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)系统到特定目录。看[第 5.1.8 节，“服务器系统变量”](server-system-variables.html).

-   加密二进制日志文件和中继日志文件。加密有助于保护这些文件和其中包含的潜在敏感数据不被外部攻击者滥用，也可以防止存储它们的操作系统的用户未经授权查看。您可以通过设置在 MySQL 服务器上启用加密[`binlog_encryption`](replication-options-binary-log.html#sysvar_binlog_encryption)系统变量为`在`.有关详细信息，请参阅[第 17.3.2 节，“加密二进制日志文件和中继日志文件”](replication-binlog-encryption.html).

-   不授予[`过程`](privileges-provided.html#priv_process)要么[`极好的`](privileges-provided.html#priv_super)非管理用户的特权。的输出[**mysqladmin 进程列表**](mysqladmin.html)和[`显示进程列表`](show-processlist.html)显示当前正在执行的任何语句的文本，因此任何被允许查看服务器进程列表的用户都可能能够看到其他用户发出的语句。

    [**mysqld**](mysqld.html)为拥有[`CONNECTION_ADMIN`](privileges-provided.html#priv_connection-admin)要么[`极好的`](privileges-provided.html#priv_super)特权，使 MySQL`根`即使所有正常连接都在使用中，用户也可以登录并检查服务器活动。

    这[`极好的`](privileges-provided.html#priv_super)特权可用于终止客户端连接、通过更改系统变量的值来更改服务器操作以及控制复制服务器。

-   不允许对表使用符号链接。（此功能可以通过禁用[`--跳过符号链接`](server-options.html#option_mysqld_symbolic-links)选项。）如果您运行，这尤其重要[**mysqld**](mysqld.html)作为`根`，因为任何对服务器数据目录具有写入权限的人都可以删除系统中的任何文件！看[第 8.12.2.2 节，“在 Unix 上为 MyISAM 表使用符号链接”](symbolic-links-to-tables.html).

-   存储的程序和视图应该使用在讨论的安全准则编写[第 25.6 节，“存储对象访问控制”](stored-objects-security.html).

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

-   如果要限制单个帐户允许的连接数，可以通过设置[`max_user_connections`](server-system-variables.html#sysvar_max_user_connections)变量在[**mysqld**](mysqld.html).这[`创建用户`](create-user.html)和[`更改用户`](alter-user.html)语句还支持资源控制选项，用于限制帐户允许的服务器使用范围。看[第 13.7.1.3 节，“创建用户语句”](create-user.html)， 和[第 13.7.1.1 节，“ALTER USER 语句”](alter-user.html).

-   如果插件目录是服务器可写的，则用户可以使用以下命令将可执行代码写入目录中的文件[`选择...进入转储文件`](select.html).这可以通过使[`插件目录`](server-system-variables.html#sysvar_plugin_dir)只读到服务器或通过设置[`secure_file_priv`](server-system-variables.html#sysvar_secure_file_priv)到一个目录[`选择`](select.html)可以安全地进行写入。
