MySQL实验之-密码策略

MySQL8 提供了较多的密码管理功能和策略, 包括密码过期时间设置, 密码重用限制, 密码验证, 双密码, 密码强度评估和密码失败跟踪等. DBA使用提供的这些功能和策略对MySQL用户的密码进行管理和配置, 进一步完善数据库的安全保障

1. 密码过期策略

提供参数配置设置全局密码过期时间, 也可以创建用户是指定该用户的密码过期时间, 也可以手动设置某一用户密码过期; 系统从用户最近一次密码更新时间计时, 当超过其允许的生命周期时必须重置密码后才能正常登陆.

设置全局密码过期时间 default_password_lifetime 单位为天, default_password_lifetime=0 时默认密码永不过期

default_password_lifetime=180 -- 配置文件中修改, 重启后生效
SET PERSIST default_password_lifetime = 180; -- 在线修改并持久化

除全局配置外, 也可以创建用户时指定密码过期时间

-- 创建用户 test_passwd 并设置密码过期时间为90天
CREATE USER 'test_passwd'@'localhost' identified by 'test_passwd' PASSWORD EXPIRE INTERVAL 90 DAY;
select user,host,password_last_changed,password_lifetime from mysql.user where user='test_passwd';
-- 创建用户 test_passwd_never 并设置密码永不过期
CREATE USER 'test_passwd_never'@'localhost' identified by 'test_passwd' PASSWORD EXPIRE NEVER;
select user,host,password_last_changed,password_lifetime from mysql.user where user='test_passwd_never';
-- 创建用户 test_passwd_default 并设置密码过期时间遵循系统默认值
CREATE USER 'test_passwd_default'@'localhost' identified by 'test_passwd' PASSWORD EXPIRE DEFAULT;
select user,host,password_last_changed,password_lifetime from mysql.user where user='test_passwd_default';

手动设置某一用户密码过期

ALTER USER 'test_passwd'@'localhost' PASSWORD EXPIRE;
-- 当用户密码过期后, 登录动作受只读参数 disconnect_on_expired_password 和 客户端共同影响. 旧版客户端当 disconnect_on_expired_password=on 时拒绝登录, 新版客户端 (可以处理过期密码) 可以正常登录但进入沙箱模式. 进入沙箱模式后只能重置密码后才能正常使用

select 1; #报错举例: ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

2. 密码重用策略

MySQL 可以限制已使用的密码重复使用, 可以根据密码修改的次数和密码使用的时间间隔两个维度进行限制. 同样的既可以设置一个全局策略, 也可以对每个用户设置单独的策略

当开启密码重用策略后 mysql.password_history 表中将会记录用户使用的历史密码和该密码被修改的时间. 可以配置限制密码更改的次数, 如 password_history 设置为3, 则不能使用最近三次使用过的密码; 也可以配置限制密码使用时间, 如配置 password_reuse_interval=60, 则不能使用60天内使用过的密码; 空密码不计入密码历史表, 可以随时重复使用

设置全局密码重用策略,

-- 如: 不能使用最近六次使用过的密码,并且一年内没有使用过
password_history=6 #配置文件中修改, 重启后生效
password_reuse_interval=365
SET PERSIST password_history = 6; -- 在线修改并持久化
SET PERSIST password_reuse_interval = 365;
-- 创建用户时指定或修改某一用户的密码重用策略
create user 'test_reuse'@'localhost' PASSWORD HISTORY 6 PASSWORD REUSE INTERVAL 365 DAY;
select user,host,password_reuse_history,password_reuse_time from mysql.user where user='test_reuse';
-- 修改现有用户配置
alter user 'test_reuse'@'localhost' PASSWORD HISTORY 3 PASSWORD REUSE INTERVAL 60 DAY;
select user,host,password_reuse_history,password_reuse_time from mysql.user where user='test_reuse';
-- 修改成默认值
alter user 'test_reuse'@'localhost' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT;
select user,host,password_reuse_history,password_reuse_time from mysql.user where user='test_reuse';
-- 设置重用规则, 当修改的密码不满足该规则时会报错
alter user 'test'@'%' PASSWORD HISTORY 2;

3. 密码验证策略

从 MySQL8.0.13 开始支持密码验证策略, 通过全局和指定用户的配置可以实现修改密码时需要提供当前密码. 避免用户密码被恶意更改的情况

如果用户设置了 PASSWORD REQUIRE CURRENT 则必须密码验证, 如用户设置了 PASSWORD REQUIRE OPTIONAL 则不需要密码验证, 如用户设置了 PASSWORD REQUIRE CURRENT DEFAULT (默认值)则受参数password_require_current 控制

-- 开启关闭全局密码验证
SET PERSIST password_require_current = ON/OFF;
-- 修改用户
alter user 'test'@'%' PASSWORD REQUIRE CURRENT;
alter user 'test'@'%' PASSWORD REQUIRE CURRENT OPTIONAL;
alter user 'test'@'%' PASSWORD REQUIRE CURRENT DEFAULT;

4. 双密码

从 MySQL8.0.14 开始允许给用户配置双密码.

如果您为主密码为空的账号指定 RETAIN CURRENT PASSWORD 则语句失败. 如果账号有二级密码, 并且您在未指定 RETAIN CURRENT PASSWORD 的情况下更改其主密码,则二级密码保持不变

-- 修改 test 用户密码为 new_passwd, 保留原密码 这时新旧密码都可以登录
alter user current_user() identified by 'new_passwd' RETAIN CURRENT PASSWORD;
select user,host,authentication_string,User_attributes from mysql.user where user='test' and host='%';
-- 删除旧密码后 old_passwd 停用
alter user current_user() DISCARD OLD PASSWORD;
select user,host,authentication_string,User_attributes from mysql.user where user='test' and host='%';

5. 随机密码生产

从 MySQL8.0.18开始, 在创建用户, 修改密码时可以生成随机密码. 随机密码长度受
generated_random_password_length 控制,范围从 5 到 255, 默认为 20

show global variables like 'generated_random_password_length';
-- 创建用户随机密码
create user 'test_random'@'%' IDENTIFIED BY RANDOM PASSWORD;
-- 使用生产的密码登录
mysql -h127.0.0.1 -utest_random -p'[txZ:Hct895}qD3zU}7y['
-- 修改用户密码为随机密码
alter user 'test_random'@'%' IDENTIFIED BY RANDOM PASSWORD;
SET PASSWORD FOR 'test_random'@'%' to RANDOM;

6. 登录失败跟踪和临时账号锁定

从 MySQL8.0.19 开始, 管理员可以配置用户当连续登录失败超过阈值时的锁定时间

-- 创建用户 test_lock 连续失败3次后锁定2天
create user 'test_lock'@'%' IDENTIFIED BY RANDOM PASSWORD FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
-- 修改用户 test_lock 连续失败 2 次后锁定 3 天
alter user 'test_lock'@'%' FAILED_LOGIN_ATTEMPTS 2 PASSWORD_LOCK_TIME 3;
select User_attributes from mysql.user where user='test_lock'\G
User_attributes: {"Password_locking": {"failed_login_attempts": 2, "password_lock_time_days": 3}}

-- 错误例子: 连续失败后该账号被锁定的提示
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 3955 (HY000): Access denied for user 'test_lock'@'127.0.0.1'. Account is blocked for 3 day(s) (3 day(s) remaining) due to 2 consecutive failed logins.

解除锁定的几种方式

服务器重启
flush privileges;
alter user ‘test_lock’@‘%’ account unlock;

7. 密码强度评估

MySQL8.0 开始, 使用 validate_password 组件进行密码强度的评估, validate_password 组件实现了以下功能:

对于分配作为明文值提供的密码的 SQL 语句, validate_password 根据当前密码策略检查密码, 如果密码较弱则拒绝该密码 (该语句返回 ER_NOT_VALID_PASSWORD 错误). 适用于 ALTER USER, CREATE USER 和 SET PASSWORD 语句

对于 CREATE USER 语句, validate_password 要求提供密码, 并且满足密码策略. 即使账号最初被锁定也是如此, 否则稍后解锁账号将导致它在没有满足策略的密码的情况下变得可访问

validate_password 实现了一个
VALIDATE_PASSWORD_STRENGTH() SQL 函数来评估潜在密码的强度. 该函数接受一个密码参数并返回一个从 0 (弱)到 100 (强)的整数

-- 安装 validate_password组件
INSTALL COMPONENT 'file://component_validate_password'; 
-- 查看 validate_password组件
SELECT * FROM mysql.component;
-- 卸载 validate_password组件
uninstall COMPONENT 'file://component_validate_password'; 

-- 安装 validate_password 组件组件后创建简单密码的用户会报以下错误
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

-- 使用 VALIDATE_PASSWORD_STRENGTH() 函数评估密码强度
select VALIDATE_PASSWORD_STRENGTH('abc');

-- validate_password 相关参数如下
mysql> SHOW VARIABLES LIKE 'validate_password.%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| 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 |
+--------------------------------------+--------+

其中 validate_password.policy 设置密码检查规则, 分为 LOW, MEDIUM 和 STRONG:

LOW 只检查密码长度, 要求密码长度至少为 validate_password.length 默认是8

MEDIUM 策略添加了密码必须至少包含
validate_password.number_count (默认1) 个数字字符, validate_password.mixed_case_count (默认1) 个小写字符, validate_password.mixed_case_count (默认1)个大写字符和 validate_password.special_char_count (默认1) 个特殊(非字母数字)字符的条件

STRONG 策略添加了长度为 4 或更长的密码子字符串不能与字典文件中的单词匹配的条件(如果已指定). 要指定字典文件,请修改
validate_password.dictionary_file

validate_password.check_user_name 默认为 ON, 会拒绝密码为当前用户名的一部分, 无论是正向或反向

例: create user ‘test_com’@‘abc’ identified by ‘moc@ABC@123’;

ERROR 1396 (HY000): Operation CREATE USER failed for ‘test_com’@‘abc’

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL使用SHA-256算法进行密码哈希。要创建一个MySQL SHA-256密码文件,可以按照以下步骤进行操作: 1. 创建一个文本文件,例如`passwords.txt`,每行包含一个明文密码。 2. 使用特定的工具或脚本来生成SHA-256哈希值并将其保存在另一个文本文件中。可以使用Python的`hashlib`模块来生成SHA-256哈希值。 下面是一个示例代码: ```python import hashlib def generate_sha256_hash(password): sha256_hash = hashlib.sha256(password.encode()).hexdigest() return sha256_hash # 读取明文密码文件 with open('passwords.txt', 'r') as file: passwords = file.readlines() # 生成SHA-256哈希并保存到文件 with open('hashed_passwords.txt', 'w') as file: for password in passwords: hashed_password = generate_sha256_hash(password.strip()) file.write(hashed_password + '\n') ``` 在上述代码中,明文密码文件`passwords.txt`包含了要加密的密码列表。生成的SHA-256哈希将保存在`hashed_passwords.txt`文件中。 3. 将生成的哈希密码文件(`hashed_passwords.txt`)用作MySQL密码文件。可以在MySQL的配置文件中(如my.cnf或my.ini)指定密码文件的路径,或者在启动MySQL时使用`--init-file`参数指定密码文件的路径。 ```bash $ mysql --init-file=/path/to/hashed_passwords.txt ``` 请注意,使用密码文件进行身份验证时,需要确保密码文件的权限受到适当的保护,只有授权的用户可以访问该文件。 这样,你就可以使用SHA-256哈希密码文件进行MySQL身份验证了。请注意,在实际使用中,请采取适当的安全措施来保护密码文件和数据库的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺浦力特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值