Linux中: "通过编译安装的方式升级 OpenSSH 服务"
OpenSSH 升级背景:
因为当前操作系统上的 OpenSSH 是通过包管理工具进行安装,因为低版本存在漏洞问题,但是官方仓库中没有最新的 OpenSSH 版本,所以此时只能手动编译源码的方式来实现 OpenSSH 的升级。
因为服务器不是部署到本地,是通过 SSH 远程连接到服务器进行操作,所以还需要考虑,如果编译安装失败,不能影响旧版本的SSH服务,否则就要去机房接显示器操作了。
OpenSSH 刚开始是做为 OpenBSD 操作系统项目的一部分开发而来,后面因为其强大的功能和安全性,所以后面在标准 OpenSSH 的基础上进行了适配和移植,使得能够在其他类 Unix 系统上运行(portable 版本)
OpenSSH 编译流程:
步骤1:首先检查操作系统的OpenSSL 版本,需要保证 OpenSSL ≥ 1.1.1
OpenSSH的正常运行依赖 OpenSSL 或 LibreSSL,所以要编译安装,需要保证版本满足要求:
- 若系统使用的是 OpenSSL,需要保证 OpenSSL ≥ 1.1.1(常见Linux系统用的都是OpenSSL)
- 若系统使用的是 LibreSSL ,需要保证 LibreSSL ≥ 3.1.0(OpenBSD 默认就是 LibreSSL)

步骤2:下载 OpenSSH 的源码并上传到服务器解压
下载OpenSSH 源码的时候要注意,OpenSSH 有两个源码版本:
- OpenBSD 版本:只能 OpenBSD 系统使用,特征就是源码包不携带p后缀。
- 可移植版本:增加了平台兼容性代码,可以在非OpenBSD系统上运行,特征就是源码包会携带p后缀
OpenSSH 源码包的下载地址:
- OpenSSH 官网:https://www.openssh.org/( 官网提供多个不同地区的镜像站点来下载源码包,选择一个合适的就行了)
- 阿里云下载地址:https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/


步骤3:生成 Makefile 文件
./configure --prefix=/usr/local/ssh_10.2 --sysconfdir=/etc/ssh_10.2
OpenSSH 常用的参数如下:
- --prefix:指定openssh的程序存放路径,不指定默认就是 /usr/local;
- --exec-prefix:指定可执行程序的存放位置,不指定默认就是 --prefix 指定路径下的bin 和 sbin 目录;
- --sysconfdir:指定配置文件存放路径,如果该目录下有文件,不会覆盖;不指定默认在 PREFIX/etc
- --sbindir:指定需要管理员权限才能执行的二进制文件路径,也就是sshd的位置,默认在EPREFIX/sbin
- --bindir:指定普通用户都有权限执行的二进制文件路径,也就是ssh、scp等的位置,默认在EPREFIX/bin
- --with-pid-dir:指定pid文件的路径,不指定默认是 /var/run/sshd.pid

步骤4:编译源码和安装
make -j$(nproc) && sudo make install

步骤5:修改 ssh 服务的配置文件
因为需要和当前系统上旧版本的 OpenSSH 服务并行运行,所以新版本的配置文件中,一般需要修改以下几个字段:
- Port 2222 # 指定ssh服务使用的端口号,不要和现有的ssh服务监听的端口冲突。
- PidFile /var/run/sshd.pid # 指定主进程pid文件的路径
- UseDNS no # 禁用DNS反向查找,优化连接速度
- GSSAPIAuthentication no # 禁用GSSAPI认证,优化连接速度

步骤6:准备 service 服务的配置文件
# /etc/systemd/system/ssh_10.2.service
[Unit]
Description=OpenSSH Server 10.2
After=network.target
Wants=network.target
[Service]
Type=notify
ExecStartPre=/usr/local/ssh_10.2/sbin/sshd -t -f /etc/ssh_10.2/sshd_config
ExecStart=/usr/local/ssh_10.2/sbin/sshd -D -f /etc/ssh_10.2/sshd_config
ExecReload=/usr/local/ssh_10.2/sbin/sshd -t -f /etc/ssh_10.2/sshd_config
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
RestartSec=3s
[Install]
WantedBy=multi-user.target
因为编译源码的时候使用 --sysconfdir 指定了配置文件默认路径,所以这里不使用 -f 指定路径也可以,加了更直观而已。
sshd -t :检查配置文件的语法是否正确
sshd -D:sshd默认是以守护进程的模式运行,sshd -D 是用于 systemd 管理模式,让 sshd 不要 fork,而是在前台运行,便于 systemd 追踪
/bin/kill -HUP $MAINPID:用来支持
systemctl reload ssh操作,修改配置文件后,执行这个命令可以让配置生效。KillMode=process:就是重启或停止ssh服务的时候,已经创建的ssh连接不会受到影响。

步骤7:检查新版本 OpenSSH 服务正常后,停止旧版本OpenSSH
新版本 OpenSSH 服务正常运行后,旧版本不要删除,只要禁止旧服务自动启动即可,等完全稳定后再考虑清楚旧版本OpenSSH的相关文件。
防止 SSH 一旦坏了后无法登录服务器,这样还要跑到机房里面去插显示器操作。

浙公网安备 33010602011771号