从MySQL 8.0开始,安全策略有了重大加强,采用了新的密码插件,增加历史密码限制、双密码、密码强度约束等新特性。
从MySQL 8.0开始,安全策略有了重大加强。
对我们影响最直接的是,从MySQL 8.0里将caching_sha2_password作为默认的身份验证插件,而不再使用mysql_native_password插件。这时候如果再用旧版本客户端或协议连接,就会报告下面的错误:
$ mysql -uyejr -p
Enter password:
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found
临时解决方案是将该账号密码插件改回mysql_native_password即可,或者修改全局参数:
#my.cnf
[mysqld]
default_authentication_plugin = mysql_native_password
不过,还是强烈建议采用新的插件,因为它更安全,性能也更高。
其他的几个新密码策略主要有:
支持密码过期策略,需要周期性修改密码
增加历史密码检测机制,防止总是几个密码反复重用
需要提供旧密码才能修改新密码,防止被篡改
支持双密码机制,可以选择采用主密码还是第二密码连接,安全性更高
增加密码强度约束,避免使用弱密码
下面我挑几个重点的来说下吧。
1、设置账号密码过期策略,要求定期修改密码
例如设置规则:密码默认42天过期(在美上市公司要求的SOX 404法案规则)
#my.cnf
[mysqld]
default_password_lifetime=42
当然了,也可以单独设置某个账户永不过期
[[email protected]]> ALTER USER yejr PASSWORD EXPIRE NEVER;
当密码过期后,该账户连接登入后,就会提示下面的告警:
[[email protected]]> \s
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
这时候,可以自己动手修改密码,例如:
[[email protected]]> alter user yejr@'%' IDENTIFIED WITH
caching_sha2_password BY 'abcd';
这时候,为了防止使用弱密码或重用历史密码,就可以设置更严格的密码策略了。
2、设置历史密码检测机制,防止反复重用旧密码
例如设置规则:存储5个历史密码,且在180天内不能重复使用这些旧密码
#my.cnf
[mysqld]
#存储最近的6次密码
password_history=6
#最近6次密码1年内不得重用
password_reuse_interval=365
这时如果修改密码使用了最近一年内用过的历史密码,则会报告下面的错误:[[email protected]]> alter user yejr identified with
caching_sha2_password by 'abcd';
ERROR 3638 (HY000): Cannot use these credentials for 'yejr@%' because they contradict the password history policy
3、启用双密码机制
上面提到,在美上市公司要求每42天修改一次密码,这种情况下,可能我们会非常担心有某些地方忘了修改,从而没有很好的执行这个政策。
有了双密码机制后,就可以放心的修改密码了,因为相当于新旧密码都可以同时使用,那么可以留有一定的缓冲时间进行检查确认了,防止有些地方漏了修改。
可以执行下面这样的命令使用双密码:
[[email protected]]> alter user yejr@'%' IDENTIFIED WITH
caching_sha2_password BY 'new-abc' RETAIN CURRENT PASSWORD;
最后建议大家早日升级到最好用的MySQL 8.0版本,享受新特性,以及更好的性能。
enjoy MySQL 8.0。