|
MySQL 8.0.x中,我们如果按安全规范配置了账号密码过期策略的话,那么如何查看账号密码还有多长时间就会过期;如何做好账号密码过期监控;以及提前及时处理账号密码过期问题就是DBA必须处理的一些事情。这里简单讨论一下这些事情。个人经验仅供参考,如有不足或错误的地方,敬请指正一二。这篇文章的具体测试环境为MySQL 8.0.35.
设置账号密码过期
一般系统变量default_password_lifetime控制着全局范围的账号密码过期时间。- mysql> show variables like 'default_password_lifetime';
- +---------------------------+-------+
- | Variable_name | Value |
- +---------------------------+-------+
- | default_password_lifetime | 180 |
- +---------------------------+-------+
- 1 row in set (0.02 sec)
- mysql>
复制代码 这个系统系统变量可以在my.cnf中设置。也可以在MySQL运行时设置并持久化。- SET PERSIST default_password_lifetime = 365;
复制代码 你创建账号时可以指定账号密码过期使用默认的全局策略,也可以不指定,它也会使用全局的密码过期策略,如下所示, 下面两个SQL其实是等价的。- create user test2@'%' identified by random password ;
- create user test2@'%' identified by random password password expire default;
复制代码 另外,你也可以在创建账号时设置账号密码过期时间,如下所示,那么此过期时间会覆盖系统变量default_password_lifetime的值(优先级高于全局变量)。这个值也会记录到系统表mysql.user中password_lifetime中,如果创建用户时没有指定账号密码过期期限,而是使用全局策略,那么此时password_lifetime的值为NULL。- CREATE USER 'test'@'%' IDENTIFIED BY RANDOM PASSWORD PASSWORD EXPIRE INTERVAL 20 DAY;
复制代码 手动设置账号密码过期
我们也可以手工设置账号密码过期,如下所示:- ALTER USER 'USER_NAME'@'HOSTNAME' PASSWORD EXPIRE;
- ALTER USER 'USER_NAME'@'HOSTNAME' PASSWORD EXPIRE INTERVAL 90 DAY;
复制代码 如果手工将一个账号手工设置为账号密码过期,那么系统表mysql.user中的password_expired会变为Y,而密码全局过期策略下过期的账号的字段password_expired则永远为N。这些细节不知你有没有注意过。
查询账号密码过期期限
根据MySQL密码过期策略,密码过期是自动的,并基于密码期限,对于给定帐户,密码期限是从其最近一次密码更改的日期和时间开始评估的。系统表为每个帐户指示上次更改其密码的时间(mysql.user表的password_last_changed字段值),如果密码的期限大于其允许的生存期,服务器会自动将密码视为在客户端连接时已过期。这适用于没有明确的手动设置密码过期的账户。
查看数据库中账号密码还有多久即将过期,可以使用下面这个SQL:- select user
- , host
- , plugin
- , password_expired
- , password_last_changed
- , if(ifnull(password_lifetime, CAST(@@default_password_lifetime as signed))<1,'NEVER',
- concat(
- cast( ifnull(password_lifetime, @@default_password_lifetime) as signed)
- + cast(datediff(password_last_changed, now()) as signed), " days")) as
- days_till_expires
- from mysql.user;
复制代码 此时password_lifetime会变为之前指定的过期期限,当然,你也可以在修改账号密码时指定过期期限。
#不修改账号密码- --如果使用ALTER USER 'test'@'%' PASSWORD EXPIRE命令使账号密码过期,但是days_till_expires依然显示账号密码还有N天才过期。
- select user
- , host
- , plugin
- , password_expired
- , password_last_changed
- , if(password_expired='Y','password_expired',
- if(ifnull(password_lifetime, CAST(@@default_password_lifetime as signed))<1,'NEVER',
- concat(
- cast( ifnull(password_lifetime, @@default_password_lifetime) as signed)
- + cast(datediff(password_last_changed, now()) as signed), " days")))
- as days_till_expires
- from mysql.user;
复制代码 #修改账号密码- mysql> alter user zbx_monitor@'localhost' identified by "*******";
- Query OK, 0 rows affected (0.04 sec)
复制代码 账号密码过期后,依然能连接上MySQL,但是此时做任何操操作都会报ERROR 1820(HY000)错误,如下所示:- mysql> alter user test@'%' identified by "******";
- Query OK, 0 rows affected (0.01 sec)
复制代码 从 MySQL 8.0.14 开始,允许用户帐户拥有双重密码,指定为主密码和辅助密码。双密码功能可以在以下场景中无缝执行凭据更改:
- 一个系统有大量的MySQL服务器,可能涉及复制。
- 多个应用程序连接到不同的 MySQL 服务器。
- 必须对应用程序用来连接服务器的一个或多个帐户定期更改凭据。
DBA如果经历过的,也许都知道有时候修改数据库账号密码是比较麻烦的事情,系统开发人员或系统Support人员会觉得比较麻烦,因为对于复杂系统,一不小心,账号密码配置出了差错或纰漏,可能会导致生产事故,另外,修改账号密码也会影响系统业务的可用性(可能需要短暂的停止应用系统服务...),所以对于定期修改账号密码,很多时候是名存实亡。因此要么不会修改数据库账号密码,要么按规范定期修改账号密码,也是使用相同的账号密码,并不会修改账户密码。
如果使用双密码,就可以更轻松地分阶段修改密码,无需密切合作,也无需停机。确实是一个很了不起的创新。其他数据库暂时还没有这种特性。
#建立新的主密码,保留当前密码作为辅助密码- mysql> alter user test@'%' password expire interval 180 day;
- Query OK, 0 rows affected (0.01 sec)
复制代码 #等到应用程序切换密码后,丢弃旧密码(辅助密码)- mysql> alter user test@'%' identified by "******" password expire interval 190 day;
- Query OK, 0 rows affected (0.06 sec)
复制代码 扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/18039469
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|