Linux上如何手动升级OpenSSH版本?解决CVE-2021-41617漏洞

2021-09-29 09:54:43 浏览数 (1)

作者:Mintimate

博客:https://www.mintimate.cn

Mintimate's Blog,只为与你分享

哈哈,封面嗷哈哈,封面嗷

CVE-2021-41617漏洞

有小伙伴问,如何解决CVE-2021-41617漏洞漏洞?增加我Linux服务器的安全性:

腾讯云的公告腾讯云的公告

其实腾讯云的安全公告里已经写了解决方法:升级到OpenSSH最新安全版本。

但是,升级OpenSSH有一点小坑,一不留神,甚至会找出无法SSH远程登录的尴尬局面。本次教程就教大家避免踩坑,安全地升级我们的Linux服务器OpenSSH。

OpenSSH

OpenSSH(OpenBSD Secure Shell)是使用SSH透过计算机网络加密通信的实现。它是取代由SSH Communications Security所提供的商用版本的开放源代码方案。目前OpenSSH是OpenBSD的子项目。

OpenSSH常常被误认以为与OpenSSL有关系,但实际上这两个项目有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通信软件。

而目前最经常的应用:SSH远程连接。相比telnet远程连接,SSH更安全(当然,注意提升SSH的版本,比如本文内容)。

OpenSSL

前文说到,OpenSSL和OpenSSH是两个不同的项目。OpenSSL可以运行在OpenVMS、 Microsoft Windows以及绝大多数类Unix操作系统上(包括Solaris,Linux,Mac OS X与各种版本的开放源代码BSD操作系统)。用于提供密码加密、安全通信等。

那么OpenSSL和OpenSSH有什么关系呢?

-> OpenSSH需要OpenSSL作为前置编译依赖

快照服务器

在升级OpenSSH前,强力推荐快照服务器一次!强力推荐!强力推荐!强力推荐!一定要做!

防止因为升级过程中,因为不可抗拒的因素,断连服务器,导致后续无法SSH远程登录服务器。

腾讯云轻量应用服务器快照方法很简单,我们进入控制台,选择快照:

快照快照

创建快照:

创建快照创建快照

创建好以后,我们就可以放心升级OpenSSH了:

创建快照创建快照

所需工具

我们编译OpenSSH,所需工具:

  • OpenSSL:https://www.openssl.org/source/
  • Zlib:http://www.zlib.net/

同时,你需要有gcc编译器:

代码语言:txt复制
# CentOS
sudo yum install gcc
# Ubuntu/Debian
sudo apt-get install build-essential

其他编译,大家可以自己添加。本次分别使用腾讯云轻量应用服务器的CentOS镜像和Debian/Ubuntu镜像用于演示。

OpenSSL&Zlib

首先,我们需要编译OpenSSL和Zlib两个依赖库。

我们分开讲:

OpenSSL

首先是下载OpenSSL源码,这里我们选择最新的版本:

OpenSSL源码OpenSSL源码

我们使用wget进行下载,并用tar进行解压:

代码语言:txt复制
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar -xf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
下载-解压-进入下载-解压-进入

之后,我们进行预编译和编译安装:

代码语言:txt复制
# 配置
./config --prefix=/usr/local/openssl shared
# 编译
make
# 安装
make install 
安装完成安装完成
安装成功安装成功

Zlib

其次是编译Zlib的库,这里我们选择最新的版本:

最新版本最新版本

同样使用wget进行下载……

代码语言:txt复制
# 下载源码
wget http://www.zlib.net/zlib-1.2.11.tar.gz
# 解压
tar -xf zlib-1.2.11.tar.gz
# 进入源码目录
cd zlib-1.2.11
和OpenSSL一样和OpenSSL一样

之后,我们预编译和安装:

代码语言:shell复制
# 预编译
./configure --prefix=/usr/local/zlib
# 编译
make
# 安装
make install
编译安装编译安装

按道理不用添加其他东西,但是Debian再安装一下libz-dev:

代码语言:txt复制
# Debian/Ubuntu
sudo apt-get install libz-dev

之后,我们就可以开始编译OpenSSH了。

OpenSSH

编译OpenSSH还是有点讲究的。这里分DebianCentOS

Debian/Ubuntu

如果你的设备是Debian或者Ubuntu,可以按当前目录操作:

卸载旧版本

我们使用apt-get卸载自带的OpenSSH:

代码语言:txt复制
sudo apt-get pirge "openssh*"
卸载卸载

这样,我们编译的OpenSSH就不会和自带的旧版本OpenSSH冲突

编译OpenSSH

现在,我们还是需要和刚刚编译OpenSSL和Zlib一样,OpenSSH有很多的下载站,在官网可以看到:https://www.openssh.com/portable.html

下载站下载站

这里我们选择:https://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/这个下载站:

下载8.8版本下载8.8版本

和之前一样,wget下载:

代码语言:shell复制
# 下载源码
wget https://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/openssh-8.8p1.tar.gz
# 解压源码
tar -xf openssh-8.8p1.tar.gz
# 进入源码目录
cd openssh-8.8p1
下载源码下载源码

现在,我们可以开始编译安装:

代码语言:shell复制
# 编译配置
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh  --with-ssl-dir=/usr/local/openssl --with-zlib-dir=/usr/local/zlib --without-openssl-header-check
# 编译
make
# 安装
make install
编译编译

如果中途出现:configure: error: OpenSSL version header not found.这样的提示:

错误提示错误提示

这个一般是OpenSSL的软连接没有成功,我们连接一下:

代码语言:txt复制
ln -s /usr/local/openssl/lib64/libssl.so.3 /usr/lib/
ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib/

确保OpenSSL可以使用:

代码语言:txt复制
/usr/local/openssl/bin/openssl
OpenSSL可以正常使用OpenSSL可以正常使用

之后,我们使用手动启动一下OpenSSH,如果出现Privilege separation user sshd does not exist

问题问题

那么,我们需要添加内容到/etc/passwd

代码语言:javascript复制
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
添加的内容添加的内容

之后,可以启动SSH:

没有报错->启动成功没有报错->启动成功

最后,我们注册为服务:

代码语言:shell复制
vim /usr/lib/systemd/system/sshd.service
代码语言:javascript复制
[Unit]
Description=OpenSSH serve
Documentation=man:sshd(8) man:sshd_config(5)
#After=network.target sshd-keygen.service
#Wants=sshd-keygen.service
After=network.target

[Service]
#Type=notify
#EnvironmentFile=/etc/sysconfig/sshd
#ExecStart=/usr/local/openssh/sbin/sshd -D $OPTIONS
ExecStart=/usr/local/openssh/sbin/sshd
#ExecReload=/bin/kill -HUP $MAINPID
#KillMode=process
#Restart=on-failure
#RestartSec=42s

[Install]
WantedBy=multi-user.target
注册为服务注册为服务

最后,重载Systemctl,并设置为自启动,重启服务器即可:

代码语言:javascript复制
systemctl daemon-reload
systemctl enable sshd

第一次重启,时间比较长,需要耐心等待一下。之后就可以使用SSH进行连接了:

SSH连接成功SSH连接成功

CentOS

如果你的设备是CentOS,可以按当前目录操作:

卸载旧版本

我们使用rpm卸载旧版本的OpenSSH:

代码语言:javascript复制
rpm -e --nodeps `rpm -qa | grep openssh`
卸载成功卸载成功

这个时候,千万不要断开SSH远程连接,不然就只能去恢复快照了。

编译OpenSSH

现在,我们还是需要和刚刚编译OpenSSL和Zlib一样,OpenSSH有很多的下载站,在官网可以看到:https://www.openssh.com/portable.html

下载站下载站

这里我们选择:https://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/这个下载站:

下载8.8版本下载8.8版本

和之前一样,wget下载:

代码语言:javascript复制
# 下载源码
wget https://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/openssh-8.8p1.tar.gz
# 解压源码
tar -xf openssh-8.8p1.tar.gz
# 进入源码目录
cd openssh-8.8p1

下载源码下载源码

现在,我们可以开始编译安装:

代码语言:javascript复制
# 编译配置
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh  --with-ssl-dir=/usr/local/openssl --with-zlib-dir=/usr/local/zlib --without-openssl-header-check
# 编译
make
# 安装
make install
安装完成安装完成

如果出现这样的问题:configure: error: Your OpenSSL headers do not match your

问题问题

一般是系统OpenSSL和我们自己编译的OpenSSL版本不一样所致,我这就直接加参数忽略了:

代码语言:javascript复制
./configure --prefix=/usr/local/openssh --sysconfdir=/etc/ssh  --with-ssl-dir=/usr/local/openssl --with-zlib-dir=/usr/local/zlib --without-openssl-header-check
忽略忽略

配置SSH

现在,我们需要重新配置SSH。

复制命令文件

代码语言:javascript复制
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
复制文件复制文件

之后,复制启动文件:

代码语言:javascript复制
cp contrib/redhat/sshd.init /etc/init.d/sshd

复制启动文件复制启动文件

因为我们刚刚彻底删除了系统自带的SSH,所以我们需要重新配置:

代码语言:javascript复制
vim /etc/ssh/sshd_config

开放22端口、允许密码和Root用户远程登录:

配置配置

保存之后,我们重新载入一下Systemctl即可:

代码语言:javascript复制
systemctl daemon-reload
systemctl start sshd.service
systemctl enable sshd.service
重新载入和设置开机启动重新载入和设置开机启动

之后,等一下,即可重新连接服务器成功,并且OpenSSH更新完毕:

OpenSSH更新完成OpenSSH更新完成

END

现在,OpenSSH就已经更新完成了。后续的OpenSSH更新,就不需要用软件包管理器卸载OpenSSH,我们只需要到我们自己的源码包内,执行make uninstall,之后用相同的编译参数,重新编译安装即可(cp复制的东西不要忘记嗷)。

另外,更新后……轻量应用服务器自带的一键登录就无法使用了……不知道是不是腾讯云的问题……:

无法使用无法使用
尴尬尴尬

0 人点赞