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

2022-07-02  本文已影响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 误更改为不存在的文件。

解决思路:

相关命令:

相关知识点:

避免该问题的措施:

上一篇下一篇

猜你喜欢

热点阅读