mysql口令更换周期_MySQL密码过期策略介绍

上一篇文章我们介绍了如何设置Mysql的密码复杂度,其实除了设置密码复杂度策略外,我们还可以设置密码自动过期,比如说隔 90 天密码会过期必须修改密码后才能继续使用,这样我们的数据库账号就更加安全了。下面来看下怎样设置密码自动过期。

单独设置某个账号密码过期时间

使单个账号密码过期我们可以使用 ALTER USER 语句,也可以更改账号过期时间。# 通过 mysql.user 系统表查看数据库账号状态

mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;

+------------------+-----------+------------------+-------------------+-----------------------+----------------+| user             | host      | password_expired | password_lifetime | password_last_changed | account_locked |

+------------------+-----------+------------------+-------------------+-----------------------+----------------+| expuser          | %         | N                |              NULL | 2021-01-05 14:30:30   | N              |

| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |

| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              |

| mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              |

+------------------+-----------+------------------+-------------------+-----------------------+----------------+7 rows in set (0.01 sec)

# 使 expuser 账号密码立即过期

mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE;

Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;

+------------------+-----------+------------------+-------------------+-----------------------+----------------+| user             | host      | password_expired | password_lifetime | password_last_changed | account_locked |

+------------------+-----------+------------------+-------------------+-----------------------+----------------+| expuser          | %         | Y                |              NULL | 2021-01-05 14:30:30   | N              |

| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |

| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              |

| mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              |

+------------------+-----------+------------------+-------------------+-----------------------+----------------+7 rows in set (0.00 sec)

# 修改账号密码永不过期

mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE NEVER;

Query OK, 0 rows affected (0.01 sec)

# 单独设置该账号密码90天过期

mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;

Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user;

+------------------+-----------+------------------+-------------------+-----------------------+----------------+| user             | host      | password_expired | password_lifetime | password_last_changed | account_locked |

+------------------+-----------+------------------+-------------------+-----------------------+----------------+| expuser          | %         | N                |                90 | 2021-01-05 14:41:28   | N              |

| root             | %         | N                |              NULL | 2020-10-30 14:45:43   | N              |

| testuser         | %         | N                |              NULL | 2021-01-04 17:22:37   | N              |

| mysql.infoschema | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| mysql.session    | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| mysql.sys        | localhost | N                |              NULL | 2020-10-30 14:37:09   | Y              |

| root             | localhost | N                |              NULL | 2020-10-30 14:38:55   | N              |

+------------------+-----------+------------------+-------------------+-----------------------+----------------+7 rows in set (0.00 sec)

# 让此账号使用默认的密码过期全局策略

mysql> ALTER USER 'expuser'@'%' PASSWORD EXPIRE DEFAULT;

Query OK, 0 rows affected (0.01 sec)

每个账号的相关信息在mysql.user 系统表都有记录,当 password_expired 字段值为 Y 时,代表此密码已过期,使用过期密码仍可以登录,但不能进行任何操作,进行操作会提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. 必须更改密码后才能进行正常操作。

对给定过期时间的账号来说,比如说设置 90 天过期,数据库系统会将当前时间与上次修改密码的时间差值作比较,如果距上次修改密码时间超过 90 天,则将此账号密码标记为过期,就必须要更改密码后才能操作。

设置全局过期策略

构建全局密码自动过期策略,我们要使用 default_password_lifetime 系统变量。在 5.7.11 版本之前,默认的 default_password_lifetime 值为 360,之后的版本默认值为 0,表示密码不会过期。此参数的单位是天,比如可以将此参数设置为 90 ,则表示全局密码自动过期策略是 90 天。# 设置全局过期策略 先手动更改再加入配置文件

mysql> SET GLOBAL default_password_lifetime = 90;

Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'default_password_lifetime';

+---------------------------+-------+| Variable_name             | Value |

+---------------------------+-------+| default_password_lifetime | 90    |

+---------------------------+-------+1 row in set (0.00 sec)

# 写入配置文件使得重启生效

[mysqld]

default_password_lifetime = 90

虽然可以通过将过期的密码设置为当前值来“重置”它,但出于良好的 Policy 考虑,我们最好选择其他密码。

总结:

本篇文章主要介绍了关于数据库密码的安全策略,上一篇是密码复杂度,本篇为密码过期策略,多一份策略多一份安心。要记住:安全无小事。

### 解决MySQL和Oracle数据库密码过期无法登录的问题 #### MySQL 密码重置流程 对于MySQL数据库,当遇到`Access denied for user 'root'@'localhost' (using password: YES)`这样的错误消息时,表明当前使用的用户名或密码不匹配。如果忘记了密码,则需按照特定过程来恢复访问权限。 - **停止服务并启动跳过授权表模式** 为了绕过现有认证机制以便更改凭证信息,可以先关闭正在运行的服务实例,并通过命令行参数让服务器忽略权限验证: ```bash sudo systemctl stop mysql.service sudo mysqld_safe --skip-grant-tables & ``` 上述操作使得管理员能够在无需提供有效凭据的情况下连接到实例[^1]。 - **更新用户账户设置** 一旦以这种方式进入了系统内部环境之后,就可以利用SQL语句直接编辑存储于`mysql.user`中的记录项了;具体来说就是针对目标身份(比如这里的超级管理角色——Root),将其对应的散列值字段清空或者替换成新的明文字符串形式表示的新密钥: ```sql FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword!'; ``` 完成这一步骤后记得重启守护进程恢复正常运作状态,从而确保后续正常的身份校验逻辑得以生效。 #### Oracle 数据库应对策略 而在面对Oracle产品线下的同类状况时,解决方案同样依赖于本地控制台工具SqlPlus来进行交互式修复工作。假设已知原有口令但由于时效限制而被锁定的话,那么可以通过下面几个动作快速解锁受影响的对象并且延长其生命周期: - **切换至DBA特权上下文中** 借助内置的sysdba角色获得最高级别的操控能力,这对于执行涉及安全配置变更的任务至关重要: ```bash sqlplus / as sysdba ``` 此指令允许使用者不必指定具体的UID/PWD组合就能顺利接入核心管理层级[^3]。 - **调整个人资料文件里的寿命属性** 接着便是定位到引起超限现象的具体规则集之上,通常默认情况下这些设定会被定义在一个叫做default profile的地方。因此只需简单地把对应条目的取值范围扩大即可解决问题根源所在之处: ```sql ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; ``` 最后别忘了为涉事主体分配一个新的随机数串作为临时过渡方案直至正式确立长期有效的保护措施为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值