场景:因服务器漏扫报告,提示一堆openssh漏洞问题,且涉及服务器较多,故准备升级所有服务器的openssh至最新的版本,因情况不一样,本文不一定适用所有情况,所以仅供参考。
注:前提:因升级openssh需要下载更新关联的包太多,离线下载更新异常麻烦,因此,本文是在服务器可访问互联网的前提下进行升级的,满足不了这个前提的小伙伴可以忽略本文了,我升级生产环境也是申请的临时访问互联网权限才完成的升级。
升级前的准备:
官网下载openssh:
https://www.openssh.com/releasenotes.html
或:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/
下载openssl:
https://github.com/openssl/openssl/releases?page=2
1、查看centos7、ssh以及openssl的版本信息
# 查看CentOS系统版本信息
cat /etc/redhat-release
# 查看openssl版本信息
openssl version
# 查看openssh的版本信息
ssh -V
(openssh7.*版本升级到9.7p1也可以这么升级,已验证)
2、yum安装相关依赖:
# 安装相关的依赖项,如果有遗漏再次运行命令安装一遍
yum -y install gcc pam-devel zlib-devel openssl-devel net-tools
3、安装openssl-1.1.1w
因openssh9.7p1要求openssl版本大于等于1.1.1,因此需要升级安装openssl。
3.1解压openssl-1.1.1w至/usr/local
tar zxvf openssl-1.1.1w.tar.gz -C /usr/local/
#(如果没有提示tar命令,执行 sudo yum install tar 命令安装一下tar命令)
#查看解压后目标情况
ll /usr/local/ |grep openssl
#进入解压后的目录
cd /usr/local/openssl-1.1.1w/
3.2安装openssl前的准备
#创建openssl的安装目录
mkdir /opt/openssl
#安装前确认openssl的旧版本
openssl version
3.3编译安装openssl-1.1.1w
# 配置编译和安装过程,"--prefix=" 选项配置安装目录
./config --prefix=/opt/openssl
# 构建程序以及所需的指令和依赖关系(等待时间有点长)
make
# 安装编译好的openssl-1.1.1w(等待时间有点长)
make install
# 注:以上三步必须没有出现报错(error),才可以继续下一步,全部无报错才能视为安装成功
./config --prefix=/opt/openssl执行成功情况参考图:
make执行成功参考图:
make install之后参考图:
3.4更新lib文件
# 检查openssl-1.1.1w所需要的函数库
ldd /opt/openssl/bin/openssl
# 添加openssl-1.1.1w的库文件路径到ld.so.conf
echo "/opt/openssl/lib" >> /etc/ld.so.conf
# 更新系统函数库
ldconfig -v
# 绝对路径查看openssl版本
ldd /opt/openssl/bin/openssl
前后对比图:
3.5更新bin文件
# 查看旧版本的openssl命令路径
which openssl
# 重命名为openssl.old
mv /usr/bin/openssl /usr/bin/openssl.old #重命名openssl文件
# 使用软连接的方式更新openssl命令
ln -s /opt/openssl/bin/openssl /usr/bin/openssl
# openssl命令查看新安装版本号
openssl version
至此openssl安装成功
4、编译安装openssh9.7p1
4.1 编译安装前的准备
#有条件的安装telnet并连接至服务器,防止安装失败连不上服务器,如果是云服务器,提前做好快照,方便升级#失败时还原,我这里是云服务器,没有telnet,就不再写了,网上一搜一堆
# 卸载openssh的旧的rpm包(执行这一步命令之前请确认你已经做好了连不上服务器的准备)
for i in $(rpm -qa | grep openssh);do rpm -e $i --nodeps;done
# 解压缩openssh9.7p1包到目标目录
tar zxvf /root/openssh-9.7p1.tar.gz -C /usr/local/
# 进入openssh9.7p1的源码目录
cd /usr/local/openssh-9.7p1/
# 安装前可以查看一下安装文件INSTALL
more INSTALL
4.2编译安装openssh9.7p1
# 配置编译和安装过程,"--prefix=" 配置安装目录,"--sysconfdir=" 配置文件路径,"--with-ssl-dir=" openssl的安装路径
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh --with-pam --with-ssl-dir=/opt/openssl --with-md5-passwords --mandir=/usr/share/man --with-zlib=/usr/local/zlib --without-hardening
# 构建程序以及所需的指令和依赖关系
make
# 安装编译好的openssh9.7p1
make install
这里如果make install报
Permissions 0640 for '/etc/ssh/ssh_host_ed25519_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
sshd: no hostkeys available -- exiting.
make: [check-config] Error 1 (ignored)
的错误,执行以下命令:
chmod 600 /etc/ssh/*
然后再次执行make install
# 注:以上三步必须没有出现报错(error),才可以继续下一步,全部无报错才能视为安装成功
执行./configure.....之后成功的参考图:
make成功之后的参考图:
make install成功之后的参考图:
4.3复制并修改启动sshd.init脚本
# 从源码目录下复制sshd.init到/etc/init.d/
cp /usr/local/openssh-9.7p1/contrib/redhat/sshd.init /etc/init.d/
## 查看并修改SSHD的新路径,将新的openssh安装路径更新进去
cat /etc/init.d/sshd.init | grep SSHD
sed -i "s/SSHD=\/usr\/sbin\/sshd/SSHD=\/usr\/local\/openssh\/sbin\/sshd/g" /etc/init.d/sshd.init
cat /etc/init.d/sshd.init | grep SSHD
## 查看并修改ssh-keygen的新路径,将新的ssh-keygen安装路径更新进去
cat -n /etc/init.d/sshd.init | grep ssh-keygen
sed -i "s#/usr/bin/ssh-keygen -A#/usr/local/openssh/bin/ssh-keygen -A#g" /etc/init.d/sshd.init
cat -n /etc/init.d/sshd.init | grep ssh-keygen
4.4 修改配置文件(sshd_config)
# 开启允许X11转发
echo 'X11Forwarding yes' >> /etc/ssh/sshd_config
# 开启允许密码验证
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
4.5 启动openssh,并设置开机启动
# 复制ssh的相关命令
cp -arp /usr/local/openssh/bin/* /usr/bin/
# 启动sshd服务
/etc/init.d/sshd.init start
# 查看版本
ssh -V
# 添加开机启动
chmod +x /etc/rc.d/rc.local
echo "/etc/init.d/sshd.init start" >> /etc/rc.d/rc.local
4.6 测试openssh连接
#使用ssh协议连接centos7,检查openssh9.7p1服务
#重启系统后ssh协议登录centos7,检查openssh9.7p1自动启动
#如果root账户登录不上去的话创建一个子账户,比如:
sudo useradd test
sudo passwd test
#然后使用子账户登录 通过su命令切换到root账户
5、如果开始之前启用了telnet,在这里卸载telnet服务
# 确认openssh升级成功,连接无异常后卸载telnet服务
yum -y remove telnet telnet-server
6、检查系统、openssl和openssh的版本信息
# 查看openssl版本信息
openssl version
# 查看openssh的版本信息
ssh -V
至此,centos7升级openssh9.7p1升级完毕,已亲身使用生产服务器验证过,漏洞也解决了,希望能给各位小伙伴带来帮助ღ( ´・ᴗ・` )比心。