本文转载自GoodBoyboy 's Blog|惬意小屋-点滴记忆
已获得来自站长的转载授权许可
在近期也会针对上一篇文章中的问题进行勘误修正,在此处感谢好友的指出说明
原文地址:https://blog.goodboyboy.top/posts/1937457134.html
注:本文转载时针对格式进行了部分微调,内容基本保持和原文一致
最近 OpenSSH CVE-2024-6387 闹得沸沸扬扬,网上也流传出了升级教程,但有些教程是错误的!!!
错误做法
错误示例:只 make install 后就不管了
这里 make install 完后需要替换二进制文件才能真正完成升级!!!
当然有些人可能会说为什么我 make install 后使用 sshd -V 输出版本号是 9.8p1,那是因为环境变量的锅!!!
检查方法很简单
输入 ls /usr/local/sbin -la | grep sshd 可以发现该二进制文件是 make install 时生成的(日期),然后输入 ls /usr/sbin -la | grep sshd ,可以发现这个 sshd 文件创建日期远落后于第一个 sshd 文件(当然你也可以通过绝对路径运行 /usr/sbin/sshd -V 输出版本信息查看)
接着我们输入 ps aux | grep sshd 可以发现当前正在运行的是 /usr/sbin 下的 sshd!!!
并且通过 cat /etc/systemd/system/sshd.service 也可以看出 sshd 服务是使用的 /usr/sbin 下的 sshd,跟新版本的 sshd 半毛钱关系没有!!!
人话来说就是如升
原因分析:环境变量的锅
输入 echo $PATH 可以看到自己当前的环境变量
这是我的环境变量: /bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
我也不知道是 make install 时添加了环境变量还是我之前自己添加了环境变量,导致当我输入 sshd -V 时系统将文件定位到了 /usr/local/sbin 目录下的 sshd, ssh -V 则定位到了 /usr/local/bin 下的 ssh 二进制文件,因此输出了 9.8p1 的版本信息,让我误以为升级完成(网上部分教程害人不浅),但其实根本没有完成升级!!!
Tips:部分教程用 ssh -V 输出版本信息, ssh 是客户端, sshd 才是服务端
正确做法
前面的步骤都是一样的
sudo apt-get update
sudo apt-get install -y build-essential zlib1g-dev libssl-dev
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
tar -xzf openssh-9.8p1.tar.gz
cd openssh-9.8p1
./configure
make
sudo make install
然后这里我们需要替换二进制文件
这里因为我使用软连接好像有点问题因此选择直接把二进制文件 copy 过来(这里先把 sshd 的写了,openssh 其他组件可以依葫芦画瓢进行替换)
#备份原来的sshd
mv /usr/sbin/sshd /usr/sbin/sshd.old
#复制二进制文件
cp /usr/local/sbin/sshd /usr/sbin/sshd
#重启sshd服务
sudo systemctl restart sshd
重新连接后会提示密钥指纹变更的情况,同意接受即可
下面是可选更新组件
#备份原来的组件
mv /usr/bin/ssh /usr/bin/ssh.old
mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.old
#更新ssh客户端
cp /usr/local/bin/ssh /usr/bin/ssh
#更新密钥生成组件
cp /usr/local/bin/ssh-keygen /usr/bin/ssh-keygen