目录
- 为什么要升级ssh
- 怎么查看CVE
- 如何查找新版本的openssh
- OpenSSH
- 升级ssh步骤
- 1. 下载源码包
- 2. 备份旧文件防止升级失败
- 3. 停止并卸载旧ssh
- 4. 解压、编译、编译安装新ssh
- 5. 修改systemd文件以便systemctl使用sshd
- 6. 测试
为什么要升级ssh
openssh作为使用最为广泛的linux下ssh程序,一旦被挖掘出危险漏洞(CVE)就很容易影响生产、资产的安全,因此即使根据披露出的CVE找到对应的解决方法很关键。
而升级openssh版本,是解决cve一个最方便最有效的方法之一。
怎么查看CVE
可以通过各大厂商的cve披露网站,如阿里云的:阿里云漏洞库
这个网站披露了很多CVE漏洞,并提供了一定的解决方法,如搜索openssh的cve
:
如上图,就推荐将openssh升级到9.8p1
的版本。
升级ssh有两种方式:
- 第一种:找到对应版本的rpm包,直接通过rpm工具进行升级。
- 第二种:通过下载官网最新的源码包,通过源码包升级。
rpm包和源码包最大的区别就在于,源码包是
实时更新
的,而且可以自定义安装路径和功能
。如果要想下载最新版本的软件,最好是通过源码包进行编译安装。
这里的升级OpenSSH我们将使用源码包进行升级。
同时操作系统的环境为openEuler22.03sp2
如何查找新版本的openssh
那么如何搜索到最新的/需要的软件版本?
也推荐使用各大厂商的镜像站,如阿里云的:阿里巴巴开元镜像站
OpenSSH
openssh实际是openBSD
下的一个运用广泛的ssh实现,因此openssh是挂载openBSD之下的。
我们可以通过在镜像站搜索openbsd后查找到openssh
:
进入openssh后,还有两种不同的tar.gz的源码包:
- 在
openbsd/openssh/
下的这个源码包,是openbsd架构的版本包; - 在
openbsd/openssh/portable/
下的这个源码包,是可移植的openssh源码包,我们使用这个,便于在openEuler中使用。
这个就是我们待会需要安装的源码包,右键复制链接
在OpenBSD的源代码树中,
openssh
是一个经常被提及的例子,因为它是一个广泛使用的开源安全外壳协议(SSH)的实现,而且它确实具有很好的可移植性。如果你在portable/
目录下发现了一个openssh
的tar.gz
包,同时在它的父目录也有一个tar.gz
包,这可能有以下几个原因:
- OpenBSD版本与可移植版本:
- 在
portable/
目录下的tar.gz
包通常包含了openssh
的可移植代码,这意味着这个包是为了在其他类Unix系统上编译和运行openssh
而准备的。它包含了必要的兼容性层和补丁,使得openssh
能够在不同的操作系统上工作。- 在
portable/
目录的父目录(可能是src/
目录下的某个位置)的tar.gz
包可能是OpenBSD专用的openssh
版本。这个版本可能包含了特定于OpenBSD的特性和优化。- 版本差异:
- 有时候,
portable/
目录下的tar.gz
包可能代表了一个较旧或者较新的版本,而父目录下的包则是为OpenBSD当前版本特别维护的版本。这种情况可能发生在OpenBSD的开发过程中,当上游的openssh
有更新时,OpenBSD的开发者可能还没有将这些更新应用到他们的系统上。- 维护和更新流程:
- OpenBSD的开发者可能会定期从
portable/
目录下的可移植版本更新OpenBSD专用的openssh
包。这意味着portable/
目录下的包可能是一个参考点,用于将更新和修复合并到OpenBSD的官方版本中。- 构建和分发:
- 在构建过程中,可能需要从
portable/
目录下的包中提取代码,然后应用OpenBSD特定的补丁和配置,以生成最终的包,这个包会被放在父目录下。
总之,这两个tar.gz
包的存在是为了满足不同的需求:一个是通用的、可移植的openssh
版本,另一个是专门为OpenBSD优化的版本。用户和系统管理员可以根据自己的需求选择使用哪个包。
升级ssh步骤
1. 下载源码包
wget https://mirrors.aliyun.com/openssh/portable/openssh-9.8p1.tar.gz
# 该路径如何获取已在上一部分进行了介绍
# 这种方式需要你的主机能访问公网,本文介绍的是公有云主机,因此可以访问公网
基本上本机上有成功运行的ssh时,不会缺少运行ssh的软件包
openssl-devel zlib-devel
。
但是源码安装,需要gcc、make等包,没有的话需要安装yum install -y gcc make
2. 备份旧文件防止升级失败
mkdir /tmp/ssh-bak
cd /tmp/ssh-bak/
[rcp -a /etc/ssh .
cp -a /etc/pam.d .
cp -a /usr/lib/systemd/system/sshd.service .
cp -a /usr/bin/ssh ./ssh.bak
cp -a /usr/sbin/sshd ./sshd.bak
[root@ecm-98ce ssh-bak]# ls
pam.d ssh ssh.bak sshd.bak sshd.service
# /etc/ssh为ssh的核心配置目录
# /etc/pam.d/sshd为ssh是否支持pam认证
# /usr/lib/systemd/system/sshd.service是ssh的服务单元配置文件,可以使用systemd管理
# /usr/bin/ssh 是ssh的可执行文件
# 以上最核心的是/etc/ssh,保存你的系统原来的所有ssh配置信息
由于是云主机,修改过默认是ssh端口,因此查看一下ssh的端口以便后续直接使用而不用放行安全组
cat /etc/ssh/sshd_config | grep -i port
3. 停止并卸载旧ssh
systemctl stop sshd
# 注意,停止后需要退出已经登陆着的用户,才可以完全停止ssh
rpm -e --nodeps `rpm -qa | grep openssh`
# 先查询openssh的已安装文件,再忽略依赖关系强制卸载
4. 解压、编译、编译安装新ssh
如果无法安装,可能需要升级openssl和zlib等相关依赖的版本
# 解压
tar -xvf openssh-9.8p1.tar.gz
# 进入目录
cd openssh-9.8p1/
# 预编译
./configure --prefix=/usr --sysconfdir=/etc/ssh
# --prefix=/usr 指定二进制程序安装路径
# --sysconfdir 指定主配置文件安装路径
# 这一步会检查当前系统的工具和依赖,如果没有通过请安装对应的工具和依赖再执行一次
# 编译
make
# 编译安装
make install
如果在编译时出现以下报错,可能的原因是密钥文件权限过大,可以修改成600再编译
chmod 600 /etc/ssh/ssh*key
可以通过ssh -V
查看已经安装成功
5. 修改systemd文件以便systemctl使用sshd
将之前备份的systemd的sshd.service文件拷贝回原本的位置
cp /tmp/ssh-bak/sshd.service /usr/lib/systemd/system/
6. 测试
在/etc/ssh/sshd_config中,修改Port为升级前原本记录下来的ssh服务端口,即可不用开22的安全组就能直接访问(前提:之前已经开放了对应Port的安全组条目permit权限)
# 修改ssh端口
echo "Port xxxxx" >> /etc/ssh/sshd_config
# 允许root远程登录
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
# 重启服务
systemctl restart sshd
使用远程登陆工具成功ssh登录云主机,试验结束。