一 密码管理

#查看密码管理策略
mysql> show variables like 'password%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| password_history         | 0     |
| password_require_current | OFF   |
| password_reuse_interval  | 0     |
+--------------------------+-------+
3 rows in set (0.00 sec)

password_history = 3 新密码不能和前面三次的密码相同
password_require_current = off 默认为off,开启后,修改密码需要用户提供当前密码
password_reuse_interval = 90 新密码不能和前面90内使用的密码相同


# 查看当前的默认密码有效期,默认是0,永不过期
SHOW VARIABLES LIKE 'default_password_lifetime';

#设置默认密码有效期为90天
SET GLOBAL default_password_lifetime = 90;

#将用户的密码设置为立即过期
ALTER USER 'username'@'host' PASSWORD EXPIRE;

#将用户的密码设置为在指定天数后过期
ALTER USER 'username'@'host' PASSWORD EXPIRE INTERVAL 30 DAY;

#查看所有用户的密码过期状态
SELECT User, Host, password_last_changed, password_lifetime, account_locked
FROM mysql.user;
password_last_changed:显示用户上次更改密码的时间。
password_lifetime:显示用户的密码有效期(以天为单位)。
account_locked:显示账户是否被锁定。

#将用户的密码设置为已过期,强制用户修改密码
ALTER USER 'username'@'host' PASSWORD EXPIRE NOW;

#查看当前的密码过期警告天数
SHOW VARIABLES LIKE 'password_expiration_warning_days';

#设置密码过期前7天开始警告
SET GLOBAL password_expiration_warning_days = 7;

在写这个密码管理的时候,我想起了我领导干的一件蠢事。当时为了应对等保测评,我们给 Oracle 设置一些密码过期的参数,事后就忘记这件事了,有一天发现客户端登陆不上,但是应用系统还是正常的,因为是旧的连接,但新连接肯定就不行了。你猜猜看,我领导干了什么蠢事。他居然在业务高峰期修改密码,因为新密码不能跟上一次密码一样,所以他改了新密码之后又改回旧密码。然后系统就炸了,这操作太骚了,这种业务高峰期,应该先延长密码的有限期才对。

二 密码安全策略

密码策略指的是一些密码复杂度,mysql 自带 validate_password 插件, 默认下是没有安装的。

install plugin validate_password soname 'validate_password.so';

select plugin_name, plugin_status from information_schema.plugins where plugin_name='validate_password'   

show variables like 'validate%';
+--------------------------------------+--------+
| 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      |
+--------------------------------------+--------+

1、validate_password_policy
代表的密码策略,默认是MEDIUM 可配置的值有以下:
0 or LOW 仅需需符合密码长度(由参数validate_password_length指定)
1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中

2、validate_password_dictionary_file
用于配置密码的字典文件,当validate_password_policy设置为STRONG时可以配置密码字典文件,字典文件中存在的密码不得使用。

3、validate_password_length
用来设置密码的最小长度,默认值是8

4、validate_password_mixed_case_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少同时拥有的小写和大写字母的数量,默认是1最小是0;默认是至少拥有一个小写和一个大写字母。

5、validate_password_number_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的数字的个数,默认1最小是0

6、validate_password_special_char_count
当validate_password_policy设置为MEDIUM或者STRONG时,密码中至少拥有的特殊字符的个数,默认1最小是0

7、validate_password_check_user_name 
可以防止用户名作为密码进行登录,提高密码安全性

# 若想永久生效,建议将以下参数写入配置文件
[mysqld]
plugin-load = validate_password.so
validate_password_length = 10
validate_password_policy = 1
validate-password = FORCE_PLUS_PERMANENT

锁用户

install plugin CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';

vim /etc/my.cnf
connection-control-failed-connections-threshold=5   #登陆失败次数限制
connection-control-min-connection-delay=1800000    #限制重试时间,此处为毫秒,注意按需求换算

总结:

本篇文章主要介绍了关于数据库密码的两项安全策略,密码复杂度加上密码过期策略,多一份策略多一份安心。要记住:安全无小事。