翼度科技»论坛 编程开发 mysql 查看内容

MySQL如何查看/监控/处理账号密码过期问题

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
MySQL 8.0.x中,我们如果按安全规范配置了账号密码过期策略的话,那么如何查看账号密码还有多长时间就会过期;如何做好账号密码过期监控;以及提前及时处理账号密码过期问题就是DBA必须处理的一些事情。这里简单讨论一下这些事情。个人经验仅供参考,如有不足或错误的地方,敬请指正一二。这篇文章的具体测试环境为MySQL 8.0.35.
设置账号密码过期

一般系统变量default_password_lifetime控制着全局范围的账号密码过期时间。
  1. mysql> show variables like 'default_password_lifetime';
  2. +---------------------------+-------+
  3. | Variable_name             | Value |
  4. +---------------------------+-------+
  5. | default_password_lifetime | 180   |
  6. +---------------------------+-------+
  7. 1 row in set (0.02 sec)

  8. mysql> 
复制代码
这个系统系统变量可以在my.cnf中设置。也可以在MySQL运行时设置并持久化。
  1. SET PERSIST default_password_lifetime = 365;
复制代码
你创建账号时可以指定账号密码过期使用默认的全局策略,也可以不指定,它也会使用全局的密码过期策略,如下所示, 下面两个SQL其实是等价的。
  1. create user test2@'%' identified by random password ;
  2. create user test2@'%' identified by random password password expire default;
复制代码
另外,你也可以在创建账号时设置账号密码过期时间,如下所示,那么此过期时间会覆盖系统变量default_password_lifetime的值(优先级高于全局变量)。这个值也会记录到系统表mysql.user中password_lifetime中,如果创建用户时没有指定账号密码过期期限,而是使用全局策略,那么此时password_lifetime的值为NULL。
  1. CREATE USER 'test'@'%' IDENTIFIED BY RANDOM PASSWORD PASSWORD EXPIRE INTERVAL 20 DAY;
复制代码
手动设置账号密码过期

我们也可以手工设置账号密码过期,如下所示:
  1. ALTER USER 'USER_NAME'@'HOSTNAME' PASSWORD EXPIRE;
  2. 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:
  1. select user
  2.      , host
  3.      , plugin
  4.      , password_expired
  5.      , password_last_changed
  6.      , if(ifnull(password_lifetime, CAST(@@default_password_lifetime as signed))<1,'NEVER',
  7.        concat(
  8.             cast(   ifnull(password_lifetime, @@default_password_lifetime) as signed)
  9.           + cast(datediff(password_last_changed, now()) as signed), " days")) as 
  10.        days_till_expires
  11. from mysql.user;
复制代码
此时password_lifetime会变为之前指定的过期期限,当然,你也可以在修改账号密码时指定过期期限。
#不修改账号密码
  1. --如果使用ALTER USER 'test'@'%' PASSWORD EXPIRE命令使账号密码过期,但是days_till_expires依然显示账号密码还有N天才过期。
  2. select user
  3.      , host
  4.      , plugin
  5.      , password_expired
  6.      , password_last_changed
  7.      , if(password_expired='Y','password_expired',
  8.           if(ifnull(password_lifetime, CAST(@@default_password_lifetime as signed))<1,'NEVER',
  9.           concat(
  10.                cast(   ifnull(password_lifetime, @@default_password_lifetime) as signed)
  11.              + cast(datediff(password_last_changed, now()) as signed), " days")))  
  12.        as days_till_expires
  13. from mysql.user;
复制代码
#修改账号密码
  1. mysql> alter user zbx_monitor@'localhost' identified by "*******";
  2. Query OK, 0 rows affected (0.04 sec)
复制代码
账号密码过期后,依然能连接上MySQL,但是此时做任何操操作都会报ERROR 1820(HY000)错误,如下所示:
  1. mysql> alter user test@'%' identified by "******";
  2. Query OK, 0 rows affected (0.01 sec)
复制代码
从 MySQL 8.0.14 开始,允许用户帐户拥有双重密码,指定为主密码和辅助密码。双密码功能可以在以下场景中无缝执行凭据更改:

  • 一个系统有大量的MySQL服务器,可能涉及复制。
  • 多个应用程序连接到不同的 MySQL 服务器。
  • 必须对应用程序用来连接服务器的一个或多个帐户定期更改凭据。
DBA如果经历过的,也许都知道有时候修改数据库账号密码是比较麻烦的事情,系统开发人员或系统Support人员会觉得比较麻烦,因为对于复杂系统,一不小心,账号密码配置出了差错或纰漏,可能会导致生产事故,另外,修改账号密码也会影响系统业务的可用性(可能需要短暂的停止应用系统服务...),所以对于定期修改账号密码,很多时候是名存实亡。因此要么不会修改数据库账号密码,要么按规范定期修改账号密码,也是使用相同的账号密码,并不会修改账户密码。
如果使用双密码,就可以更轻松地分阶段修改密码,无需密切合作,也无需停机。确实是一个很了不起的创新。其他数据库暂时还没有这种特性。
#建立新的主密码,保留当前密码作为辅助密码
  1. mysql> alter user test@'%'  password expire interval 180 day;
  2. Query OK, 0 rows affected (0.01 sec)
复制代码
#等到应用程序切换密码后,丢弃旧密码(辅助密码)
  1. mysql> alter user test@'%' identified by "******" password expire interval 190 day;
  2. Query OK, 0 rows affected (0.06 sec)
复制代码
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:https://www.cnblogs.com/kerrycode/p/18039469
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具