信创环境 OpenSSH 源码编译升级:复制就能用(炸了不负责)
背景
信创项目,操作系统厂商只提供初始镜像,不提供 OpenSSH 更新包。安全扫描报 SSH 漏洞,必须升级。但 SSH 太底层——编译装错了,SSH 连不上,人直接锁在外面,只能去机房。
大部分运维只会 yum install / apt install,源码编译升级 SSH 的资料要么太旧要么漏步骤。以下是我实际跑通的流程,先在测试机验证再上生产。
前置条件
- 有 root 权限
- 能连外网或已下载源码包
- 强烈建议:开一个 tmux/screen 会话,断连了还能接回来
升级步骤
1. 安装编译依赖
apt-get update # 更新软件源索引
apt-get install -y build-essential libssl-dev zlib1g-dev libpam0g-dev # 编译工具链 + SSL + 压缩 + PAM 认证库
libssl-dev:OpenSSH 依赖 OpenSSL,必须有头文件和静态库libpam0g-dev:如果你要保留 PAM 认证(大部分信创系统需要)
2. 下载源码
cd ~ # 切到 home 目录,别在 /tmp 干(重启可能丢)
wget -O openssh-10.3p1.tar.gz https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.3p1.tar.gz # 下载源码包,版本号仅为示例,请自行替换为最新版
版本号按需替换,去 www.openssh.com/portable.ht… 看最新版 信创 ARM 环境如果连不上外网,在 x86 机器下载后 scp 过去
3. 解压
tar xf openssh-10.3p1.tar.gz # 解压,xf 安静模式不刷屏
cd openssh-10.3p1 # 进入源码目录
4. 配置编译选项
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-privsep-path=/var/lib/sshd # 配置安装路径和关键目录
--prefix=/usr:可执行文件装到 /usr/bin,覆盖系统自带版本--sysconfdir=/etc/ssh:配置文件放 /etc/ssh,和系统原有路径一致--with-privsep-path=/var/lib/sshd: privilege separation 目录,SSH 安全机制需要
如果 configure 报错缺依赖,看报错信息装对应的 -dev 包。
5. 编译
make -j"$(nproc)" # 编译,-j 用所有 CPU 核心加速
$(nproc)自动获取 CPU 核心数,4 核就 -j4,8 核就 -j8
6. 安装
make install # 安装到 /usr/bin、/usr/sbin 等
这步会覆盖系统自带的 sshd,但不会动 /etc/ssh/sshd_config(配置文件只在首次安装时生成)
7. 验证
ssh -V && /usr/sbin/sshd -V # 检查版本号,两个都看
ssh -V:客户端版本/usr/sbin/sshd -V:服务端版本 两个版本应该一致,如果不一致说明 PATH 里有旧版
8. 重启服务
systemctl restart ssh # 重启 SSH 服务加载新版本
千万别关窗口! 重启后先开一个新终端测试能不能连上,确认没问题再关旧终端
回滚方案
如果重启后连不上(真的会这样):
- 机房直连:接显示器键盘,手动回滚
- 提前备份:升级前先
cp /usr/sbin/sshd /usr/sbin/sshd.bak,炸了用旧二进制启动 - 测试机先跑:在非生产环境完整跑一遍,确认
ssh -V和连接都正常
信创 ARM 注意事项
- 源码编译本身就是跨平台的,ARM 上步骤一样
- 如果 OpenSSL 也是手动编译的,configure 时可能需要加
--with-ssl-dir=/usr/local/ssl指定路径 - 部分信创系统用
yum/dnf而非apt,依赖包名不同:openssl-devel/zlib-devel/pam-devel
一键脚本(测试机用,生产别直接跑)
apt-get update && apt-get install -y build-essential libssl-dev zlib1g-dev libpam0g-dev && \
cd ~ && \
wget -O openssh-10.3p1.tar.gz https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.3p1.tar.gz && \
tar xf openssh-10.3p1.tar.gz && \
cd openssh-10.3p1 && \
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-privsep-path=/var/lib/sshd && \
make -j"$(nproc)" && \
make install && \
ssh -V && /usr/sbin/sshd -V && \
systemctl restart ssh