一、 密码强度管理

在5.7版本中,如果用户密码过于简单,可能会收到以下报错:

GRANT REPLICATION CLIENT ON *.*TO 'username'@'%' IDENTIFIED BY ‘xxxxxxxx’;
ERROR 1819 (HY000): Your password does notsatisfy the current policy requirements

这个报错与validate_password_policy参数的值有关。默认是1  :符合长度,且必须含有数字、大小写字母,特殊字符。

取值

含义

0 or LOW

Length

1 or MEDIUM

Length; numeric, lowercase/uppercase, and special characters

2 or STRONG

Length; numeric, lowercase/uppercase, and special characters; dictionary file

如果不想密码很复杂,可以修改:

set global validate_password_policy=0;
GRANT REPLICATION CLIENT ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'xxxxxxxx';
Query OK, 0 rows affected, 1 warning (0.02sec)

更改密码最小长度为4

set global validate_password_length=4;
Query OK, 0 rows affected (0.00 sec)

查看其他相关参数

SHOW VARIABLES LIKE 'validate_password%';

二、 密码过期策略

1. 5.6.6版本起

添加了password_expired功能,允许设置用户密码过期。

ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE;

这个特性已经添加到mysql.user数据表,它的默认值是”N”,可以使用ALTER USER语句来修改。

一旦某个用户的这个选项设置为”Y”,那么这个用户还是可以登陆到MySQL服务器,但是在用户未设置新密码之前不能运行任何查询语句,否则会得到如下报错:

SHOW DATABASES;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement

解除过期状态:用户或管理员重设密码

alter user mdba@localhost identified by 'Aisino123!';
flush privileges;

2. 5.7.4版本起

可以通过全局变量default_password_lifetime来设置全局的密码过期的策略

  • 在5.7.4 ~ 5.7.10版本中,default_password_lifetime默认值是360
  • 在5.7.11以后,mysqldefault_password_lifetime默认值是0

my.cnf配置如下:

[mysqld]
default_password_lifetime=90

在MySQL运行时可以使用超级权限修改此配置:

SET GLOBAL default_password_lifetime = 90;

还可以使用ALTER USER命令为每个用户单独设置特定的值,它会自动覆盖密码过期的全局策略(注意ALTER USER语句INTERVAL的单位是 天)

-- 设置'testuser'@'localhost'用户密码30天过期
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY;
-- 设置'testuser'@'localhost'用户密码不过期
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE NEVER;
-- 设置'testuser'@'localhost'用户使用全局密码过期策略
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE DEFAULT;

三、 用户锁定与解锁

5.7.8版开始,添加了锁定/解锁用户的新特性

ALTER USER 'furrywall'@'localhost' ACCOUNT LOCK;
ALTER USER 'furrywall'@'localhost' ACCOUNT UNLOCK;
-- 验证
select user,host,account_locked from mysql.user;