MySQL 5.7 安全部署指南  /  第 11 章启用身份验证

第 11 章启用身份验证

当客户端连接到 MySQL 服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user表中选择帐户行。服务器对客户端进行身份验证,从帐户行确定哪个身份验证插件适用于客户端。服务器调用该插件对用户进行身份验证,插件向服务器返回一个状态,指示用户是否被允许连接。

默认情况下,MySQL 使用内置的 mysql_native_password身份验证插件,它使用本机密码哈希方法执行身份验证。为了提高安全性,此部署使用 sha256_passwordauth_socket身份验证插件进行用户身份验证。

SHA-256 认证

当用户帐户配置为使用 sha256_password插件进行身份验证时,服务器会使用 sha256_password插件使用 SHA-256 密码散列法对用户密码进行加密。这种加密比 MySQL 本机身份验证可用的加密更安全。密码哈希存储在插件和 系统表 的authentication_string列中 。mysql.user

服务器端sha256_password插件内置于服务器中,不需要显式加载。因此,无需服务器端配置即可使用该sha256_password插件。

要将sha256_password插件用于新用户帐户,您可以 sha256_password在创建新用户帐户时指定插件,或者可以 sha256_password使用配置选项将插件配置为默认身份验证插件 default_authentication_plugin 。稍后在此部署中,将 sha256_password在创建用户帐户时指定插件。请参阅 第 13 章,创建用户帐户

有关该 sha256_password插件的更多信息,请参阅 SHA-256 可插入身份验证sha256_password有关该插件 优缺点的讨论 ,请参阅MySQL 服务器博客:使用 sha256_password 插件保护 MySQL 密码

套接字对等凭据身份验证

本节介绍如何启用服务器端 auth_socket身份验证插件,该插件对通过 Unix 套接字文件从本地主机连接到 MySQL 服务器的客户端进行身份验证。 auth_socket身份验证非常适合必须严格限制访问权限的服务器管理用户帐户。

auth_socket插件检查socket用户名是否与客户端程序指定给服务器的MySQL用户名相匹配 。如果名称不匹配,插件还会检查套接字用户名是否与authentication_stringmysql.user行列中指定的名称匹配。如果找到匹配项,插件将允许连接。

例如,假设为一个名为valeriewho的用户创建了一个 MySQL 帐户,auth_socket插件将通过套接字文件对来自本地主机的连接进行身份验证:

CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;

如果本地主机上登录名为 的用户 stefanie调用带有通过套接字文件进行连接 的选项的mysql ,则服务器将用于对客户端进行身份验证。插件确定选项值 ( ) 与客户端用户名 ( ) 不同,并拒绝连接。如果名为的用户尝试相同的操作,插件会发现用户名和 MySQL 用户名都相同, 并允许连接。但是,即使连接是使用不同的协议(例如 TCP/IP)建立 的,插件也会拒绝连接 。--user=valerieauth_socket--uservaleriestephanievalerievalerievalerie

通过认证的auth_socket用户在连接到服务器时不需要指定密码。但是,通过auth_socket插件验证的用户被限制远程连接;它们只能通过 Unix 套接字文件从本地主机连接。

安装服务器端auth_socket 插件:

  1. [mysqld] 在 MySQL 配置文件 ( ) 的选项组下添加这些选项/etc/my.cnf

    plugin-load-add=auth_socket.so
    auth_socket=FORCE_PLUS_PERMANENT
    • plugin-load-add=auth_socket.so

      auth_socket.so每次启动服务器时 加载插件库。

    • auth_socket=FORCE_PLUS_PERMANENT

      防止服务器在没有 auth_socket插件的情况下运行,如果插件未成功初始化,则服务器启动失败。

  2. 要验证插件安装,请重新启动服务器并检查 INFORMATION_SCHEMA.PLUGINS 表或使用以下SHOW PLUGINS 语句:

    $> systemctl restart mysqld
    $> cd /usr/local/mysql 
    $> bin/mysqladmin -u root -p version
    Enter password: (enter root password here)
    mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
           FROM INFORMATION_SCHEMA.PLUGINS
           WHERE PLUGIN_NAME LIKE '%socket%';
    +-------------------+---------------+
    | PLUGIN_NAME       | PLUGIN_STATUS |
    +-------------------+---------------+
    | auth_socket       | ACTIVE        |
    +-------------------+---------------+
  3. (可选)修改 MySQL root 用户帐户以使用 auth_socket插件进行身份验证:

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
  4. 要验证该root@localhost帐户是否正在使用该auth_socket插件,请发出以下查询:

    mysql> SELECT user, plugin FROM mysql.user WHERE user IN ('root')\G
    *************************** 1. row ***************************
      user: root
    plugin: auth_socket
  5. 要验证auth_socket插件是否正常工作,请以操作系统 root 用户身份登录到 MySQL 服务器主机,然后以 MySQL root 用户身份在本地连接到 MySQL 服务器。您应该能够在不指定密码的情况下进行连接。

    $> cd /usr/local/mysql 
    $> bin/mysql -u root

有关该auth_socket 插件的更多信息,请参阅Socket Peer-Credential Pluggable Authentication