MySQL之密码策略和用户授权

华子目录

  • 密码策略
    • 查看数据库当前的密码策略
    • 密码策略详解
      • caching_sha2_password_auto_generate_rsa_keys
      • caching_sha2_password_digest_rounds
      • caching_sha2_password_private_key_path
      • caching_sha2_password_public_key_path
      • default_password_lifetime
      • disconnect_on_expired_password
      • generated_random_password_length
      • mysql_native_password_proxy_users
      • password_history
      • password_require_current
      • password_reuse_interval
      • sha256_password_auto_generate_rsa_keys
      • sha256_password_private_key_path
      • sha256_password_proxy_users
      • sha256_password_public_key_path
    • 查看==密码验证插件==
      • validate_password.changed_characters_percentage
      • validate_password.check_user_name
      • validate_password.dictionary_file
      • validate_password.length
      • validate_password.mixed_case_count
      • validate_password.number_count
      • validate_password.policy
      • validate_password.special_char_count
    • 修改密码策略
      • 方法1:临时修改
      • 方法2:永久性修改
      • 方法3:配置文件永久性修改
    • win和Linux下的配置文件
  • 用户授权
    • 创建用户
    • 查看用户
    • 查看用户权限
      • 查看==某个用户==从==哪个服务器ip地址==连接对==某个数据库==的操作权限
      • 查看用户对单个表的权限
    • usage权限
    • 删除用户
    • 授权
      • MySQL常用授权列表
    • 回收权限
  • 临时性修改MySQL中的系统变量
  • 持久性修改MySQL中的系统变量

密码策略

  • MySQL8.0之后会生成临时密码,查看临时密码
[root@sql ~]# awk '/temporary password/ {print $NF}' /var/log/mysqld.log
fk?lyfP&N3im
[root@sql ~]# grep 'password' /var/log/mysqld.log
2024-02-04T14:55:57.394017Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: fk?lyfP&N3im

查看数据库当前的密码策略

mysql> show variables like '%password%';
+-------------------------------------------------+-----------------+
| Variable_name                                   | Value           |
+-------------------------------------------------+-----------------+
| caching_sha2_password_auto_generate_rsa_keys    | ON              |
| caching_sha2_password_digest_rounds             | 5000            |
| caching_sha2_password_private_key_path          | private_key.pem |
| caching_sha2_password_public_key_path           | public_key.pem  |
| default_password_lifetime                       | 0               |
| disconnect_on_expired_password                  | ON              |
| generated_random_password_length                | 20              |
| mysql_native_password_proxy_users               | OFF             |
| password_history                                | 0               |
| password_require_current                        | OFF             |
| password_reuse_interval                         | 0               |
| report_password                                 |                 |
| sha256_password_auto_generate_rsa_keys          | ON              |
| sha256_password_private_key_path                | private_key.pem |
| sha256_password_proxy_users                     | OFF             |
| sha256_password_public_key_path                 | public_key.pem  |
| validate_password.changed_characters_percentage | 0               |
| validate_password.check_user_name               | ON              |
| validate_password.dictionary_file               |                 |
| validate_password.length                        | 8               |
| validate_password.mixed_case_count              | 1               |
| validate_password.number_count                  | 1               |
| validate_password.policy                        | MEDIUM          |
| validate_password.special_char_count            | 1               |
+-------------------------------------------------+-----------------+

密码策略详解

1. `caching_sha2_password_auto_generate_rsa_keys`: 当设置为`ON`时,如果没有可用的RSA密钥对,MySQL服务器将自动生成它们,这对于SHA-2密码认证是必需的。

2. `caching_sha2_password_digest_rounds`: 这个值(设置为5000)表示在使用SHA-2密码认证时,密码摘要计算的迭代次数。

3. `caching_sha2_password_private_key_path`: 指向存储RSA私钥的文件的路径,这里使用的是`private_key.pem`4. `caching_sha2_password_public_key_path`: 指向存储RSA公钥的文件的路径,这里使用的是`public_key.pem`5. `default_password_lifetime`: 设置为`0`,表示用户密码没有到期限制,用户密码永不过期。

6. `disconnect_on_expired_password`: 设置为`ON`,表示如果用户的密码已过期,MySQL将在用户下次尝试连接时断开连接。

7. `generated_random_password_length`: 设置为`20`,表示MySQL服务器生成的随机密码的长度。

8. `mysql_native_password_proxy_users`: 设置为`OFF`,表示不允许使用`mysql_native_password`插件的代理用户功能。

9. `password_history`: 设置为`0`,表示MySQL服务器不会保留密码的历史记录,所以用户可以随时重用旧密码。

10. `password_require_current`: 设置为`OFF`,表示在更改密码时不需要提供当前密码。

11. `password_reuse_interval`: 设置为`0`,表示没有限制用户多久之后可以重用旧密码。

12. `report_password`: 这个参数没有显示值,通常用于控制是否报告密码更改。

13. `sha256_password_auto_generate_rsa_keys`: 设置为`ON`,和`caching_sha2_password_auto_generate_rsa_keys`类似,用于自动生成SHA-256密码认证所需的RSA密钥对。

14. `sha256_password_private_key_path`:`caching_sha2_password_private_key_path`,指定SHA-256密码认证所用的RSA私钥文件路径。

15. `sha256_password_proxy_users`: 设置为`OFF`,表示不允许使用`sha256_password`插件的代理用户功能。

16. `sha256_password_public_key_path`:`caching_sha2_password_public_key_path`,指定SHA-256密码认证所用的RSA公钥文件路径。

17. `validate_password.changed_characters_percentage`: 设置为`0`,表示没有强制要求密码在更改时与旧密码有多少百分比的字符不同。

18. `validate_password.check_user_name`: 设置为`ON`,表示在密码验证过程中,会检查密码是否包含用户名。

19. `validate_password.dictionary_file`: 没有具体值,这通常指向一个文件,该文件包含不允许作为密码一部分的单词列表。

20. `validate_password.length`: 设置为`8`,表示密码的最小长度要求。

21. `validate_password.mixed_case_count`: 设置为`1`,表示密码中至少需要包含一个大写字母和一个小写字母。

22. `validate_password.number_count`: 设置为`1`,表示密码中至少需要包含一个数字。

23. `validate_password.policy`: 设置为`MEDIUM`,表示密码复杂性策略的等级。

24. `validate_password.special_char_count`: 设置为`1`,表示密码中至少需要包含一个特殊字符。

这些设置影响着MySQL服务器中用户账户密码的复杂性和安全性要求。根据具体的安全策略需要,数据库管理员可以调整这些参数值。

caching_sha2_password_auto_generate_rsa_keys

`caching_sha2_password_auto_generate_rsa_keys` 是一个 MySQL 系统变量,用于指定在需要时是否自动生成 RSA 密钥对来加密和解密客户端的密码,以及用于签名和验证握手数据。

`caching_sha2_password_auto_generate_rsa_keys` 主要用于控制 MySQL 使用的加密算法和密钥管理。当设置为 `ON` 时,MySQL 将会在需要时自动生成 RSA 密钥对。

RSA 密钥对用于加密和解密客户端的密码,以及签名和验证握手数据。这是为了提供安全的身份验证和通信,特别是在加密连接上。

默认情况下,`caching_sha2_password_auto_generate_rsa_keys` 被设置为 `ON`,这意味着 MySQL 会在需要时自动生成 RSA 密钥对。这样可以确保在安装或重新初始化 MySQL 数据库时,不需要手动创建和配置 RSA 密钥对。

你可以使用以下语句来设置 `caching_sha2_password_auto_generate_rsa_keys`:

mysql> SET GLOBAL caching_sha2_password_auto_generate_rsa_keys = ON;
或者
mysql> SET GLOBAL caching_sha2_password_auto_generate_rsa_keys = OFF;

根据实际需求和安全要求,你可以根据需要启用或禁用自动生成 RSA 密钥对。

caching_sha2_password_digest_rounds

`caching_sha2_password_digest_rounds` 是一个 MySQL 系统变量,用于指定 SHA-256 缓存身份验证插件(caching_sha2_password)中使用的密码哈希迭代轮数。

这个变量控制了加密用户密码时使用的哈希函数的计算复杂度。更高的迭代轮数意味着计算哈希值所需的时间更长,因此增加了密码的安全性。

具体地说,`caching_sha2_password_digest_rounds` 定义了使用 SHA-256 加密算法加密密码时的哈希迭代轮数。较高的迭代轮数增加了密码哈希的计算复杂度,使得破解密码更加困难。

默认情况下,`caching_sha2_password_digest_rounds` 的值为5000。这个值提供了一个合理的安全性水平,但可以根据实际需求和安全要求进行调整。

你可以使用以下语句来设置 `caching_sha2_password_digest_rounds`:

mysql> SET GLOBAL caching_sha2_password_digest_rounds = 10000;

这将增加密码哈希的计算复杂度,提高密码的安全性。根据安全需求和性能要求,你可以根据需要调整密码哈希迭代轮数。

caching_sha2_password_private_key_path

`caching_sha2_password_private_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件时,存储私钥的文件路径。

SHA-256 缓存身份验证插件(caching_sha2_password)是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。私钥是在加密和解密过程中用于生成和验证加密签名的重要部分。

当 MySQL 使用 SHA-256 缓存身份验证插件时,`caching_sha2_password_private_key_path` 变量指定了存储用于加密的私钥的文件路径。通常情况下,私钥文件的扩展名为 `.pem`。

默认情况下,`caching_sha2_password_private_key_path` 设置为 `private_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `private_key.pem` 的私钥文件。如果需要更改私钥文件的路径,可以通过修改此系统变量来指定新的路径。

请注意,私钥文件的安全性非常重要,因此应该妥善保护私钥文件,只有授权的用户可以访问。任何泄露私钥文件的情况都可能导致安全漏洞和数据泄露风险。

caching_sha2_password_public_key_path

`caching_sha2_password_public_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件时,存储公钥的文件路径。

SHA-256 缓存身份验证插件(caching_sha2_password)是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。公钥是用于验证从客户端发送的加密数据的重要部分。

当 MySQL 使用 SHA-256 缓存身份验证插件时,`caching_sha2_password_public_key_path` 变量指定了存储用于加密的公钥的文件路径。通常情况下,公钥文件的扩展名为 `.pem`。

默认情况下,`caching_sha2_password_public_key_path` 设置为 `public_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `public_key.pem` 的公钥文件。如果需要更改公钥文件的路径,可以通过修改此系统变量来指定新的路径。

请注意,公钥文件的安全性非常重要,因此应该妥善保护公钥文件,只有授权的用户可以访问。任何泄露公钥文件的情况都可能导致安全漏洞和数据泄露风险。

default_password_lifetime

`default_password_lifetime` 是一个 MySQL 系统变量,用于指定新创建用户的密码的默认过期时间。

当这个系统变量被设置为一个非零值时,新创建的用户的密码将在指定的时间段后过期。过期后,用户将被要求更改密码,否则将无法登录 MySQL。

如果 `default_password_lifetime` 被设置为0,意味着新创建用户的密码将永不过期,即密码不会被强制更改。

默认情况下,`default_password_lifetime` 通常被设置为0,这意味着新用户的密码不会被强制更改。但是,根据安全策略和合规性要求,你可以将其设置为一个正整数值,以强制密码定期更改。

例如,如果要求所有用户的密码每90天更改一次,可以执行以下语句:
mysql> set global default_password_lifetime = 90;

这将使新创建的用户的密码在创建后90天后过期,需要用户更改密码才能继续使用 MySQL。

disconnect_on_expired_password

`disconnect_on_expired_password` 是一个 MySQL 系统变量,用于指定当用户的密码过期时是否断开与 MySQL 的连接。

当 `disconnect_on_expired_password` 被设置为 `ON` 时,如果用户的密码过期了,MySQL 将会立即断开与该用户的连接。这意味着用户需要重新连接并提供一个新的、未过期的密码才能再次访问数据库。

默认情况下,`disconnect_on_expired_password` 被设置为 `ON`,这意味着当密码过期时,MySQL 将会断开与用户的连接。这是为了确保安全性,因为过期的密码可能不再安全,需要用户立即更改。

如果将 `disconnect_on_expired_password` 设置为 `OFF`,则即使密码过期,MySQL 也不会立即断开与用户的连接。这可能会导致安全风险,因为用户可以继续使用过期的密码来访问数据库。

你可以使用以下语句来设置 `disconnect_on_expired_password`:
mysql> SET GLOBAL disconnect_on_expired_password = ON;
或者
mysql> SET GLOBAL disconnect_on_expired_password = OFF;

根据安全策略和合规性要求,你可以根据实际情况选择是否启用这个选项。

generated_random_password_length

`generated_random_password_length` 是一个 MySQL 系统变量,用于指定自动生成的随机密码的长度。

当 MySQL 需要生成随机密码时,例如在创建新用户或重置密码时,会使用此变量指定的长度生成随机密码。

默认情况下,`generated_random_password_length` 的值为 20,这意味着自动生成的随机密码将包含 20 个字符。这个长度可以根据实际需求进行调整。

例如,如果你想将自动生成的随机密码的长度设置为 12,可以执行以下语句:

mysql> SET GLOBAL generated_random_password_length = 12;

这将使 MySQL 自动生成的随机密码长度为 12 个字符。根据安全需求和实际情况,你可以根据需要调整密码长度。

mysql_native_password_proxy_users

`mysql_native_password_proxy_users` 是一个 MySQL 系统变量,用于控制是否启用原生密码代理用户。

MySQL 原生密码代理用户是一种特殊类型的用户,其密码存储在 `mysql.user` 表中,采用了旧版的密码散列算法,例如 MySQL 5.7 之前使用的加密方式。当 MySQL 8.0 以后的版本与旧版 MySQL(例如 5.7 或更早版本)进行连接时,可能需要使用原生密码代理用户,以便这些旧版本的客户端能够成功连接到 MySQL 8.0 以上的服务器。

如果将 `mysql_native_password_proxy_users` 设置为 `ON`,则 MySQL 服务器将允许原生密码代理用户连接,并且对于使用旧版密码散列算法的用户,将尝试使用原生密码进行身份验证。如果设置为 `OFF`,则禁用原生密码代理用户。

默认情况下,`mysql_native_password_proxy_users` 被设置为 `OFF`,这意味着原生密码代理用户被禁用。通常情况下,只有在需要与旧版本的 MySQL 进行兼容时才会启用此选项。

你可以使用以下语句来设置 `mysql_native_password_proxy_users`:

mysql> SET GLOBAL mysql_native_password_proxy_users = ON;
或者
mysql> SET GLOBAL mysql_native_password_proxy_users = OFF;

根据实际需求和环境设置是否启用原生密码代理用户。

password_history

`password_history` 是一个 MySQL 系统变量,用于指定记录用户密码历史的最大长度。具体来说,它定义了在创建或更改用户密码时,系统会保留的先前密码数量。

当用户尝试更改其密码时,MySQL 将检查新密码是否与密码历史中的任何旧密码相同。如果设置了 `password_history`,并且新密码与密码历史中的任何一个密码匹配,则新密码将被拒绝。

这有助于防止用户反复使用相同的密码,增加了密码的安全性。

默认情况下,`password_history` 的值为0,这意味着 MySQL 不会记录用户密码的历史。因此,用户可以在任何时候更改其密码,而不受以前使用过的密码的限制。

你可以使用以下语句来设置 `password_history`:

mysql> SET GLOBAL password_history = 10;

这将使系统记录用户密码历史的最大长度为10,意味着用户不能在最近使用的10个密码中重复使用任何一个。根据安全要求,你可以根据需要调整密码历史记录的长度。

password_require_current

`password_require_current` 是一个 MySQL 系统变量,用于指定用户更改密码时是否需要提供当前密码。

当 `password_require_current` 被设置为 `ON` 时,用户在更改密码时必须首先提供当前密码。这样可以确保用户有权限更改密码,并且防止未经授权的人员在没有当前密码的情况下更改密码。

默认情况下,`password_require_current` 被设置为 `OFF`,这意味着用户在更改密码时不需要提供当前密码。这使得用户更改密码更加方便,但也可能增加了安全风险,因为任何知道用户名的人都可以尝试更改密码。

你可以使用以下语句来设置 `password_require_current`:

mysql> SET GLOBAL password_require_current = ON;
或者
mysql> SET GLOBAL password_require_current = OFF;

根据安全策略和合规性要求,你可以选择是否要求用户在更改密码时提供当前密码。

password_reuse_interval

`password_reuse_interval` 是一个 MySQL 系统变量,用于指定在更改密码后,用户必须等待多长时间才能重新使用先前使用过的密码。

具体来说,`password_reuse_interval` 定义了在更改密码后,系统将拒绝使用在指定间隔内曾经使用过的密码。如果用户试图在此间隔内再次使用先前使用过的密码,则系统将拒绝此操作。

这有助于提高密码的安全性,因为强制用户定期更改密码,并且不允许他们在短时间内重复使用先前使用过的密码。

默认情况下,`password_reuse_interval` 的值为0,这意味着系统不会限制用户重新使用先前使用过的密码。你可以将其设置为一个正整数值,以定义密码重用的间隔。

例如,如果你想要求用户更改密码后至少等待30天才能重新使用先前使用过的密码,可以执行以下语句:

mysql> SET GLOBAL password_reuse_interval = 30;

根据安全需求和实际情况,你可以根据需要调整密码重用的间隔。

sha256_password_auto_generate_rsa_keys

`sha256_password_auto_generate_rsa_keys` 是一个 MySQL 系统变量,用于指定是否在需要时自动生成 RSA 密钥对来加密和解密客户端的密码,以及用于签名和验证握手数据。

当 `sha256_password_auto_generate_rsa_keys` 被设置为 `ON` 时,MySQL 将会在需要使用 SHA-256 缓存身份验证插件(sha256_password)时自动生成 RSA 密钥对。

SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。RSA 密钥对是用于加密和解密用户密码以及签名和验证握手数据的关键部分。

默认情况下,`sha256_password_auto_generate_rsa_keys` 被设置为 `ON`,这意味着 MySQL 会在需要时自动生成 RSA 密钥对。这样可以确保在安装或重新初始化 MySQL 数据库时,不需要手动创建和配置 RSA 密钥对。

你可以使用以下语句来设置 `sha256_password_auto_generate_rsa_keys`:

mysql> SET GLOBAL sha256_password_auto_generate_rsa_keys = ON;
或者
mysql> SET GLOBAL sha256_password_auto_generate_rsa_keys = OFF;

根据实际需求和安全要求,你可以根据需要启用或禁用自动生成 RSA 密钥对。

sha256_password_private_key_path

`sha256_password_private_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件(sha256_password)时,存储私钥的文件路径。

SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。私钥是在加密和解密过程中用于生成和验证加密签名的重要部分。

当 MySQL 使用 SHA-256 缓存身份验证插件时,`sha256_password_private_key_path` 变量指定了存储用于加密的私钥的文件路径。通常情况下,私钥文件的扩展名为 `.pem`。

默认情况下,`sha256_password_private_key_path` 设置为 `private_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `private_key.pem` 的私钥文件。如果需要更改私钥文件的路径,可以通过修改此系统变量来指定新的路径。

请注意,私钥文件的安全性非常重要,因此应该妥善保护私钥文件,只有授权的用户可以访问。任何泄露私钥文件的情况都可能导致安全漏洞和数据泄露风险。

sha256_password_proxy_users

`sha256_password_proxy_users` 是一个 MySQL 系统变量,用于控制是否启用 SHA-256 缓存身份验证插件(sha256_password)的代理用户功能。

SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。代理用户功能允许 MySQL 8.0 以上版本的服务器以原生密码(mysql_native_password)方式允许与旧版本 MySQL(例如 5.7 或更早版本)的客户端连接。

当 `sha256_password_proxy_users` 被设置为 `ON` 时,MySQL 服务器将允许使用 SHA-256 缓存身份验证插件的代理用户连接,并且对于使用原生密码散列算法的用户,将尝试使用 SHA-256 缓存身份验证插件进行身份验证。如果设置为 `OFF`,则禁用 SHA-256 缓存身份验证插件的代理用户功能。

默认情况下,`sha256_password_proxy_users` 被设置为 `OFF`,这意味着代理用户功能被禁用。通常情况下,只有在需要与旧版本的 MySQL 进行兼容时才会启用此选项。

你可以使用以下语句来设置 `sha256_password_proxy_users`:


mysql> SET GLOBAL sha256_password_proxy_users = ON;
或者
mysql> SET GLOBAL sha256_password_proxy_users = OFF;

根据实际需求和环境设置是否启用 SHA-256 缓存身份验证插件的代理用户功能。

sha256_password_public_key_path

`sha256_password_public_key_path` 是一个 MySQL 系统变量,用于指定在使用 SHA-256 缓存身份验证插件(sha256_password)时,存储公钥的文件路径。

SHA-256 缓存身份验证插件是 MySQL 8.0 版本引入的一种密码验证插件,用于增强 MySQL 的身份验证机制。它使用了基于 SHA-256 的加密算法,并且支持加密通信。公钥是用于验证从客户端发送的加密数据的重要部分。

当 MySQL 使用 SHA-256 缓存身份验证插件时,`sha256_password_public_key_path` 变量指定了存储用于加密的公钥的文件路径。通常情况下,公钥文件的扩展名为 `.pem`。

默认情况下,`sha256_password_public_key_path` 设置为 `public_key.pem`,这意味着 MySQL 会在与之关联的数据目录中查找名为 `public_key.pem` 的公钥文件。如果需要更改公钥文件的路径,可以通过修改此系统变量来指定新的路径。

请注意,公钥文件的安全性非常重要,因此应该妥善保护公钥文件,只有授权的用户可以访问。任何泄露公钥文件的情况都可能导致安全漏洞和数据泄露风险。

查看密码验证插件

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

MySQL数据库管理系统中的密码验证插件validate_password)的参数配置。每个参数都用于设置密码策略的不同方面,以确保用户设置的密码符合安全标准。以下是每个参数的含义:

1. `validate_password.changed_characters_percentage`: 当用户更改密码时,新密码与旧密码必须至少有百分之多少的字符不同。这里设置为 `0`,表示没有强制更改字符的比例要求。

2. `validate_password.check_user_name`: 当此项设置为 `ON` 时,密码验证过程将检查密码是否包含用户名。如果包含,密码将不被接受。

3. `validate_password.dictionary_file`: 此参数指向一个包含不允许作为密码一部分的词汇的文件。在这里没有提供具体的文件路径,所以可能是使用默认的字典文件或者没有指定。

4. `validate_password.length`: 这定义了密码的最小长度。在此配置中,最小长度为 `8` 个字符。

5. `validate_password.mixed_case_count`: 密码必须包含的最小大小写字母数量。这里的值是 `1`,意味着密码至少需要包含一个小写字母和一个大写字母。

6. `validate_password.number_count`: 密码中必须包含的数字的最小数量。设置为 `1`,表示密码至少需要包含一个数字。

7. `validate_password.policy`: 定义了密码强度策略的级别。`MEDIUM` 表示采用中等强度的密码策略。

8. `validate_password.special_char_count`: 密码必须包含的特殊字符的最小数量。这里设置为 `1`,表示密码至少需要包含一个特殊字符。

这些配置帮助数据库管理员强制执行强密码策略,以减少安全风险。

validate_password.changed_characters_percentage

在MySQL中,`validate_password.changed_characters_percentage` 配置参数用于指定在用户更改密码时,新密码中必须有多少百分比的字符与旧密码不同。这是一个确保用户在更改密码时不仅仅是进行微小修改的安全措施。

这个参数的值设置为一个0100之间的整数,代表必须更改的字符的最小百分比。比如,如果这个值设置为 `50`,那么新密码至少需要有一半的字符不同于旧密码。如果设置为 `100`,则意味着新密码中的所有字符都不能与旧密码相同。

在您提供的图片中,`validate_password.changed_characters_percentage` 的值被设置为 `0`,这意味着没有强制用户在更改密码时更改特定比例的字符。也就是说,用户可以进行轻微的更改,甚至可以重新使用旧密码,这在安全性较低的环境中可能是可接受的,但在需要高安全性的环境中则不建议使用。

mysql> SET GLOBAL validate_password.changed_characters_percentage = 50;

validate_password.check_user_name

在MySQL中,`validate_password.check_user_name` 参数用于控制密码验证插件是否应检查密码中是否包含了用户名。当这个参数设置为 `ON`,密码验证过程将确保用户的密码不包含其用户名的任何部分。这是一个安全特性,因为包含用户名的密码通常更容易被猜测。

如果用户尝试设置一个包含其用户名的密码,而该参数被激活(即设为 `ON`),密码将被拒绝。这样做可以减少某些基于字典的攻击,其中攻击者可能会尝试使用与用户账户名相关的词汇来破解密码。

如果将 `validate_password.check_user_name` 设置为 `OFF`,则禁用此检查,MySQL 将不再验证密码中是否包含用户名。

在您提供的图片中,这个参数被设置为 `ON`,这意味着密码验证时将会检查密码中是否包含了用户名,从而提高安全性。

mysql> SET GLOBAL validate_password.check_user_name = ON;
mysql> SET GLOBAL validate_password.check_user_name = OFF;

validate_password.dictionary_file

在MySQL中,`validate_password.dictionary_file` 参数用于指定一个文件路径,该文件包含不允许作为密码一部分的词汇列表。这个功能旨在防止用户选择过于简单或者常见的单词作为密码,从而增加密码的安全性。

如果指定了 `validate_password.dictionary_file` 参数,并且用户尝试设置一个包含在该文件中的词汇的密码,那么这个密码将被视为不合规,并且设置密码操作将被拒绝。

在您提供的图片中,并没有显示具体的文件路径,这可能意味着要么没有指定自定义的字典文件路径,要么使用了默认的字典文件路径。如果需要使用自定义的字典文件,应该在参数中提供该文件的路径。

mysql> SET GLOBAL validate_password.dictionary_file = '/path/to/dictionary_file.txt';

validate_password.length

在MySQL中,`validate_password.length` 是一个密码验证插件的参数,它用于定义密码的最小长度要求。当用户设置密码时,系统会检查密码的长度是否满足这个要求。如果密码长度不符合指定的最小长度,则密码设置操作将被拒绝。

在您提供的图片中,`validate_password.length` 的值被设置为 `8`,这意味着任何密码至少需要包含8个字符才能符合密码策略要求。这样的设置有助于增强密码的安全性,因为较长的密码通常更难被猜测或暴力破解。

mysql> SET GLOBAL validate_password.length = 10;

validate_password.mixed_case_count

在MySQL中,`validate_password.mixed_case_count` 是一个密码验证插件的参数,用于指定密码中必须包含的最小混合大小写字母的数量。换句话说,这个参数规定了密码中至少需要包含多少个大写字母和多少个小写字母,才能符合密码策略要求。

例如,如果 `validate_password.mixed_case_count` 被设置为 `1`,那么密码至少需要包含一个大写字母和一个小写字母,否则密码设置操作将被拒绝。

在您提供的图片中,`validate_password.mixed_case_count` 的值被设置为 `1`,这意味着密码必须至少包含一个大写字母和一个小写字母才能满足密码策略要求。这种设置有助于增强密码的复杂性,使其更难被猜测或暴力破解。

mysql> SET GLOBAL validate_password.mixed_case_count = 2;

validate_password.number_count

在MySQL中,`validate_password.number_count` 是一个密码验证插件的参数,它用于指定密码中必须包含的最小数字数量。换句话说,这个参数规定了密码中至少需要包含多少个数字字符,才能符合密码策略要求。

例如,如果 `validate_password.number_count` 被设置为 `1`,那么密码至少需要包含一个数字字符,否则密码设置操作将被拒绝。

在您提供的图片中,`validate_password.number_count` 的值被设置为 `1`,这意味着密码必须至少包含一个数字字符才能满足密码策略要求。这种设置有助于增强密码的复杂性,使其更难被猜测或暴力破解。

mysql> SET GLOBAL validate_password.number_count = 2;

validate_password.policy

`validate_password.policy` 在 MySQL 中是一个配置参数,它用于定义密码验证插件的策略级别。这个参数确定了密码必须达到的强度,并且可以根据设置的级别,对密码的复杂性进行不同程度的要求。MySQL 中通常有以下几种策略级别:

- `LOW`: 密码至少需要达到 `validate_password.length` 参数指定的长度。(low)
- `MEDIUM`: 密码必须满足 `LOW` 策略的要求,同时包含数字、大小写字母和特殊字符。(medium)
- `STRONG`: 密码必须满足 `MEDIUM` 策略的要求,并且不能包含词典文件中的单词。(strong)

在您的图片中,`validate_password.policy` 被设置为 `MEDIUM`,这意味着密码至少需要包含一个数字、一个大小写字母和一个特殊字符,并且达到指定的最小长度。这种设置旨在提供比最低要求更强的密码安全性。

mysql> SET GLOBAL validate_password.policy = 'STRONG';

validate_password.special_char_count

在MySQL中,`validate_password.special_char_count` 是一个密码验证插件的参数,它用于指定密码中必须包含的最小特殊字符数量。换句话说,这个参数规定了密码中至少需要包含多少个特殊字符,才能符合密码策略要求。

例如,如果 `validate_password.special_char_count` 被设置为 `1`,那么密码至少需要包含一个特殊字符,否则密码设置操作将被拒绝。

在您提供的图片中,`validate_password.special_char_count` 的值被设置为 `1`,这意味着密码必须至少包含一个特殊字符才能满足密码策略要求。这种设置有助于增强密码的复杂性,使其更难被猜测或暴力破解。

mysql> SET GLOBAL validate_password.special_char_count = 2;

修改密码策略

方法1:临时修改

  • 在 MySQL 中,使用 set global 命令修改系统变量会将其值修改为临时值,这意味着修改只在当前 MySQL 会话(多个会话,不仅仅是一个)中有效,并且在 MySQL 服务器重新启动后将被重置为默认值或先前的持久化值。但改完后修改成功的密码后期是可以使用的。
    语法
mysql> set global 变量名=策略值;
mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

mysql> set global validate_password.length=5;

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 5      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

当重启服务器后,又会变回之前的默认值

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

方法2:永久性修改

  • 在 MySQL 中,使用 set persist 命令可以永久性地修改系统变量的值包括密码策略。这意味着修改后的值会在 MySQL 服务器重新启动后保持不变

语法

mysql> set persist 变量名=策略值;
mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+
8 rows in set (0.01 sec)

mysql> set persist validate_password.length=5;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 5      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

重启服务器后,密码策略被永久性修改

mysql> show variables like '%validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 5      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+

方法3:配置文件永久性修改

/etc/my.cnf配置文件中添加:
[mysqld]
validate_password.policy=low
[root@sql ~]# vim /etc/my.cnf
[mysqld]
validate_password.policy=low

[root@sql ~]# systemctl restart mysqld
[root@sql ~]# mysql -uroot -pMysql@123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%validate_password%';
+-------------------------------------------------+-------+
| Variable_name                                   | Value |
+-------------------------------------------------+-------+
| validate_password.changed_characters_percentage | 0     |
| validate_password.check_user_name               | ON    |
| validate_password.dictionary_file               |       |
| validate_password.length                        | 8     |
| validate_password.mixed_case_count              | 1     |
| validate_password.number_count                  | 1     |
| validate_password.policy                        | LOW   |
| validate_password.special_char_count            | 1     |
+-------------------------------------------------+-------+

重启服务器后,密码策略被永久性修改

mysql> show variables like '%validate_password%';
+-------------------------------------------------+-------+
| Variable_name                                   | Value |
+-------------------------------------------------+-------+
| validate_password.changed_characters_percentage | 0     |
| validate_password.check_user_name               | ON    |
| validate_password.dictionary_file               |       |
| validate_password.length                        | 8     |
| validate_password.mixed_case_count              | 1     |
| validate_password.number_count                  | 1     |
| validate_password.policy                        | LOW   |
| validate_password.special_char_count            | 1     |
+-------------------------------------------------+-------+

注:在永久性修改时,系统会优先选择通过set persist命令修改的系统变量

win和Linux下的配置文件

  • win下是my.ini
  • linux下是my.cnf

用户授权

  • MySQL8以后有新的安全要求,不能像之前的版本那样一次性创建用户并授权。需要先创建用户,再进行授权操作。

创建用户

语法

mysql> create user 'username'@'host' identified by 'password';
username:自定义的用户名
host:是允许用户连接的主机,可以是客户端的域名或IP,如果host为'%'时,表示任意IP
password:密码
mysql> create user 'redhat'@'%' identified by 'MYsql@123';
Query OK, 0 rows affected (0.05 sec)

刚创建一个用户后,用户只有usageshow databases的权限,且show databases后的结果只有两个库,分别是:information_schemaperformance_schema

[root@sql ~]# mysql -uredhat -pMYsql@123

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+

查看用户

MySQL中的用户信息存储在mysql库中的user表里

mysql> select user 用户,host 允许主机 from mysql.user;
+------------------+-----------+
| 用户             | 允许主机  |
+------------------+-----------+
| redhat           | %         |
| text             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

查看用户权限

语法

mysql> show grants;   # 查看当前用户权限
或
mysql> show grants for 用户名;
或
mysql> show grants for 用户名@'host';
mysql> show grants for redhat;
+------------------------------------+
| Grants for redhat@%                |
+------------------------------------+
| GRANT USAGE ON *.* TO `redhat`@`%` |
+------------------------------------+
# 这里显示usage权限,表示仅仅可以登录MySQL,有登录权限

查看某个用户哪个服务器ip地址连接对某个数据库的操作权限

  • 这三个字段的组合构成了db表的主键。
mysql> select * from mysql.db;
+-----------+--------------------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+------------------+----------------+---------------------+--------------------+--------------+------------+--------------+
| Host      | Db                 | User          | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Create_tmp_table_priv | Lock_tables_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Execute_priv | Event_priv | Trigger_priv |
+-----------+--------------------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+------------------+----------------+---------------------+--------------------+--------------+------------+--------------+
| %         | huazi              | redhat        | Y           | Y           | Y           | Y           | N           | N         | N          | N               | N          | N          | N                     | N                | N                | N              | N                   | N                  | N            | N          | N            |
| localhost | performance_schema | mysql.session | Y           | N           | N           | N           | N           | N         | N          | N               | N          | N          | N                     | N                | N                | N              | N                   | N                  | N            | N          | N            |
| localhost | sys                | mysql.sys     | N           | N           | N           | N           | N           | N         | N          | N               | N          | N          | N                     | N                | N                | N              | N                   | N                  | N            | N          | Y            |
+-----------+--------------------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+------------+-----------------+------------+------------+-----------------------+------------------+------------------+----------------+---------------------+--------------------+--------------+------------+--------------+

查看用户对单个表的权限

mysql> select * from mysql.tables_priv;
+-----------+-------+---------------+------------+----------------+---------------------+------------+-------------+
| Host      | Db    | User          | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |
+-----------+-------+---------------+------------+----------------+---------------------+------------+-------------+
| localhost | mysql | mysql.session | user       | boot@          | 2024-02-04 22:55:58 | Select     |             |
| localhost | sys   | mysql.sys     | sys_config | root@localhost | 2024-02-04 22:55:58 | Select     |             |
+-----------+-------+---------------+------------+----------------+---------------------+------------+-------------+

usage权限

  • usage:连接(登录)权限,建立一个用户,就会自动授予usage权限(默认授予)。该usage权限并不能被revoke(回收)。

删除用户

语法

mysql> drop user 用户名;
或
mysql> drop user 用户名@'host';
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| text             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+


mysql> drop user text;
Query OK, 0 rows affected (0.03 sec)


mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| redhat           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

授权

授权原则

  • 只授予能满足需要的最小权限 ,防止用户干坏事。比如用户只是需要查询,那就只给 select 权限就可以了,不要给用户赋予update 、 insert 或者 delete 权限
  • 创建用户的时候限制用户的登录主机 ,一般是限制成指定 IP 或者内网 IP 段。
  • 每个用户设置满足密码复杂度的密码
  • 定期清理不需要的用户 ,回收权限或者删除用户。

语法

mysql> grant 授权列表 on 库名.表名 to 'username' [with option参数];
或
mysql> grant 授权列表 on 库名.表名 to 'username'@'host‘ [with option参数];
mysql> grant insert,delete,update,select on huazi.* to redhat;# 授予redhat用户对huazi库下的所有表增删改查的操作
Query OK, 0 rows affected (0.00 sec)


mysql> show grants for redhat;
+-------------------------------------------------------------------+
| Grants for redhat@%                                               |
+-------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `redhat`@`%`                                |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `huazi`.* TO `redhat`@`%` |
+-------------------------------------------------------------------+
#这时就有对huazi库下所有表的insert,delete,update,select权限
#和登录MySQL数据库的usage权限
mysql> create user xiaoming@'%' identified by 'MYSql@123';
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for xiaoming;
+--------------------------------------+
| Grants for xiaoming@%                |
+--------------------------------------+
| GRANT USAGE ON *.* TO `xiaoming`@`%` |
+--------------------------------------+

mysql> grant create,alter,drop on *.* to xiaoming; #授予xiaoming用户对所有库下的所有表的create,alter,drop权限
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for xiaoming;
+----------------------------------------------------+
| Grants for xiaoming@%                              |
+----------------------------------------------------+
| GRANT CREATE, DROP, ALTER ON *.* TO `xiaoming`@`%` |
+----------------------------------------------------+

MySQL常用授权列表

权限列表 说明
all 或者all privileges 授予用户所有权限
create 授予用户创建新数据库和表的权限
drop 授予用户删除数据库和表的权限
delete 授予用户删除表中的行的权限
alter 授予用户修改表结构的权限
insert 授予用户在表中插入行(add)的权限
select 授予用户运行select命令以从表中读取数据的权限
update 授予用户更新表中的数据的权限

回收权限

语法

mysql> revoke 授权列表 on 库名.表名 from 用户;
mysql> show grants for xiaoming;
+----------------------------------------------------+
| Grants for xiaoming@%                              |
+----------------------------------------------------+
| GRANT CREATE, DROP, ALTER ON *.* TO `xiaoming`@`%` |
+----------------------------------------------------+


mysql> revoke drop,alter on *.* from xiaoming;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for xiaoming;
+---------------------------------------+
| Grants for xiaoming@%                 |
+---------------------------------------+
| GRANT CREATE ON *.* TO `xiaoming`@`%` |
+---------------------------------------+

mysql> flush privileges; #操作完后重新刷新权限
Query OK, 0 rows affected (0.01 sec)


mysql> show grants for xiaoming;
+---------------------------------------+
| Grants for xiaoming@%                 |
+---------------------------------------+
| GRANT CREATE ON *.* TO `xiaoming`@`%` |
+---------------------------------------+

临时性修改MySQL中的系统变量

在 MySQL 中,你可以使用 `set global` 命令来临时性地修改系统变量的值。这种修改只在当前的 MySQL 会话中有效,一旦会话结束或 MySQL 服务器重新启动,修改的值就会被重置为默认值或者之前的持久化值。

以下是如何使用 `set global` 命令来临时性修改系统变量的示例:

mysql> set global validate_password.length = 10;
mysql> set global validate_password.mixed_case_count = 2;
mysql> set global validate_password.number_count = 2;
mysql> set global validate_password.special_char_count = 2;
mysql> set global validate_password.policy = 'STRONG';

这将会将修改的密码策略设置为临时性,只在当前的 MySQL 会话中有效。 

请注意,使用 `set global` 命令修改系统变量的值需要确保你有足够的权限。

持久性修改MySQL中的系统变量

要在 MySQL 中持久性地修改系统变量,你可以使用 `set persist` 命令。这将确保系统变量的修改在 MySQL 服务器重新启动后仍然保持。

以下是如何使用 `set persist` 命令进行持久性修改系统变量的示例:

mysql> set persist validate_password.length = 10;
mysql> set persist validate_password.mixed_case_count = 2;
mysql> set persist validate_password.number_count = 2;
mysql> set persist validate_password.special_char_count = 2;
mysql> set persist validate_password.policy = 'STRONG';

这将会将修改的密码策略设置为持久化,即使 MySQL 服务器重新启动,修改后的密码策略仍然会保持。

请注意,在使用 `SET PERSIST` 命令时,需要确保你对配置文件有适当的写入权限,并且在执行 `set persist` 命令后,需要重新加载 MySQL 配置才能使修改生效。

你可能感兴趣的:(mysql,数据库,运维)