密码到期导致ssh连接失败
背景:ssh连接失败定位
查看ssh服务状态: systemctl status sshd
相关提示:pam_unix(sshd:account): expired password for user systest (password aged)
根本原因
Linux 系统对用户密码有有效期策略。用户 systest 的密码使用时间已经超过了这个策略规定的最大天数,因此系统自动令其失效。
当前状态
用户 systest 的账户仍然存在,但它的密码已经无效。用户无法使用此密码通过任何方式(SSH、本地登录等)登录系统。
触发场景
当用户 systest 尝试通过 SSH 登录时,系统在检查账户阶段发现了这个问题,于是拒绝登录并记录下了这条日志。
解决方案
方法一:管理员直接为用户设置新密码
-
管理员使用 root 或有 sudo 权限的账户登录服务器。
-
运行以下命令为 systest 用户设置新密码:
sudo passwd systest
-
根据提示输入两次新密码。
-
设置成功后,密码的有效期计时会重置。用户 systest 就可以立即使用新密码登录了。
方法二:检查并修改密码策略
-
查看特定用户的密码过期信息:
sudo chage -l systest
输出会显示密码最后修改日期、密码过期日期、密码最长有效天数等信息。
输出示例:Last password change : May 10, 2024 Password expires : Aug 08, 2024 <-- 密码过期日 Password inactive : never <-- 密码过期后宽限几天失效 Account expires : never <-- 账户本身过期日 Minimum number of days between password change : 0 <-- 密码更改最小间隔 Maximum number of days between password change : 90 <-- 密码有效最大天数 Number of days of warning before password expires : 7 <-- 密码过期前警告天数
-
修改密码策略(如果需要):
第一种:修改 systest 用户的密码过期策略,例如设置密码永不过期(慎用,降低安全性):
sudo chage -M 99999 systest
第二种:或者修改全局密码策略文件 /etc/login.defs 中的 PASS_MAX_DAYS 参数。
使用 cat 查看整个文件,然后找到相关部分cat /etc/login.defs | grep -E "(PASS|password)"
输出示例:
PASS_MAX_DAYS 90 # 密码最大有效天数(对应 chage 的 Maximum) PASS_MIN_DAYS 0 # 密码更改最小间隔天数(对应 chage 的 Minimum) PASS_WARN_AGE 7 # 密码过期前警告天数(对应 chage 的 Warning) PASS_MIN_LEN 8 # 密码最小长度(但通常由PAM模块控制,此项可能不生效)
提示:修改 /etc/login.defs 只对新创建的用户生效。已有的用户密码策略需要用 chage 命令单独修改。
方法三:处理已过期的密码
-
将“最后修改时间”设置为今天(允许使用原密码)
sudo chage -d $(date +%Y-%m-%d) [用户名]
-d:设置密码最后修改日期。
$(date +%Y-%m-%d):Shell命令,会生成当前日期(例如:2024-05-15)。效果:系统会认为用户是在“今天”修改的密码,过期状态立即解除。用户可以使用原来的密码重新登录。