三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Linux服务器SSH登录失败?别急着重装!手把手教你排查密码过期、账户锁定等5种常见原因

Linux服务器SSH登录失败?别急着重装!手把手教你排查密码过期、账户锁定等5种常见原因

Linux服务器SSH登录失败排查指南:从密码过期到权限修复的完整解决方案

当你面对"SSH服务器拒绝了密码"的红色警告,而明明确认密码正确时,那种混合着困惑与焦虑的感受,作为运维人员一定不陌生。本文将带你像侦探破案一样,层层剖析SSH登录失败的五大常见原因,并提供可直接复用的诊断命令和修复方案。

1. 密码过期:最容易被忽视的"时间陷阱"

密码过期机制是企业安全策略的常见要求,但往往成为登录失败的隐形杀手。当系统提示"WARNING: Your password has expired"时,你需要掌握以下关键操作:

诊断密码状态的三步法:

# 查看用户密码过期信息 chage -l username # 检查密码最后修改日期 grep username /etc/shadow | cut -d: -f3 # 验证当前密码策略 grep PASS_MAX_DAYS /etc/login.defs

典型输出示例:

Last password change : Mar 01, 2023 Password expires : Jun 29, 2023 Password inactive : never Account expires : never

紧急处理方案:

  • 临时解决方案(允许用户下次登录时修改密码):
    chage -d $(date +%F) username
  • 长期解决方案(设置密码永不过期):
    chage -M 99999 username

注意:生产环境中不建议设置密码永不过期,应结合企业安全策略调整合理有效期

2. 账户过期:被时间遗忘的访问权限

账户过期与密码过期不同,它直接禁用整个账户。这种情况常见于临时账户或外包人员账户。

诊断账户过期状态的黄金命令:

# 查看账户过期日期 chage -l username | grep "Account expires" # 替代方案:直接检查shadow文件 grep username /etc/shadow | cut -d: -f8

账户激活的两种方式:

  1. 设置新的过期日期:
    chage -E "2024-12-31" username
  2. 取消账户过期限制:
    chage -E -1 username

关键区别:

状态类型影响范围恢复难度典型场景
密码过期仅限密码容易定期安全策略
账户过期整个账户中等临时人员账户

3. PAM策略锁定:安全机制的"双刃剑"

当连续多次输入错误密码后,PAM(Pluggable Authentication Modules)模块可能锁定账户。这是重要的安全特性,但也可能造成合法用户被误锁。

PAM锁定诊断全流程:

  1. 确认系统使用的PAM模块:

    grep pam_tally /etc/pam.d/sshd # 或 grep faillock /etc/pam.d/sshd
  2. 查看失败计数(根据模块选择命令):

    # 对于pam_tally2 pam_tally2 --user=username # 对于faillock faillock --user username
  3. 解锁账户的标准操作:

    # pam_tally2解锁 pam_tally2 --user=username --reset # faillock解锁 faillock --user username --reset

预防性配置建议:

# 在/etc/pam.d/sshd中添加或修改以下参数 auth required pam_tally2.so deny=5 unlock_time=900 onerr=fail

参数说明:

  • deny=5:允许5次失败尝试
  • unlock_time=900:锁定15分钟(900秒)
  • onerr=fail:出错时拒绝访问

4. SELinux上下文:安全强化的隐形屏障

SELinux在增强安全性的同时,也可能导致合法的SSH登录失败,特别是当用户家目录或关键文件的安全上下文不正确时。

SELinux问题诊断四部曲:

  1. 检查SELinux状态:

    sestatus getenforce
  2. 查看SSH相关拒绝日志:

    grep "denied" /var/log/audit/audit.log | grep sshd
  3. 修复家目录上下文:

    restorecon -R -v /home/username
  4. 临时解决方案(如急需恢复访问):

    setenforce 0

    警告:禁用SELinux会降低系统安全性,仅限紧急使用

关键文件的标准上下文:

/home/username system_u:object_r:home_root_t:s0 /home/username/.ssh system_u:object_r:ssh_home_t:s0

5. 家目录权限:细节决定成败

不正确的家目录权限是SSH登录失败的常见原因,特别是新建用户或迁移家目录后。

权限检查与修复清单:

  1. 基础权限验证:

    ls -ld /home/username ls -la /home/username
  2. 标准权限设置:

    chmod 755 /home/username chmod 700 /home/username/.ssh chmod 600 /home/username/.ssh/authorized_keys
  3. 所有权验证:

    chown -R username:username /home/username

权限问题快速诊断表:

症状可能原因修复命令
登录后立即断开.ssh目录权限过大chmod 700 ~/.ssh
密码正确但被拒绝authorized_keys权限错误chmod 600 ~/.ssh/authorized_keys
无法创建.ssh目录家目录不可写chmod 755 ~

终极排查工具箱

将以下脚本保存为ssh_login_check.sh,可一键诊断常见登录问题:

#!/bin/bash USERNAME=$1 echo "=== 开始SSH登录问题诊断 ===" echo "检测用户: $USERNAME" echo -e "\n[1/5] 检查密码过期状态..." chage -l $USERNAME echo -e "\n[2/5] 检查账户锁定状态..." passwd -S $USERNAME 2>/dev/null || echo "passwd命令不支持-S参数" echo -e "\n[3/5] 检查PAM失败计数..." which pam_tally2 &>/dev/null && pam_tally2 --user=$USERNAME which faillock &>/dev/null && faillock --user $USERNAME echo -e "\n[4/5] 检查SELinux上下文..." ls -Zd /home/$USERNAME ls -Zd /home/$USERNAME/.ssh 2>/dev/null echo -e "\n[5/5] 检查家目录权限..." ls -ld /home/$USERNAME ls -ld /home/$USERNAME/.ssh 2>/dev/null echo -e "\n=== 诊断完成 ==="

使用方法:

chmod +x ssh_login_check.sh ./ssh_login_check.sh 用户名

高级技巧与预防措施

SSH调试模式: 当标准排查无效时,在服务器端以调试模式运行SSH:

/usr/sbin/sshd -d -p 2222

然后在客户端连接:

ssh -p 2222 username@server

日志分析要点:

  • /var/log/secure(RHEL/CentOS)
  • /var/log/auth.log(Debian/Ubuntu) 关键搜索词:
grep "Failed password" /var/log/secure grep "authentication failure" /var/log/auth.log

预防性维护建议:

  1. 定期检查即将过期的密码:
    chage -l $(cut -d: -f1 /etc/passwd) | grep "expire"
  2. 设置密码策略提醒:
    echo "00 09 * * * root chage -W 7 username" >> /etc/crontab
  3. 实施SSH双因素认证
  4. 定期备份并检查.ssh目录完整性
← 返回列表