是的,踩坑了,导致服务器远程登录不上去,最后只能想其他办法了。所以有必要记下来具体的操作。
环境
centos7.9, 自带的 openssh 为 7.4, 准备升级到 7.9p1.
编译 openssh
先编译 openssh, 根据漏扫报告,openssh 至少要7.8以上,这里用 7.9p1 下载地址是:
下载完成之后解压:
tar xzvf openssh-7.9p1.tar.gz
接下来准备编译它,先运行 ./configure ,发现少哪个组件就安装。比如说报少 zlib,就通过yum 安装。
yum install zlib-devel
configure 的完整参数是:
./configure --prefix=/usr/local/openssh --exec-prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-selinux --with-tcp-wrappers
如果正常,就可编译了:
make
这里没有 make install 因为我想自己控制安装过程。而且,编译和运行可以在不同的服务器上。
安装 sshd
现在的主要难题是替换 sshd. 如果用下面的命令替换文件,
cp sshd /usr/sbin/
则会报错,无法替换,也就无法升级。
后来想了一个办法,sshd 不是一个服务吗?我可以修改服务配置文件,把 sshd 指向新编译出来的文件,再重启不就行了?等重启成功后,再用新编译的 sshd 替换掉旧的文件(位于 /usr/sbin/sshd),然后再把服务配置文件中的内容改回来,也就修改成功了。
先创建一个目录,用于存放新的 sshd,再将文件复制进去,之所以不用 /root/ 下的路径,可能会有权限的问题.
mkdir -p /data/ssh/
cp sshd /data/ssh/sshd
再编辑服务的配置文件,/usr/lib/systemd/system/sshd.service,把 ExecStart=/usr/sbin/sshd -D $OPTIONS 这一行,改成 ExecStart=/data/ssh/sshd -D $OPTIONS 。然后重启服务器,这时候悲剧发生,ssh 再也连不上服务器了! 因此,绝对不能在这个时候重启,而要调整好配置,再重启。下面是调整配置的地方。
1、调整 ssh 相关 key 的权限。
cd /etc/ssh/
ll *key
# 有三个 key 文件,把它们的权限调整成 600.
chmod 600 *key
上面如果不调整权限,则会报下面的错,导致无法登录。
error: @ WARNING: UNPROTECTED PRIVATE KEY FILE! @
error: Permissions 0640 for '/etc/ssh/ssh_host_rsa_key' are too open.
2、然后再编辑 sshd_config, 把下面两行注释掉:
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
注释后像这样:
# GSSAPI options
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials no
找到 PermitRootLogin yes 一行,本来是被注释掉的,现在要取消注释。
3、确保 /etc/empty/sshd/ 目录存在,且 owner 为 root, 像下面这样:
[root@localhost ssh]# ll /var/empty/
total 0
drwx--x--x. 2 root root 6 Aug 9 2019 sshd
这时候再重启系统,就能登录了。
之后就是替换原 sshd 的操作。
先备份原文件:
mkdir /data/backup/
cp /usr/sbin/sshd /data/backup/
再把文件复制过去:
cp /data/ssh/sshd /usr/sbin/
再次编辑,/usr/lib/systemd/system/sshd.service,恢复 sshd 执行文件的路径。然后重启服务器。