记一次OpenSSL和OpenSSH升级(CentOS7)

前言

公司的一次安全扫描提醒某台服务器的OpenSSH版本过低,想着自己的服务器也很久没升级了,打算一起升级掉。

升级公司服务器的过程很顺利,一样的流程到升级自己服务器时候居然失败了…虽然最终还是升级好了,但是还是打算梳理一下步骤和问题(还能写个shell啥的)

开启Telnet

防止升级挂了用不了ssh,对自己操作和人品自信的朋友可以跳过这一步

(Telnet端口修改过的话改一下防火墙那句)

1
2
3
4
5
6
7
firewall-cmd --add-port=23/tcp --permanent
firewall-cmd --reload
yum install -y telnet-server telnet xinetd
systemctl enable xinetd.service
systemctl enable telnet.socket
systemctl start telnet.socket
systemctl start xinetd.service

安装所需库

1
yum install gcc zlib-devel pam-devel libselinux-devel -y

升级OpenSSL

下载OpenSSL源码

1
2
3
cd /usr/loal
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zxvf openssl-1.1.1k.tar.gz

备份旧版本OpenSSL

先用which openssl查找一下旧版本的openssl的路径,然后备份旧版本的OpenSSL

这个这是我服务器的情况 按实际情况备份

1
2
mv /usr/bin/openssl /usr/bin/openssl_backup
mv /usr/include/openssl /usr/include/openssl_backup

编译OpenSSL

1
2
3
4
5
6
7
8
# pwd: /usr/local
cd openssl-1.1.1k
./config --shared --prefix=/usr/local/openssl
make && make install
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl/ /usr/include/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf #
ldconfig -v

如果说编译openssl时候添加了--prefix=/usr/local/openssl的话,最后两步就很关键,要将编译完后的路径加入到动态库的配置文件中,不然可能会有如下两种情况:

  1. 提示找不到libssl.so.1.1libcrypto.so.1.1,这种情况往往是之前没有自己编译过,用的自带的openssl;或者openssl版本很低(1.1之前的)的时候出现

  2. 使用openssl version查看版本时,会出现OpenSSL 1.1.1k 25 Mar 2021(Library: OpenSSL 1.1.1b)(忘记截图了..)这种情况,提示的lib版本还是旧openssl的版本,后续编译openssh时也会有提示openssl的header和library不一致的问题。我就是这种情况,研究了会儿发现库用的还是/usr/lib64/路径下的库,其中libssl.so.1.1libcrypto.so.1.1都是旧版本的(忘了之前openssl咋装的了…)

执行openssl version后,如果提示OpenSSL 1.1.1k 25 Mar 2021说明安装成功

升级OpenSSH

下载OpenSSH源码

1
2
3
4
cd /usr/local
wget https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz
tar -zxvf openssh-8.6p1.tar.gz
chown -R root:root /usr/local/openssh-8.6p1

备份及删除旧ssh

1
2
cp -r /etc/ssh/ /tmp/
rm -rf /etc/ssh

这一步做完之后sshd服务就挂了,如果这时候断电断网死机闪退,又没有开telnet的话…嗯…

编译OpenSSH

1
2
3
cd openssh-8.6p1
./configure --prefix=/usr/ --sysconfdir=/etc/ssh --with-openssl-includes=/usr/local/openssl/include --with-ssl-dir=/usr/local/openssl --with-zlib --with-md5-passwords --with-pam
make && make install

配置sshd

把旧sshd配置复制过来,设置好服务和开机自启后重启sshd服务

1
2
3
4
5
6
7
8
9
10
cat /tmp/ssh/sshd_config |grep -v '#' |grep -v '^$' > /etc/ssh/sshd_config
cp -a contrib/redhat/sshd.init /etc/init.d/sshd
cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
chmod +x /etc/init.d/sshd
chkconfig --add sshd
systemctl enable sshd
mv /usr/lib/systemd/system/sshd.service /opt/
mv /usr/lib/systemd/system/sshd.socket /opt/
chkconfig sshd on
service sshd restart

输入ssh -V查看版本,提示OpenSSH_8.6p1, OpenSSL 1.1.1k 25 Mar 2021,升级成功

关闭Telnet

安全考虑,关闭Telnet

1
2
3
4
5
6
systemctl disable xinetd
systemctl disable telnet.socket
systemctl stop xinetd.service
systemctl stop telnet.socket
firewall-cmd --remove-port=23/tcp --permanent
firewall-cmd --reload