MySQL 8.0 安全部署指南  /  第 13 章创建用户帐户

第 13 章创建用户帐户

本节介绍如何创建用户帐户。它演示了配置全局密码策略、使用与安全相关的CREATE USER 选项、授予用户权限以及验证用户权限和身份验证。

创建了两个用户帐户:user1user2。该user1帐户使用需要加密连接的 SSL/TLS 选项定义。该user2帐户的定义没有 SSL/TLS 选项 ( REQUIRE NONE),因此它可用于演示通过未加密连接与服务器进行基于 RSA 密钥对的密码交换。

  1. 定义全局密码历史、重用、过期和验证所需的策略:

    1. 使用 password_history系统变量定义全局密码历史策略。默认设置为 0,表示没有限制。要在重复使用相同密码之前要求指定次数的密码更改,请 [mysqld]在 MySQL 配置文件 ( /etc/my.cnf) 的选项组下添加一个类似于此的条目:

      password_history=12

      设置为12意味着必须至少更改 12 次密码才能重新使用密码。

    2. 使用 password_reuse_interval 系统变量定义全局密码重用策略。默认设置为 0,表示没有限制。要要求在重复使用相同密码之前经过指定的天数,请 [mysqld]在 MySQL 配置文件 ( /etc/my.cnf) 的选项组下添加一个类似于此的条目:

      password_reuse_interval=1095

      设置为1095意味着必须至少经过 1095 天才能重新使用密码。

    3. 使用 default_password_lifetime 系统变量定义全局自动密码过期策略。默认设置为 0,即禁用自动密码过期。[mysqld]要让密码在指定的天数后自动过期,请在 MySQL 配置文件 ( )的选项组下添加一个类似于此的条目 /etc/my.cnf

      default_password_lifetime=120

      设置为120意味着密码的有效期为 120 天,之后它会自动过期。

    4. 使用 password_require_current 系统变量定义需要全局密码验证的策略。默认设置为 0,这意味着密码更改不需要指定当前密码。要要求密码更改指定当前密码,请 [mysqld]在 MySQL 配置文件 ( /etc/my.cnf) 的选项组下添加以下条目:

      password_require_current=1

    重新启动服务器以应用配置更改:

    $> systemctl restart mysqld
  2. 以根身份登录。

    $> cd /usr/local/mysql 
    $> bin/mysql -u root -p
    Enter password: (enter root password here)
  3. 创建用户帐户。以下语句创建名为 和 的用户帐户,其中和 是客户端主机的 IP 地址。这些语句包括与安全相关的选项,用于启用身份验证、定义 SSL/TLS 要求、生成随机密码、限制服务器资源使用和管理密码过期。 'user1'@'203.0.113.11''user1'@'203.0.113.12203.0.113.11203.0.113.12

    mysql> CREATE USER 'user1'@'203.0.113.11' IDENTIFIED WITH caching_sha2_password BY 
           RANDOM PASSWORD REQUIRE X509 WITH MAX_USER_CONNECTIONS 3 PASSWORD HISTORY DEFAULT
           PASSWORD REUSE INTERVAL DEFAULT PASSWORD EXPIRE DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
           FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED;
    +-------+--------------+----------------------+
    | user  | host         | generated password   |
    +-------+--------------+----------------------+
    | user1 | 203.0.113.11 | e6<]aR3he*XPg3o6ML<7 |
    +-------+--------------+----------------------+
    mysql> CREATE USER 'user2'@'203.0.113.12' IDENTIFIED WITH caching_sha2_password BY 
           RANDOM PASSWORD REQUIRE NONE WITH MAX_USER_CONNECTIONS 3 PASSWORD HISTORY DEFAULT
           PASSWORD REUSE INTERVAL DEFAULT PASSWORD EXPIRE DEFAULT PASSWORD REQUIRE CURRENT DEFAULT
           FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED;
    +-------+--------------+----------------------+
    | user  | host         | generated password   |
    +-------+--------------+----------------------+
    | user2 | 203.0.113.12 | VT@jNXB3@CvVB>/vMbke |
    +-------+--------------+----------------------+

    CREATE USER语句选项:

    • IDENTIFIED WITH caching_sha2_password BY RANDOM PASSWORD

      将帐户身份验证插件设置为 sha256_password,生成一个随机密码,该密码作为明文值传递给插件进行哈希处理,并将结果存储在 mysql.user帐户行中。明文随机密码也在结果集的一行中返回(如上所示),以使其可供执行语句的用户使用。

      笔记

      RANDOM PASSWORD选项用作管理员指定的文字密码的替代方法。默认情况下,生成的随机密码的长度为 20 个字符。此长度由 generated_random_password_length 系统变量控制,范围从 5 到 255。此部署使用默认长度。

      如果指定了管理员指定的文字密码而不是RANDOM PASSWORD选项,则文字 password值必须符合 validate_password组件启用的密码策略。(请参阅 第 6 章,安装 MySQL 密码验证组件。)该validate_password 组件实施的策略对生成的密码没有影响。策略的目的 validate_password是帮助 人们创建更好的密码。

      有关详细信息,请参阅 创建用户身份验证选项

    • REQUIRE X509

      此 SSL/TLS 选项仅用于 user1帐户。

      除了通常基于用户名和凭据的身份验证之外,MySQL 还可以检查 X509 证书属性。可用的 SSL/TLS 选项包括 SSLX509ISSUERSUBJECTCIPHERCREATE USER声明使用选项user1X509要求客户端出示有效证书,但确切的证书、颁发者和主题无关紧要。唯一的要求是应该可以使用其中一个 CA 证书来验证其签名。用于 X509certificates 总是暗示加密,所以没有必要也指定 SSL选项。

      有关详细信息,请参阅 创建用户 SSL/TLS 选项

    • REQUIRE NONE

      表示该账户没有TLS 或没有X509要求。如果用户名和密码有效,则允许未加密的连接。如果客户端具有适当的证书和密钥文件,则可以根据客户端的选择使用加密连接。NONE如果未指定与 SSL 相关的REQUIRE选项,则为默认值。

      有关详细信息,请参阅 创建用户 SSL/TLS 选项

    • MAX_USER_CONNECTIONS 3

      限制帐户同时连接到服务器的最大数量。max_user_connections 如果数字为 0(默认值),则服务器根据系统变量的全局值确定该帐户的同时连接数 。MAX_USER_CONNECTIONS 3 意味着该帐户最多可以同时连接到服务器 3 个。

      此处未使用的其他资源限制选项包括 MAX_QUERIES_PER_HOURMAX_UPDATES_PER_HOURMAX_CONNECTIONS_PER_HOUR。有关更多信息,请参阅 CREATE USER 资源限制选项

    • PASSWORD HISTORY DEFAULT

      password_history应用由系统变量 定义的全局密码历史策略 。在前面的步骤中, password_history设置为12要求在重复使用相同密码之前发生 12 次密码更改。

    • PASSWORD REUSE INTERVAL DEFAULT

      password_reuse_interval 应用由系统变量 定义的全局密码重用策略 。在前面的步骤中, password_reuse_interval 设置为1095要求 1095 天后才能重复使用相同的密码。

    • PASSWORD EXPIRE DEFAULT

      default_password_lifetime 应用由系统变量 定义的全局自动密码过期策略 。在前面的步骤中, default_password_lifetime 设置为 120,以便密码每 120 天自动过期一次。

      其他密码过期选项包括 PASSWORD EXPIREPASSWORD EXPIRE INTERVALPASSWORD EXPIRE NEVER。有关详细信息,请参阅 创建用户密码管理选项

    • PASSWORD REQUIRE CURRENT DEFAULT

      password_require_current 使帐户遵循由系统变量 定义的全局密码验证要求策略 。在前面的步骤中, password_require_current 已启用以要求密码更改必须指定当前密码。

      ALTER USER当用户使用orSET PASSWORD语句 更改密码时,会验证当前密码。有关详细信息,请参阅 需要密码验证的策略

    • FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME UNBOUNDED

      FAILED_LOGIN_ATTEMPTS选项定义了有多少次连续错误的密码导致帐户被锁定。该 PASSWORD_LOCK_TIME选项定义了在连续多次登录尝试提供错误密码后帐户被锁定的时间。 PASSWORD_LOCK_TIME可以设置为天数或UNBOUNDED,它指定锁定状态的持续时间是无限的,直到帐户被解锁才结束。

      有关更多信息,包括发生解锁的条件,请参阅 失败登录跟踪和临时帐户锁定

  4. 授予用户权限。以下语句将 SHOW DATABASES权限 授予user1user2 帐户:

    mysql> GRANT SHOW DATABASES ON *.* TO 'user1'@'203.0.113.11';
    mysql> GRANT SHOW DATABASES ON *.* TO 'user2'@'203.0.113.12';
    笔记

    授予 MySQL 帐户的权限决定了该帐户可以执行哪些操作。遵循最小特权原则,MySQL 帐户应仅被授予其合法目的所需的特权。为了促进有效的权限管理,MySQL 8.0 提供了两个新的权限相关特性:MySQL RolesDynamic Privileges。有关这些功能的信息,请参阅 附录 D,SQL 角色和动态权限

  5. 要验证授予用户帐户的权限,请发出 SHOW GRANTS声明。例如:

    mysql> SHOW GRANTS FOR 'user1'@'203.0.113.11';
    +-----------------------------------------------------------------------------------+
    | Grants for user1@203.0.113.11                                                     |
    +-----------------------------------------------------------------------------------+
    | GRANT SHOW DATABASES ON *.* TO 'user1'@'203.0.113.11'                             |
    +-----------------------------------------------------------------------------------+
  6. 要验证帐户是否使用预期的身份验证插件,请发出此查询:

    mysql> SELECT user, plugin FROM mysql.user WHERE user LIKE ('user%')\G 
    *************************** 1. row ***************************
      user: user1
    plugin: caching_sha2_password
    *************************** 2. row ***************************
      user: user2
    plugin: caching_sha2_password