Linux上如何手动编译升级/安装OpenSSH版本 |
您所在的位置:网站首页 › 离线升级openssh81 › Linux上如何手动编译升级/安装OpenSSH版本 |
「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。 作者:Mintimate 博客:www.mintimate.cn Mintimate's Blog,只为与你分享 CVE-2021-41617漏洞有小伙伴问,如何解决CVE-2021-41617漏洞漏洞?增加我Linux服务器的安全性: 解决方法:升级到OpenSSH最新安全版本。 但是,升级OpenSSH有一点小坑,一不留神,甚至会找出无法SSH远程登录的尴尬局面。本次教程就教大家避免踩坑,安全地升级我们的Linux服务器OpenSSH。 OpenSSHOpenSSH(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远程登录服务器。 腾讯云轻量应用服务器快照方法很简单,我们进入控制台,选择快照: 如果你想本地Linux测试虚拟机内尝试,可以,比如VMware内,可以这样: 创建好以后,我们就可以放心升级OpenSSH了。 所需工具我们编译OpenSSH,所需工具: OpenSSL:www.openssl.org/source/ Zlib:www.zlib.net/同时,你需要有gcc编译器: # CentOS sudo yum install gcc # Ubuntu/Debian sudo apt-get install build-essential其他编译,大家可以自己添加。本次分别使用Debian镜像和CentOS镜像分别用于演示。 OpenSSL&Zlib首先,我们需要编译OpenSSL和Zlib两个依赖库。 我们分开讲: OpenSSL首先是下载OpenSSL源码,这里我们选择最新的版本: 我们使用wget进行下载,并用tar进行解压: wget https://www.openssl.org/source/openssl-1.1.1m.tar.gz tar -xf openssl-1.1.1m.tar.gz cd openssl-1.1.1m之后,我们进行预编译和编译安装: # 配置 ./config --prefix=/usr/local/openssl shared # 编译 make # 安装 make install其次是编译Zlib的库,这里我们选择最新的版本: 同样使用wget进行下载…… # 下载源码 wget http://www.zlib.net/zlib-1.2.11.tar.gz # 解压 tar -xf zlib-1.2.11.tar.gz # 进入源码目录 cd zlib-1.2.11之后,我们预编译和安装: # 预编译 ./configure --prefix=/usr/local/zlib # 编译 make # 安装 make install按道理不用添加其他东西,但是Debian再安装一下libz-dev: # Debian/Ubuntu sudo apt -y install libz-dev之后,我们就可以开始编译OpenSSH了。 OpenSSH编译OpenSSH还是有点讲究的。这里分Debian和CentOS: Debian/Ubuntu如果你的设备是Debian或者Ubuntu,可以按当前目录操作: 卸载旧版本我们使用apt-get卸载自带的OpenSSH: sudo apt purge --remove "openssh*"
现在,我们还是需要和刚刚编译OpenSSL和Zlib一样,OpenSSH有很多的下载站,在官网可以看到:www.openssh.com/portable.ht… 这里我们选择:mirror.leaseweb.com/pub/OpenBSD…这个下载站: 和之前一样,wget下载: # 下载源码 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
如果中途出现:configure: error: OpenSSL version header not found.这样的提示: 这个一般是OpenSSL的软连接没有成功,我们连接一下: ln -s /usr/local/openssl/lib64/libssl.so.3 /usr/lib/ ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib/确保OpenSSL可以使用: /usr/local/openssl/bin/openssl version之后,我们使用手动启动一下OpenSSH /usr/local/openssh/sbin/sshd如果出现Privilege separation user sshd does not exist: 那么,我们需要添加内容到/etc/passwd: sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin之后,可以启动SSH: 最后,我们注册为服务: vim /usr/lib/systemd/system/sshd.service [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,并设置为自启动,重启服务器即可: systemctl daemon-reload systemctl enable sshd
如果你的设备是CentOS,可以按当前目录操作: 卸载旧版本我们使用rpm卸载旧版本的OpenSSH: rpm -e --nodeps `rpm -qa | grep openssh`这个时候,千万不要断开SSH远程连接,不然就只能去恢复快照了。 编译OpenSSH现在,我们还是需要和刚刚编译OpenSSL和Zlib一样,OpenSSH有很多的下载站,在官网可以看到:www.openssh.com/portable.ht… 这里我们选择:mirror.leaseweb.com/pub/OpenBSD… 和之前一样,wget下载: # 下载源码 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现在,我们可以开始编译安装: # 编译配置 ./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版本不一样所致,我这就直接加参数忽略了: ./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。 复制命令文件 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之后,复制启动文件: cp contrib/redhat/sshd.init /etc/init.d/sshd因为我们刚刚彻底删除了系统自带的SSH,所以我们需要重新配置: vim /etc/ssh/sshd_config开放22端口、允许密码和Root用户远程登录: 保存之后,我们重新载入一下Systemctl即可: systemctl daemon-reload systemctl start sshd.service systemctl enable sshd.service
现在,OpenSSH就已经更新完成了。后续的OpenSSH更新,就不需要用软件包管理器卸载OpenSSH,我们只需要到我们自己的源码包内,执行make uninstall,之后用相同的编译参数,重新编译安装即可(cp复制的东西不要忘记嗷)。 另外,虽然分了Debian和CentOS两个不同操作。其实两个操作是互通的。只是CentOS方法为了兼容CentOS6,使用这样保守的配置方法。 CentOS也就有自己写systemctl的Unit,Debian也可以直接cp配置文件。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |