Py学习  »  DATABASE

更安全的MySQL 8.0之全新密码策略

老叶茶馆 • 4 年前 • 223 次点击  

导读

从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

当然了,也可以单独设置某个账户永不过期

[mysql@yejr.me]> ALTER USER yejr PASSWORD EXPIRE NEVER;

当密码过期后,该账户连接登入后,就会提示下面的告警:

[mysql@yejr.me]> \s
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

这时候,可以自己动手修改密码,例如:

[mysql@yejr.me]> 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

这时如果修改密码使用了最近一年内用过的历史密码,则会报告下面的错误:
[mysql@yejr.me]> 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天修改一次密码,这种情况下,可能我们会非常担心有某些地方忘了修改,从而没有很好的执行这个政策。
有了双密码机制后,就可以放心的修改密码了,因为相当于新旧密码都可以同时使用,那么可以留有一定的缓冲时间进行检查确认了,防止有些地方漏了修改。
可以执行下面这样的命令使用双密码:

[mysql@yejr.me]> alter user yejr@'%' IDENTIFIED WITH
caching_sha2_password BY 'new-abc' RETAIN CURRENT PASSWORD;

最后建议大家早日升级到最好用的MySQL 8.0版本,享受新特性,以及更好的性能。


enjoy MySQL 8.0。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32420
 
223 次点击