软件更新-openssh

0 阅读6分钟

说明

采用手动编译代码方式,将操作系统的ssh和sshd更新到指定版本。

应知晓并接受更新ssh和sshd版本会导致其他软件存在不可用风险,应避免对openssl进行操作。

文档说明

默认在联网环境更新。

注意:离线环境需下载各软件包到主机环境,避免操作时缺少软件且无法上传软件至系统。请通读文档,将所有用到的文件提前上传至系统内。

本文以联网环境的云主机为例,操作系统Ubuntu24 LTS,其他发行版需调整命令和软件包名称。

思路

确保系统可以持久访问

环境检查,确认当前版本。选择期望部署的新版本。

卸载旧版,备份旧配置文件,清空旧版软件和配置。

安装新版。下载指定版本新版代码包,参考本文或官网文档安装。

配置服务持久化,使ssh持久可用。重启系统确保ssh持久可用。

访问测试。ssh自己,其他主机ssh当前主机。

参考资料

软件下载:https://www.openssh.org/portable.html

安装说明:https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/INSTALL

访问系统

应确保可持续访问操作系统,不应使用telnet和ssh,操作过程会出现会话终端,引入telnet会使系统增加安全风险。

下图所示,借助云平台的远程访问功能,在web界面访问云主机。

image-20260303131926612

主机需硬件管理界面,下图所示,主机应配置硬件管理端口并正式启用,若无,则使用外接显示器和键盘,后续操作将困难。

image-20260303132026574

下图所示,

image-20260303132255891

检查环境

升级前检查,确认当前版本。确认现有资源。

检查现有软件版本

ssh -V
sshd -V

下图所示,注意,openssh和openssl是不同的东西。若更新openssl,将影响整个系统,应确保有专业的系统运维提供技术保障,否则会导致系统及部署的软件彻底不可用。

image-20260303132809042

查询操作系统版本

cat /etc/os-release

下图所示,

image-20260303133639920

检查命令路径

which -a ssh
which -a sshd

下图所示,

image-20260303133806689

确认文件类型,部分环境可能是软链接。

image-20260303133908084

查看服务状态

systemctl status ssh

下图所示,

image-20260303134046205

查看配置文件

查看并备份现有配置文件。

mkdir -p /opt/backup/{ssh,pam}
cp -r /etc/ssh/* /opt/backup/ssh
cp -r /etc/pam.d/* /opt/backup/pam

下图所示,

image-20260304101351185

删除旧版本openssh

定位安装信息

dpkg -l | grep openssh

下图所示,Ubuntu默认软件包形式安装,若代码编译安装,则应直接删除安装时配置过的文件和目录,及服务配置文件。

image-20260303134854544

删除旧版软件包,注意,删除后,ssh将不可用。

apt remove -y --purge openssh-client openssh-server
apt autoremove -y
apt clean

确认已删除

ssh -V
sshd -V
which -a ssh
which -a sshd

下图所示,卸载后仍有部分残留文件,无影响,

image-20260304102443791

安装新版本openssh

下载软件

浏览器访问https://www.openssh.org/portable.html

找到期望下载的版本,此处以当前最新版本10.2.p1为例。获取软件下载地址https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz

cd /opt
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.2p1.tar.gz

下图所示,

image-20260303135754827

解压文件

tar -zxf openssh-10.2p1.tar.gz

下图所示,

image-20260303135823748

安装基础软件

更新软件源

apt update

安装编译必须的软件

apt install -y build-essential autoconf automake libtool pkg-config

安装编译必须的依赖库

apt install -y zlib1g-dev libssl-dev libpam0g-dev

安装扩展功能支持库(可选,推荐)

apt install -y libedit-dev libselinux1-dev libkrb5-dev libldap2-dev

安装FIDO2支持(可选)

apt install -y libfido2-dev libcbor-dev

安装 LDNS(DNSSEC 支持)(可选)

apt install -y libldns-dev

配置专用账户

sshd必须使用专用账户,是软件强制限制。

adduser --system --group --no-create-home --home /var/lib/sshd sshd
mkdir -p /var/lib/sshd

编译代码

切换目录到openssh文件解压后的目录,例如

cd /opt/openssh-10.2p1

配置代码,推荐参数如下,可参考官方文档调整,

./configure \
  --sysconfdir=/etc/ssh \
  --with-pam \
  --with-privsep-path=/var/lib/sshd \
  --with-md5-passwords \
  --with-ssl-dir=/usr \
  --with-default-path='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

若不想自定义参数,可使用默认命令

./configure

编译源码,根据CPU情况自选,

多CPU核心编译,可加速编译过程,

make -j$(nproc)

非多CPU核心编译,需较长时间等待,

make

安装

make install

配置服务持久化

创建文件/etc/systemd/system/ssh.service,添加以下内容,自选其中一个,

注意:ssh.service`是服务名称。Ubuntu官方推荐。

参考1:阿里巴巴推荐

[Unit]
Description=OpenBSD Secure Shell server
After=network.target nss-lookup.target

[Service]
Type=simple
ExecStart=/usr/local/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5s
KillMode=process
PrivateTmp=true
ProtectSystem=full
ProtectHome=read-only

[Install]
WantedBy=multi-user.target

参考2:字节跳动推荐

先配置专用文件

echo "SSHD_OPTS=""" > /etc/default/ssh

做配置服务文件

[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
Type=notify
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/local/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
SuccessExitStatus=0 1

[Install]
WantedBy=multi-user.target
Alias=sshd.service

参考3:Ubuntu官方推荐

[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/local/sbin/sshd -t
ExecStart=/usr/local/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/local/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

加载服务

systemctl daemon-reload

启动服务,配置服务持久生效

systemctl start ssh
systemctl enable ssh

重启系统验证

reboot

检查验证

注意,需要修改ssh配置文件才能访问ssh服务。

ssh自己验证

image-20260304104436277

若遇到当前环境ssh不可用,清空旧的bash缓存,

hash -r

在其他节点ssh当前节点验证

配置文件

image-20260303141902265

检查端口占用

lsof -i :22
ss -tulpn | grep ':22'

卸载

编译安装后,若需卸载,可使用以下命令

systemctl stop ssh
systemctl stop sshd
pkill -9 sshd
pkill -9 ssh
systemctl stop ssh.socket
systemctl disable ssh.socket
make clean
make uninstall

重置ssh服务状态

systemctl reset-failed ssh

其他参考

检查配置文件语法

/usr/local/sbin/sshd -t 

清理进程

fuser -k 22/tcp
pkill -9 sshd

确认端口在卸载软件时被释放

ss -tulpn | grep ':22'

查看服务详情

journalctl -xeu sshd.service

image-20260303104618151.png

image-20260303104942049.png

image-20260303131926612.png

image-20260303132026574.png

image-20260303132255891.png

image-20260303132809042.png

image-20260303133639920.png

image-20260303133806689.png

image-20260303133908084.png

image-20260303134046205.png

image-20260303134317678.png

image-20260303134427439.png

image-20260303134854544.png

image-20260303135132086.png

image-20260303135212805.png

image-20260303135754827.png

image-20260303135823748.png

image-20260303141902265.png

image-20260304101351185.png

image-20260304102443791.png

image-20260304104436277.png