服务器检查漏洞,需要升级服务器ssh版本,从openssh7.4升级到openssh8.8,平滑升级ssh方法。
实际生产服务器是RedHat 7.6,我在vm虚拟机中搭建了centos7.6测试环境,前期也用了一个RedHat 7.6不理想,实际直接下载的红帽是用不了的,需要注册服务器,要用也能用安装网上需要改一些东西很麻烦,我弃用了。
升级过程,直接在服务器升级ssh是有风险的,我参考一些网上平滑升级方法在测和环境弄了几次才成功,过程很坎坷,记录一下这个升级过程。这个升级过程没有用telnet做升级失败备用处理、也没有卸载旧版本ssh,直接开启多个ssh远程连接,一次升级成功,重启ssh服务验证远程连接升级。
openssh8.8版本升级前所需安装两个依赖 zlib-1.2.11.tar.gz,openssl-1.1.1j.tar.gz,同时检查目前系统ssh版
检查系统ssh版本,centos7.6和RedHat系统安装自带ssh版本就是7.4的版本。
[root@localhost ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
测试环境是新安装的,生产环境查了几个都有gcc,安装前查询下是否缺少gcc编译环境,查询命令 rpm -qa gcc
[root@localhost ~]# rpm -qa gcc
gcc-4.8.5-36.el7.x86_64
指定到解压目录,我新安装的包都统一解压到/usr/local/src/目录下。
tar -zxvf openssl-1.1.1p.tar.gz -C /usr/local/src/
tar -zxvf openssh-8.8p1.tar.gz -C /usr/local/src/
tar -zxvf zlib-1.2.11.tar.gz -C /usr/local/src/
[root@localhost data]# cd /usr/local/src/
[root@localhost src]# ll
total 40
drwxr-xr-x. 7 ly ly 16384 May 12 10:47 openssh-8.8p1
drwxrwxr-x. 19 root root 4096 May 12 10:10 openssl-1.1.1p
drwxr-xr-x. 14 501 games 4096 May 12 10:05 zlib-1.2.11
[root@localhost src]# pwd
/usr/local/src
升级安装过程有依赖顺序的,顺序是zlib库-> openssl -> openssh
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib
make && make install
正常编译源码,指定安装位置到/usr/local/ssl,这个安装位置一定要记住,后面修改配置文件要用。
cd openssl-1.1.1p/
./config --prefix=/usr/local/ssl -d shared
make && make install
注:安装openssl的时候如果出现提示不用管,只要是 OpenSSL has been successfully 就行。往下执行ssl配置命令:
echo '/usr/local/ssl/lib' >> /etc/ld.so.conf
ldconfig -v
/usr/local/ssl/bin/openssl version -a # 查询这个目录下openssl版本已是1.1.1p
注:升级过程中需要刷新lib库:ldconfig -v
执行执行命令,安装的时候指定前面新安装的zlib和ssl安装位置
cd openssh-8.8p1/
./configure --prefix=/usr/local/openssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl
make && make install
注:版本迁移新版本已经安装完成,接下来需要做配置文件备份和修改
需要修改 sshd_config文件,同时将openssh7.4旧版本的文件备份,用新安装版本文件重新替代旧版本。
修改sshd_config文件执行命令
echo 'PermitRootLogin yes' >>/usr/local/openssh/etc/sshd_config # 运行root用户远程登录
echo 'PubkeyAuthentication yes' >>/usr/local/openssh/etc/sshd_config # 密钥对的身份验证方式,允许密钥认证
echo 'PasswordAuthentication yes'>>/usr/local/openssh/etc/sshd_config # 允许远程登陆用密码来认证
备份openssh7.4旧版本文件,重新修改为新版ssh配置文件,实现ssh新版替换。
mv /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp /usr/local/openssh/etc/sshd_config /etc/ssh/sshd_config
mv /usr/sbin/sshd /usr/sbin/sshd.bak
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
mv /usr/bin/ssh /usr/bin/ssh.bak
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
升级OpenSSH后,原有公钥失效,信任关系需要重新配置;
mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
mv /etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub.bak
cp /usr/local/openssh/etc/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub
注:到这里文件配置已经替换完成,可以执行ssh -V 查询替换完的版本,查询已经是替换为ssh8.8版本
修改systemd参数(去掉Type或改为Type=simple)
vim /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
#Type=notify
Type=simple
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
重新sshd服务,让系统新版ssh8.8替换掉ssh7.4版本提供的服务
systemctl daemon-reload
systemctl restart sshd
systemctl status sshd
注:在最后重新sshd服务成功后,重新建立ssh远程连接验证ssh升级
[root@localhost src]# ssh -V
OpenSSH_8.8p1, OpenSSL 1.1.1p 21 Jun 2022
升级过程参照了这位博主的方法:[https://www.cnblogs.com/liuweinotes/p/15903521.html ] ,感谢这位博主提供的升级经验。