一 密码管理
#查看密码管理策略
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 #限制重试时间,此处为毫秒,注意按需求换算
总结:
本篇文章主要介绍了关于数据库密码的两项安全策略,密码复杂度加上密码过期策略,多一份策略多一份安心。要记住:安全无小事。
评论