一、前言
1.升级背景
因漏洞扫描扫描出openssh相关的高危漏洞,处理新发布的CVE-2024-6387关于openssh的漏洞,需要升级openssh到9.8版本。
2.确认系统
本文记录的过程是基于centos7.9(2009)系统,对于其他linux系统不一定适用,请确认自己的系统对号入座。
查看系统版本命令
cat /etc/centos-release
查看ssh版本
ssh -V
[root@xntz1 ly]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
3.升级前准备
由于openssh升级可能出现问题,导致ssh连接不上,因此为防止升级过程中出现异常,导致后续无法使用ssh,我们需要先打卡telnet窗口备用。
telnet安装
准备tools工具
centos7.9 安装光盘下找到
xinetd-2.3.15-14.el7.x86_64.rpm
telnet-server-0.17-65.el7_8.x86_64.rpm
进行安装
[root@xntz1 ly]# rpm -ivh xinetd-2.3.15-14.el7.x86_64.rpm telnet-server-0.17-65.el7_8.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:telnet-server-1:0.17-65.el7_8 ################################# [ 50%]
2:xinetd-2:2.3.15-14.el7 ################################# [100%]
启用telnet服务
编辑/etc/xinetd.d/telnet
文件,将其中的disable = yes
改为disable = no
允许root用户通过telnet登陆:
编辑/etc/pam.d/login,注释掉下面这行
#auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
开启root用户远程登陆
编辑/etc/pam.d/remote,注释下列这行:
#auth required pam_securetty.so
备份配置文件/etc/securetty
cp /etc/securetty /etc/securetty.bak
添加超级用户登陆设备至/etc/securetty文件:
echo "pts/1" >> /etc/securetty
echo "pts/2" >> /etc/securetty
echo "pts/3" >> /etc/securetty
echo "pts/4" >> /etc/securetty
echo "pts/5" >> /etc/securetty
echo "pts/6" >> /etc/securetty
echo "pts/7" >> /etc/securetty
echo "pts/8" >> /etc/securetty
echo "pts/9" >> /etc/securetty
echo "pts/10" >> /etc/securetty
启动xinetd服务并设置开机自启
sudo systemctl start xinetd
sudo systemctl enable xinetd
配置防火墙允许telnet连接(如果已启用)
sudo firewall-cmd --permanent --add-service=telnet
sudo firewall-cmd --reload
确认telnet服务状态
sudo systemctl status xinetd
重启telnet服务,添加到启动项
systemctl restart telnet.socket
systemctl enable telnet.socket
注意 允许root用户远程telnet方法:
1、开启 telnet
修改/etc/xinetd.d/telnet 将里面的 disable=yes 行前面加上#注释掉
重新启动xinetd 服务 /etc/rc.d/init.d/xinetd restart
注:由于安全考虑,telnet 不允许 root 用户直接登录,需要您先建立一个普通用户,使用这个用户登录,再切换到 root 用户。
2、配置允许 root 用户登录
法一、允许 root 用户登录是很不安全的,但是有时候为了测试的方便,也可以允许 root 用户登录,但是这个方法最好不要对公网开放使用。
将/etc/pam.d/login文件中的 auth required pam_securetty.so 加上“#”注释掉,就可以实现在登录的时候允许 root 用户了。注:有些时候使用该方法后依然无法让root用户telnet到linux系统,此时可以参考方法二
法二、 修改/etc/securetty文件,增加root用户可以登录系统的虚拟终端
echo "pts/0" >>/etc/securetty
echo "pts/1" >>/etc/securetty
注:
ttyn,是文本模式下的控制台,n代表第几个控制台,可以用CTRL+ALT+F1...F6或者用chvt n来切换.
pts/n是在图形模式下的模拟控制台(模拟终端),n代表的是第几个模拟终端.
二、升级过程
1.升级zlib
#执行以下命令
cd /usr/local/src
wget https://www.zlib.net/zlib-1.3.1.tar.gz
#解压zlib
tar -xzvf zlib-1.3.1.tar.gz
#进入zlib解压目录
cd zlib-1.3.1
ls /usr/local/
./configure --prefix=/usr/local/zlib
make -j 2
make test
make install
ls /usr/local/zlib/
echo '/usr/local/zlib/lib' >> /etc/ld.so.conf.d/zlib.conf
加载配置
ldconfig -v
ldconfig
查zlib版本
cat /usr/local/zlib/lib/pkgconfig/zlib.pc
创建新的链接
cp /usr/local/zlib/lib/libz.so.1.3.1 /usr/lib64/
cd /usr/lib64/
mv libz.so libz.so.bak
mv libz.so.1 libz.so.1.bak
ln -s libz.so.1.3.1 libz.so.1
确认新版本是否存在
strings /lib64/libz.so.1 |grep "ZLIB*"
操作了一通发现没有1.3.1 也不知道安装成功没有
测试
备份、卸载原有OpenSSL
[root@xntz1 /]# whereis openssl
openssl: /usr/bin/openssl /usr/lib64/openssl /usr/share/man/man1/openssl.1ssl.gz
备份
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/lib64/openssl /usr/lib64/openssl .old
卸载 openssl (这一步看个人需要,我有洁癖所以我卸载了)
yum remove openssl
安装openssl
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz --no-check-certificate
tar -xzvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w/
./config --prefix=/usr
make && make install
这里我的目录选择了/usr 是因为系统最初始的openssl的目录就是/usr 这样可以省去的软连接、更新链接库的问题
验证
whereis openssl
openssl: /usr/bin/openssl /usr/lib64/openssl /usr/include/openssl /usr/share/man/man1/openssl.1ssl.gz /usr/share/man/man1/openssl.1
[root@vm206 openssl-1.1.1w]# openssl version
OpenSSL 1.1.1w 11 Sep 2023
可以看到我这边的目录和老版本的openssl的目录保持了一致,唯一不同的是多了一个/usr/include/openssl 库目录
如果不加--prefix=/usr ,openssl的默认路径如下
Bin: /usr/local/bin/openssl
include库 :/usr/local/include/openssl
lib库:/usr/local/lib64/
engine库:/usr/lib64/openssl/engines
查看openssh位置,备份
whereis ssh sshd
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz
sshd: /usr/sbin/sshd /usr/share/man/man8/sshd.8.gz
mv /etc/ssh /etc/ssh.bak
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/sbin/sshd /usr/sbin/sshd.bak
mv /etc/pam.d/sshd /etc/pam.d/sshd.old
以上执行后又还原回来了
cp -rf /etc/ssh /etc/ssh.bak
cp -rf /usr/bin/openssl /usr/bin/openssl.bak
cp -rf /etc/pam.d /etc/pam.d.bak
cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak
卸载原来的版本
查看
[root@xntz1 ~]# rpm -qa | grep ssh
openssh-7.4p1-21.el7.x86_64
openssh-clients-7.4p1-21.el7.x86_64
libssh2-1.8.0-4.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
安装方式1
cd /home/ly/
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz
systemctl stop sshd
tar -zxvf openssh-9.8p1.tar.gz
cd openssh-9.8p1
./configure --prefix=/usr/local/openssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl --without-zlib-version-check
###--with-zlib=/usr/local/zlib:指定 zlib 库的路径为 /usr/local/zlib。这是为了告诉 OpenSSH 在编译过程中使用指定路径下的 zlib 库。
###--with-ssl-dir=/usr/local/ssl:指定 OpenSSL 库的路径为 /usr/local/ssl。这是为了告诉 OpenSSH 在编译过程中使用指定路径下的 OpenSSL 库。
####--without-zlib-version-check:禁用对 zlib 版本的检查。这个选项可以用于跳过对 zlib 版本的检查,即使 zlib 版本不符合 OpenSSH 的要求,也会继续编译。
openssl升级
openssl1.1下载
OpenSSL 3.3.1 Free Download, Linux | IceWalkers
https://www.icewalkers.com/linux/software/518010/openssl.html
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz --no-check-certificate
tar -xzvf openssl-1.1.1h.tar.gz
cd openssl-1.1.1h/
./config --prefix=/usr
make && make install
这里我的目录选择了/usr 是因为系统最初始的openssl的目录就是/usr 这样可以省去的软连接、更新链接库的问题
验证
whereis openssl
openssl version
OpenSSL 1.1.1h 22 Sep 2020
可以看到我这边的目录和老版本的openssl的目录保持了一致,唯一不同的是多了一个/usr/include/openssl 库目录
如果不加prefix ,openssl的默认路径如下
安装openssl3.1.2 ./config 时有报错,所以选在1.1.
升级openssh
systemctl stop sshd
# whereis ssh sshd
ssh: /usr/bin/ssh /etc/ssh /etc/ssh.bak /usr/share/man/man1/ssh.1.gz
sshd: /usr/sbin/sshd /usr/share/man/man8/sshd.8.gz
备份文件目录
mv /etc/ssh /etc/ssh.bak
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/sbin/sshd /usr/sbin/sshd.bak
mv /etc/pam.d/sshd /etc/pam.d/sshd.bak
卸载旧版OpenSSH
yum remove openssh
安装方式2:ssh能连上 但是不知道稳定不?
yum update -y
yum install epel-release -y
yum install openssh-clients openssh-server openssh-devel -y
以上内容没有操作ssh也能正常连接
tar -zxvf centos7_openssh-9.8.tar
cd centos7_openssh-9.8
rpm -Uvh --force --nodeps *.rpm
ssh-keygen -A
sudo chmod 600 /etc/ssh/ssh_host_*
sudo chmod 644 /etc/ssh/ssh_host_*.pub
vi /etc/ssh/sshd_config
注释掉PermitRootLogin yes
service sshd restart
ssh -V
rpm -qa | grep telnet
rpm -ivh xinetd-2.3.15-14.el7.x86_64.rpm telnet-server-0.17-65.el7_8.x86_64.rpm
vi /etc/pam.d/login,注释掉下面这行,这个不用注释掉一样好使。
#auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
vi /etc/pam.d/remote,注释下列这行:
#auth required pam_securetty.so
systemctl start xinetd
systemctl enable xinetd
systemctl status xinetd
systemctl restart telnet.socket
systemctl enable telnet.socket
sudo firewall-cmd --permanent --add-service=telnet
sudo firewall-cmd --reload
service sshd stop
tar -zxvf centos7_openssh-9.8.tar
cd centos7_openssh-9.8
rpm -Uvh *.rpm
rpm -Uvh --force --nodeps *.rpm
ssh-keygen -A
sudo chmod 600 /etc/ssh/ssh_host_*
sudo chmod 644 /etc/ssh/ssh_host_*.pub
service sshd restart
ssh -V
vi /etc/ssh/sshd_config
注释掉PermitRootLogin yes
service sshd restart
ssh -V
systemctl stop xinetd
systemctl disable xinetd
systemctl stop telnet.socket
systemctl disable telnet.socket