说明
采用手动编译代码方式,将操作系统的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界面访问云主机。
主机需硬件管理界面,下图所示,主机应配置硬件管理端口并正式启用,若无,则使用外接显示器和键盘,后续操作将困难。
下图所示,
检查环境
升级前检查,确认当前版本。确认现有资源。
检查现有软件版本
ssh -V
sshd -V
下图所示,注意,openssh和openssl是不同的东西。若更新openssl,将影响整个系统,应确保有专业的系统运维提供技术保障,否则会导致系统及部署的软件彻底不可用。
查询操作系统版本
cat /etc/os-release
下图所示,
检查命令路径
which -a ssh
which -a sshd
下图所示,
确认文件类型,部分环境可能是软链接。
查看服务状态
systemctl status ssh
下图所示,
查看配置文件
查看并备份现有配置文件。
mkdir -p /opt/backup/{ssh,pam}
cp -r /etc/ssh/* /opt/backup/ssh
cp -r /etc/pam.d/* /opt/backup/pam
下图所示,
删除旧版本openssh
定位安装信息
dpkg -l | grep openssh
下图所示,Ubuntu默认软件包形式安装,若代码编译安装,则应直接删除安装时配置过的文件和目录,及服务配置文件。
删除旧版软件包,注意,删除后,ssh将不可用。
apt remove -y --purge openssh-client openssh-server
apt autoremove -y
apt clean
确认已删除
ssh -V
sshd -V
which -a ssh
which -a sshd
下图所示,卸载后仍有部分残留文件,无影响,
安装新版本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
下图所示,
解压文件
tar -zxf openssh-10.2p1.tar.gz
下图所示,
安装基础软件
更新软件源
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自己验证
若遇到当前环境ssh不可用,清空旧的bash缓存,
hash -r
在其他节点ssh当前节点验证
配置文件
检查端口占用
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