美文网首页
记一次服务器 SSH 登录异常排查与修复

记一次服务器 SSH 登录异常排查与修复

作者: 初心不变_叶子 | 来源:发表于2022-07-02 22:38 被阅读0次

    系统信息

    系统版本:Ubuntu 20.04.4 LTS

    云服务商:阿里云

    起因

    昨天,我尝试在服务器上安装了 zsh(一个终端工具,提供了一些增强功能)。

    安装命令如下:

    sudo apt-get update
    sudo apt-get install zsh -y
    

    安装之后,使用以下命令切换当前用户的默认终端:

    chsh -s /usr/bin/zsh
    

    至此一切正常,但我希望更换回原先的 bash 终端继续使用,于是我运行了下列命令:

    chsh -s /bin/bash
    

    输入命令后,被告知需要密码确认,输入当前登录用户(root)的密码提示错误,终端也没有成功切换。

    报错信息中有关于 PAM 的提示,这是一个在 Linux 上进行鉴权的工具,此前我没有修改过相关设置。

    为了确认修改是否生效,我断开了 SSH 连接并尝试重连,发现无法正常连接。

    查看报错信息,发现错误原因是鉴权失败,输入当前用户密码也无法正常通过验证。

    定位问题原因

    使用阿里云 App 查看实例状态,确认实例在线,查看 CPU、内存、硬盘监控图表,均在正常范围内。

    尝试访问该服务器上运行的几个服务,均可以正常使用,排除服务器系统故障导致的无法登录。

    初步评估影响范围,确认没有影响用户正常使用服务。

    为防止误操作加剧问题,使用阿里云 App 创建磁盘快照。

    登录阿里云控制台,使用远程命令功能,尝试向服务器发送命令。

    ls
    

    返回结果为当前目录的文件,我设置的默认目录为 /home,至此可确认用户权限正常。

    chsh -s /bin/bash
    

    执行失败,返回结果如下:

    Password: chsh: PAM: Authentication failure
    

    尝试切换到 zsh 会出现相同报错。

    查看系统用户列表:

    cat /etc/group
    
    root:x:0:
    daemon:x:1:
    bin:x:2:
    sys:x:3:
    adm:x:4:syslog
    tty:x:5:syslog
    (以下省略)
    

    root 用户依然存在,排除用户被删除导致的登录失败。

    查看用户与密码信息:

    cat /etc/passwd
    
    root:x:0:0:root:/home:/bin/hash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    

    定位到问题原因:在执行命令 chsh -s /bin/bash 时,出现了误操作,导致当前用户默认 Shell 被切换为 hash,而 /bin 目录下显然不存在该文件,因此导致登录失败。

    修复 Shell 错误问题

    使用 cat 命令查看 /etc/passwd 文件,并将其内容保存到本地。

    编辑该文件,将 root 用户的默认 Shell 修改回 /bin/bash

    使用远程文件功能,将该文件上传到对应目录,并覆盖原先的文件:

    [图片上传失败...(image-f2833c-1656772707637)]

    完成后 cat 该文件,确认修改生效。

    通过 VNC 登录并修复 SSH

    登录阿里云控制台,选择实例进行 VNC 远程连接:

    [图片上传失败...(image-a17fb6-1656772707637)]

    输入 VNC 密码(与实例密码不同,可以重置),成功连接到实例。

    使用 htop 命令确认服务器运行正常,ctop 命令确认使用 Docker 部署的几个服务均在正常运行。

    (如果有必要,这时可以对重要的数据进行备份操作)

    此时再次通过 SSH 进行连接,报错如下:

    connection error (1005): Socket error: Connection reset by peer
    

    (此时应该使用 netstat 命令确认 22 端口开放情况,当时没有尝试)

    不再出现鉴权问题,说明用户登录部分已经恢复正常。

    初步怀疑是对 /etc/passwd 文件的修改影响到了 sshd 服务的正常运行,进而导致连接失败。

    尝试重启 sshd 服务:

    systemctl restart sshd
    

    重启失败,查看报错信息:

    systemctl status sshd
    

    发现服务处于停止状态,查找相关报错信息,根据资料,执行以下命令:

    groupadd -g 33 sshd
    useradd -u 33 -g 33 -c sshd -d / sshd
    

    再次尝试启动 sshd

    systemctl start sshd
    

    使用 systemctl status sshd 查看服务状态,已变为 active (running)

    尝试通过 SSH 连接服务器,已经恢复正常。

    修复 APT Warning 问题

    恢复 SSH 登录后,确认当前 Shell 为 bash,执行命令,卸载 zsh

    apt uninstall zsh
    apt autoremove
    

    发现在 APT 命令执行后会输出警告信息:

    W: No sandbox user '_apt' on the system, can not drop privileges
    

    搜索该问题,根据资料,执行以下命令:

    sudo adduser _apt --force-badname
    

    提示输入密码时,按回车键即可。

    再次运行 APT 命令,警告信息已消失。

    故障影响

    该问题导致服务器不可登录约两小时。

    问题未对运行的服务产生影响,未产生安全性问题。

    问题复盘

    直接原因:在未经测试的情况下更改服务器 Shell 环境。

    根本原因:将当前用户的默认 Shell 误更改为不存在的文件。

    解决思路:

    • 确认服务器是否正常运行
    • 尝试访问服务,初步评估影响范围
    • 使用远程命令定位问题原因
    • 通过编辑文件并覆盖上传修复问题
    • 使用 VNC 远程连接恢复访问
    • 具体评估影响范围
    • 修复 SSH 服务
    • 消除附加影响

    相关命令:

    • htop:查看系统性能信息
    • ctop:查看容器信息
    • cat:查看文件内容
    • chsh:更改当前用户的默认 Shell
    • netstat:查看网络端口开放情况

    相关知识点:

    • Linux 系统用户概念
    • 用户相关系统文件的作用
    • SSH 连接基本原理
    • 服务的启动 / 停止 / 重启
    • VNC 连接基本原理

    避免该问题的措施:

    • 尝试未完全掌握的命令与工具前,先在本地进行测试
    • 出现鉴权问题时暂时不关闭当前连接,而是重新打开一个连接
    • 执行重要命令时多次确认
    • 加强数据备份

    相关文章

      网友评论

          本文标题:记一次服务器 SSH 登录异常排查与修复

          本文链接:https://www.haomeiwen.com/subject/aezkbrtx.html