2021年4月Centos7 更新OpenSSH 至 OpenSSH_8.6
由于对旧版本的OpenSSH执行了安全检查后发现了潜在漏洞, 因此需要升级OpenSSH至最新版本。实际上认为升级操作相对简单, 依仗网上的指导未能完成操作。于是乎决定撰写一份较为详尽的操作指南, 探讨这一技术难点所在
环境
升级前的环境如下:
| 项目 | Value |
|---|---|
| 操作系统 | CentOS Linux release 7.9.2009 (Core) |
| 软件 | OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 |
升级准备
下载
可以通过以下途径获取文件:openssh-8.6p1.tar.gz;同时可通过该链接获取最新版本:https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/

openssl-1.1.1k.tar.gz
https://ftp.openssl.org/source/
把文件上传到将要升级的服务器。
我的文件位置如下:
[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# ls
openssh-8.6p1.tar.gz
openssl-1.1.1k.tar.gz
留一手
在已经建立的SSH通道下,即使卸载SSH服务,现有的会话仍能正常运行。尽管卸载了SSH服务,但原有的会话依然有效。但是,若试图开启新的SSH通道则无法成功。具体原理尚不明确,这是通过实际操作得出的结论。
在进行ssh升级的过程中,已经连接上的SSH连接不会断开。
如果您的操作本身就是基于SSH远程访问的,建议最好多准备一个通道,以确保不会因SSH升级失败而导致服务器中断。
请注意升级执行前的相关事宜;特别提醒您在操作前确保自身能够通过多种方式远程访问服务器。例如:请务必确认您不仅可以通过SSH还应具备其他远程访问服务器的方式。
请注意升级执行前的相关事宜;特别提醒您在操作前确保自身能够通过多种方式远程访问服务器。例如:请务必确认您不仅可以通过SSH还应具备其他远程访问服务器的方式。
- 端口 Telnet 服务 可以参考《CentOS7 安装 配置 Telnet 服务器》<>
- 远程 连接 VNC 服务器 可以参考 《Centos7 安装 配置 VNC 服务器 - Xfce 篇》 <>
如果不想那么麻烦,建议在升级之前多连接几个ssh会话,备用。
安装依赖项软件包(后续升级需要)
yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel
yum install -y pam* zlib*
注脚(仅针对非zsh用户的注释)
升级openssl
在执行某个操作之前,请确保当前系统的日期和时间是正确的吗?因为我之前就是因为设置的时间不正确导致安装出现问题而浪费了宝贵的时间。
cd /tmp
tar -zxvf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
./config --prefix=/usr/local/openssl
# 如果为0则没有报错,如果报错则要解决错误
echo $?
make
# 如果为0则没有报错,如果报错则要解决错误
echo $?
make install
# 如果为0则没有报错,如果报错则要解决错误
echo $?
#备份
mv /usr/bin/openssl /usr/bin/openssl.bak
# 创建软链接
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
# Write in openssl Search Path for Library Files
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
# Set up/etc/ld.so.conf Take effect
ldconfig -v
# 查询openssl版本
openssl version
此时我们已经成功安装了openssl了
[root@localhost openssl-1.1.1k]# openssl version
OpenSSL 1.1.1k 25 Mar 2021
升级openssh
安装
#备份ssh目录
cp -r /etc/ssh /etc/ssh.bak
cd /tmp
tar -zxvf openssh-8.6p1.tar.gz
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
# 如果为0则没有报错,如果报错则要解决错误
echo $?
make && make install
# 如果为0则没有报错,如果报错则要解决错误
echo $?
赋权:
chmod 600 /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ed25519_key
配置
vim /etc/ssh/sshd_config
相关配置修改成下面这样子
PasswordAuthentication yes
UseDNS no
PermitRootLogin yes
为了让root能够进行登录操作。为此需要对#PermitRootLogin字段进行相应的配置调整。具体来说需要更改PermitRootLogin项中的prohibit-password设置并移除注释标记将该字段设为yes状态这样就能实现root用户的登录权限了
其他操作
cd /tmp/openssh-8.6p1
#备份
mv /etc/init.d/sshd /etc/init.d/sshd.bak
# 使用新版本的执行文件
cp -a contrib/redhat/sshd.init /etc/init.d/sshd
# 不管它不存在
cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
# 添加非root用户安装所需的执行权限
sudo chmod +x /etc/init.d/sshd
# 将sshd服务设置为启动
chkconfig --add sshd
#允许sshd服务自启动
systemctl enable sshd
# 删除或删除原始的sshd文件。 否则,会影响sshd服务重启
mv /usr/lib/systemd/system/sshd.service /tmp
验证
#查看服务运行级别
chkconfig sshd
#验证启动是否正常
/etc/init.d/sshd restart
/etc/init.d/sshd stop
/etc/init.d/sshd start
systemctl restart sshd
systemctl stop sshd
systemctl start sshd
检验
本地查版本
理论上这样查只是查客启端的版本信息。
ssh -V
OpenSSH_8.6p1, OpenSSL 1.1.1k 25 Mar 2021
安全工具查版本信息
Nmap安全检测
通过指定-p参数可设置目标端口号;通过-sV参数可获取该服务版本的信息;目标IP地址为x.x.x.x。
运行扫描脚本nmap -p 22 -sV x.x.x.x$
在扫描过程中识别出目标系统,在其上打开了端口号22,并发现该服务是SSH功能,并支持OpenSSH版本8.6
我的扫描结果如下:
$ nmap -p 22 -sV 172.16.184.5 [17:14:39]
Starting Nmap 7.91 ( https://nmap.org ) at 2021-04-23 17:14 CST
Nmap scan report for 172.16.184.5
Host is up (0.00069s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.6 (protocol 2.0)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 4.56 seconds
说明服务端也成功升级到OpenSSH 8.6,我们已经成功升级啦!
参考
https://programmer.ink/think/centos7-upgrades-openssh-to-openssh_8.0p1.html
