首页 > 数据库 >MySQL如何查看/监控/处理账号密码过期问题

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

时间:2024-03-01 16:04:09浏览次数:19  
标签:过期 mysql 密码 MySQL lifetime password 账号密码

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;

或者使用下面优化调整过的SQL

--如果使用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;

监控账号密码过期

监控账号密码过期,我们可以使用python脚本监控MySQL账号密码过期问题,如果密码小于N(N可以是30,60)天即将过期,那么发出下面告警邮件:

处理即将密码过期账号

对于即将过期的账号密码,分两种情况:

1:password_lifetime为null,default_password_lifetime不为null的情况,重置密码后,它的过期期限变为default_password_lifetime的值。

mysql> alter user zbx_monitor@'localhost' identified by "*******";
Query OK, 0 rows affected (0.04 sec)

2:password_lifetime不为null的情况(手工设置密码过期期限的情况),那么你可以有以下几种方式来处理

mysql> alter user test@'%' identified by "******";
Query OK, 0 rows affected (0.01 sec)

此时password_lifetime会变为之前指定的过期期限,当然,你也可以在修改账号密码时指定过期期限。

#不修改账号密码

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)

账号密码过期后,依然能连接上MySQL,但是此时做任何操操作都会报ERROR 1820(HY000)错误,如下所示:

mysql> select * from dual;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> 

从 MySQL 8.0.14 开始,允许用户帐户拥有双重密码,指定为主密码和辅助密码。双密码功能可以在以下场景中无缝执行凭据更改:

  • 一个系统有大量的MySQL服务器,可能涉及复制。

  • 多个应用程序连接到不同的 MySQL 服务器。

  • 必须对应用程序用来连接服务器的一个或多个帐户定期更改凭据。

DBA如果经历过的,也许都知道有时候修改数据库账号密码是比较麻烦的事情,系统开发人员或系统Support人员会觉得比较麻烦,因为对于复杂系统,一不小心,账号密码配置出了差错或纰漏,可能会导致生产事故,另外,修改账号密码也会影响系统业务的可用性(可能需要短暂的停止应用系统服务...),所以对于定期修改账号密码,很多时候是名存实亡。因此要么不会修改数据库账号密码,要么按规范定期修改账号密码,也是使用相同的账号密码,并不会修改账户密码。

如果使用双密码,就可以更轻松地分阶段修改密码,无需密切合作,也无需停机。确实是一个很了不起的创新。其他数据库暂时还没有这种特性。

#建立新的主密码,保留当前密码作为辅助密码

ALTER USER 'test'@'%' IDENTIFIED BY '****' RETAIN CURRENT PASSWORD;

#等到应用程序切换密码后,丢弃旧密码(辅助密码)

ALTER USER 'test'@'%' DISCARD OLD PASSWORD;

标签:过期,mysql,密码,MySQL,lifetime,password,账号密码
From: https://www.cnblogs.com/kerrycode/p/18039469

相关文章

  • 数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性​!
    体验地址:https://developer.aliyun.com/topic/march/polardbserverless本次基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDBMySQLServerless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果,压测环境可开......
  • mysql8的sql_mode不起作用
    如果sql_mode似乎没有起作用,可能是由以下几个原因造成的:配置文件位置不正确:确保my.ini文件位于MySQL服务器实际读取配置的位置。对于Windows系统,这通常是MySQL安装目录下的bin文件夹。对于Linux系统,它可能位于/etc/mysql/、/etc/my.cnf或~/.my.cnf等位置。MySQL服务未重启:对......
  • MySQL 事务
    MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。事务处......
  • MySQL ALTER命令
    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQLALTER命令。开始本章教程前让我们先创建一张表,表名为:testalter_tbl。root@host#mysql-uroot-ppassword;Enterpassword:mysql>useW3CSCHOOL;Databasechangedmysql>createtabletestalter_tbl->......
  • MySQL 索引
    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索......
  • MySQL 及 SQL 注入
    如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执......
  • Linux openEuler 安装 MySQL
    更新记录点击查看2024年3月1日更新常见问题。2024年2月29日发布。安装需要使用到的命令和包如果有就不用安装了。yum-yinstalltaryum-yinstallvimyum-yinstallnet-toolsyum-yinstalllibncurses*下载MySQL的安装包官网地址:https://downloads.mysql.......
  • 数智融合,华为云GaussDB(for MySQL)助力企业释放数据新价值
    2024年2月27日,在“2024年世界移动通信大会”(MobileWorldCongress2024,简称MWC2024)上,以“云原生×AI,跃迁新机遇”为主题的创原会圆桌成功举办。会上,全球企业技术精英面对面交流,围绕云原生×AI技术变革,分享企业在架构、算力、存储、数智、应用开发、媒体技术、安全体系方面的七......
  • 亿级电商流量,高并发下Redis与MySQL的数据一致性如何保证
    前言:只要使用到缓存,无论是本地缓存还是使用Redis做缓存,那么就会存在数据同步不一致的问题。先读取缓存,缓存数据有,则立即返回结果如果缓存中没有数据,则从数据库中读取数据把读取到的数据同步到缓存中,提供下次读请求返回数据这样的作法是大多数人使用缓存的方式,这样能......
  • mac使用iterm2远程链接服务器,记住账号密码
     1、下载并安装iterm2https://iterm2.com 2、在电脑中创建任意文件夹来保存连接服务器需要的脚本文件我是在“文稿“下面创建了一个“iterm2ssh”文件 3、创建远程链接使用的sh脚本文件“xx.sh” 4、在sh文件中写入内容,格式如下:setuser服务器账号sethost......