OpenSSH 10.5p1 - openEuler RPM 打包项目
概述
本项目基于 openEuler 系统环境,对 OpenSSH 10.5p1 源码进行 RPM 打包构建。支持 openEuler 22.03 LTS 和 24.03 LTS。
项目结构
openssh/
├── openssh-10.5p1.tar.gz # OpenSSH 10.5p1 源码包
├── openssh.spec # RPM 规范文件(当前版本:10.5p1)
├── openssh-10.4p1.spec # RPM 规范文件(历史版本:10.4p1)
├── openssh-v10.3p1.spec # RPM 规范文件(历史版本:10.3p1)
├── openssh-v10.2p1.spec # RPM 规范文件(历史版本:10.2p1)
├── build.sh # 自动构建脚本
├── sshd.pam # PAM 配置
├── sshd.service # Systemd 服务单元
├── sshd.sysconfig # 服务环境变量配置
├── sshd_config # 自定义 SSH 服务端配置
└── README.md # 本文档
构建产物
| RPM 包名 | 说明 | 包含内容 |
|---|
openssh | 核心包 | ssh-keygen, ssh-keysign, moduli |
openssh-clients | 客户端包 | ssh, scp, sftp, ssh-agent, ssh-add, ssh-keyscan, ssh-copy-id, ssh-pkcs11-helper, ssh-sk-helper |
openssh-server | 服务端包 | sshd, sshd-auth, sshd-session, sftp-server, Systemd 服务, PAM 配置 |
openssh-askpass | 图形密码对话框 | gnome-ssh-askpass, profile.d 脚本 |
openssh-help | 文档和 man 手册 | 所有 man 手册页和文档 |
环境要求
支持的操作系统
| 系统 | 版本 | 架构 |
|---|
| openEuler | 22.03 LTS | x86_64, aarch64 |
| openEuler | 24.03 LTS | x86_64, aarch64 |
| openEuler | 24.09 | x86_64, aarch64 |
完整依赖清单
构建依赖 (BuildRequires)
| 包名 | 版本要求 | 用途 |
|---|
| autoconf | - | 重新生成 configure 脚本 |
| automake | - | 自动生成 Makefile |
| gcc | - | C 编译器 |
| make | - | 构建工具 |
| dos2unix | - | 转换换行符 |
| groff | - | 格式化 man 手册 |
| util-linux | - | 基础工具集 |
| perl-interpreter | - | Perl 解释器(构建脚本辅助) |
| perl-generators | - | Perl 依赖生成器 |
| perl-podlators | - | POD 格式转换 |
| zlib-devel | - | 压缩库 |
| openssl-devel | >= 1.1.1 | SSL/TLS 加密库 |
| pam-devel | - | PAM 认证框架 |
| libselinux-devel | >= 2.3-5 | SELinux 安全策略 |
| audit-libs-devel | >= 2.0.5 | Linux 审计系统 |
| krb5-devel | - | Kerberos 5 认证 |
| systemd-devel | - | Systemd 服务集成 |
| p11-kit-devel | - | PKCS#11 智能卡支持 |
| openldap-devel | - | LDAP 支持 |
| gtk2-devel | - | GTK2 图形库(askpass) |
| libX11-devel | - | X11 图形库(askpass) |
| libedit-devel | - | 行编辑和历史记录(sftp) |
| ncurses-devel | - | 终端控制库 |
| xauth | - | X11 认证工具 |
| gnupg2 | - | GPG 签名验证 |
| crypto-policies | - | 加密策略 |
运行时依赖 (Requires)
| 包名 | 版本要求 | 归属子包 |
|---|
| /sbin/nologin | - | openssh |
| libselinux | >= 2.3-5 | openssh |
| audit-libs | >= 1.0.8 | openssh |
| openssh-server | = %{version}-%{release} | openssh |
| crypto-policies | >= 20180306-1 | clients, server |
| pam | >= 1.0.1-3 | server |
| shadow | - | server (pre) |
| systemd | - | server |
推荐安装 (Recommends)
| 包名 | 用途 |
|---|
| p11-kit | PKCS#11 智能卡中间件 |
快速构建
方法一:使用构建脚本(推荐)
# 以 root 身份运行
sudo bash build.sh
安装所有构建依赖
设置 RPM 构建环境
生成 SRPM 源码包
构建二进制 RPM 包
输出构建结果
方法二:手动构建
# 1. 安装构建依赖
sudo dnf install -y rpm-build autoconf automake make gcc gcc-c++ \
dos2unix groff util-linux perl-interpreter perl-generators \
perl-podlators zlib-devel openssl-devel pam-devel \
libselinux-devel audit-libs-devel krb5-devel systemd-devel \
p11-kit-devel openldap-devel gtk2-devel libX11-devel \
libedit-devel ncurses-devel xauth gnupg2
# 2. 设置 RPM 构建目录
mkdir -p ~/rpmbuild/{SOURCES,SPECS,SRPMS,RPMS,BUILD,BUILDROOT}
# 3. 拷贝源码和辅助文件
cp openssh-10.5p1.tar.gz ~/rpmbuild/SOURCES/
cp sshd.pam sshd.sysconfig sshd.service sshd_config ~/rpmbuild/SOURCES/
cp openssh.spec ~/rpmbuild/SPECS/
# 4. 构建
rpmbuild -ba ~/rpmbuild/SPECS/openssh.spec安装
# 安装所有包
sudo rpm -Uvh ~/rpmbuild/RPMS/*/openssh-*.rpm
# 或使用 dnf
sudo dnf localinstall ~/rpmbuild/RPMS/*/openssh-*.rpm
配置说明
服务端配置
主配置文件: /etc/ssh/sshd_config
扩展配置目录: /etc/ssh/sshd_config.d/
PAM 配置: /etc/pam.d/sshd
服务环境变量: /etc/sysconfig/sshd
客户端配置
服务管理
# 启动服务
sudo systemctl start sshd
# 设置开机自启
sudo systemctl enable sshd
# 查看状态
sudo systemctl status sshd
# 重启服务(重新加载配置)
sudo systemctl restart sshd
已启用的功能特性
| 特性 | 说明 |
|---|
| PAM 认证 | 可插拔认证模块支持 |
| SELinux 支持 | 安全增强型 Linux 策略 |
| Kerberos 5 | 企业级 Kerberos 认证 |
| Linux Audit | 系统审计日志 |
| PKCS#11 | 智能卡/U2F 硬件密钥 |
| Systemd | 现代服务管理 |
| X11 转发 | 图形界面转发 |
| ssh-copy-id | 便捷密钥分发 |
| seccomp_filter | 沙箱隔离(x86_64/aarch64) |
| PIE 安全加固 | 地址空间布局随机化 |
| RELRO/BIND_NOW | 只读重定位保护 |
| libedit | sftp 行编辑历史 |
注意事项
FIDO/U2F 测试: 构建过程中禁用了测试套件,因为 FIDO 密钥模拟器在容器/虚拟机环境中可能存在问题。
seccomp 沙箱: 在 riscv64、loongarch64、sw_64 架构上自动禁用 seccomp_filter 沙箱(这些架构内核支持不完整)。
签名文件: 不再需要 Source1 签名文件(.asc),构建过程已移除相关检查。
自检测试: 如需运行测试,在 spec 中取消注释 %%check 部分,然后执行 make tests。
版本历史
| 版本 | 日期 | 说明 |
|---|
| 10.5p1-1 | 2026-08-22 | 基于 openEuler 的 OpenSSH 10.5p1 打包 |
| 10.4p1-1 | 2026-07-20 | 首次适配 openEuler 的 OpenSSH 10.4p1 打包 |
| 10.3p1-1 | 2026-06-01 | 基于 openEuler 的 OpenSSH 10.3p1 打包 |
Spec 文件审查报告
本节记录对 openssh-10.4p1.spec 的全面审查结果,包括功能验证与问题修复。该审查发现的所有修复项均已同步移植到当前版本的 openssh.spec(10.5p1),
包括 openEuler 2403 兼容修复(%undefine __brp_digest_list + BuildRequires: systemd-rpm-macros)与 %files 完整性修复。
功能验证
| 功能 | 审查结论 | 验证依据 |
|---|
| X11 转发 | 完整支持 | BuildRequires: libX11-devel gtk2-devel xauth + --with-xauth=/usr/bin/xauth + sshd_config 默认启用 X11Forwarding + gnome-ssh-askpass 构建与安装 |
| ssh-copy-id | 完整支持 | contrib/ssh-copy-id 安装到 %{_bindir} + 手册页安装到 man1 + %files clients 中声明 |
| PAM 认证 | 已启用 | --with-pam + 自定义 /etc/pam.d/sshd 配置 |
| SELinux | 已启用 | --with-selinux + libselinux-devel 构建依赖 |
| Kerberos 5 | 已启用 | --with-kerberos5 + krb5-devel 构建依赖 |
| Linux Audit | 已启用 | --with-audit=linux + audit-libs-devel 构建依赖 |
| PKCS#11 | 自动检测 | p11-kit-devel 构建依赖,configure 自动启用 |
| Systemd | 完整集成 | %systemd_post / %systemd_preun / %systemd_postun_with_restart + sshd.service 单元 |
| seccomp 沙箱 | 条件启用 | --with-sandbox=seccomp_filter(x86_64/aarch64),riscv64/loongarch64/sw_64 自动禁用 |
| PIE 安全加固 | 已启用 | LDFLAGS="$LDFLAGS -pie -z relro -z now" |
| libedit | 已启用 | libedit-devel 构建依赖,configure 自动检测 |
| askpass 图形对话框 | 完整支持 | GTK2 版 gnome-ssh-askpass 构建 + ssh-askpass 符号链接 + profile.d 脚本 |
审查发现的问题与修复
| # | 问题描述 | 严重程度 | 修复方式 |
|---|
| 1 | BuildRequires 中误用运行时库 audit-libs >= 1.0.8(非 devel 包,且第31行已有 audit-libs-devel >= 2.0.5) | 中 | 已删除该冗余条目 |
| 2 | %install 中创建了 ssh_config.d 目录,但 %files clients 中未声明,rpmbuild 时会报 unpackaged files 错误 | 高 | 已在 %files clients 中添加 %dir %attr(0755,root,root) %{_sysconfdir}/ssh/ssh_config.d |
| 3 | 缺少 --with-xauth 配置选项,可能导致 xauth 路径检测失败,影响 X11 转发 | 中 | 已添加 --with-xauth=/usr/bin/xauth |
| 4 | openEuler 2403 构建失败:brp-digest-list 脚本因 SELinux 路径检查失败报 Path is outside buildroot | 高 | 添加 BuildRequires: systemd-rpm-macros + %undefine __brp_digest_list |
语法结构验证
| 检查项 | 结果 |
|---|
%if / %endif 平衡(2个条件块) | 全部闭合 |
%package 与 %files 对应(5个子包) | 全部匹配 |
Source 声明与 %install 引用对应(4个 Source) | 全部引用 |
构建脚本 build.sh shell 语法检查 | 通过 (bash -n) |
构建适配总结报告(2026-08-23)
本节记录近期对本项目构建配置的两次适配优化:dist 发行版后缀参数化与systemd 构建依赖按 openEuler 版本条件选择。
1. dist 发行版后缀参数化(build.sh)
背景
本机打包时需要为 RPM 添加发行版后缀(如 .oe2509),原实现将 --define "dist .oe2509" 硬编码在 rpmbuild 命令中,导致所有场景(含非本机打包)都会带上该参数。
修改方案
build.sh 配置区新增 DIST 变量,默认留空(不传 dist 参数);仅本机打包时填写:
# 发行版标识(dist 宏):默认留空(不传 dist 参数);仅本机打包时填写,如 .oe2509DIST=""
# 根据 DIST 是否填写构造 rpmbuild 参数(为空则不添加 --define "dist ...")
DIST_ARGS=()if [ -n "$DIST" ]; then
DIST_ARGS=(--define "dist $DIST")fi
rpmbuild -bs 与 rpmbuild -bb 命令均改为引用 "${DIST_ARGS[@]}",留空时不添加任何 dist 定义。
配套修改 openssh.spec:Release: %{openssh_release} → Release: %{openssh_release}%{?dist},使 dist 宏能正确拼入版本号。
验证结果
| 模式 | rpmbuild 参数 | Release 展开 |
|---|
| 默认(DIST 留空) | 不传 dist | openssh-10.5p1-1 |
| 本机打包(DIST=.oe2509) | --define "dist .oe2509" | openssh-10.5p1-1.oe2509 |
顺带修复
原 rpmbuild -bb 命令行中的 $(rpm --eval '%{?_smp_mflags}') 在 openEuler 上会展开成未解析的 ${RPM_BUILD_NCPUS}(/usr/lib/rpm/macros 中 %_smp_mflags 定义为
-j${RPM_BUILD_NCPUS} 的 shell 风格),导致 rpmbuild 报错 未知的选项。
已从命令行移除该参数(_smp_mflags 只应通过 %make_build 在 spec 内部使用)。
2. systemd 构建依赖按 openEuler 版本条件选择(openssh.spec)
背景
构建 RPM 时发现:openEuler 25.09 才有独立的 systemd-rpm-macros 包(提供 %systemd_post 等 RPM 宏),而 22.03/24.03 等低版本由 systemd 包提供。
原 spec 写死 BuildRequires: systemd-rpm-macros,在低版本上无法解析。
修改方案
openssh.spec 从 /etc/openEuler-release 提取主版本号,按版本条件选择构建依赖:
# systemd RPM 宏(systemd_post 等)来源:openEuler 25.09+ 提供独立的
# systemd-rpm-macros 包;22.03/24.03 等低版本由 systemd 包提供,按版本选择依赖
%global oe_major %(sed 's/^openEuler release //' /etc/openEuler-release 2>/dev/null | cut -d. -f1 || echo 0)
%if 0%{oe_major} >= 25
BuildRequires: systemd-rpm-macros
%else
BuildRequires: systemd
%endif版本宏调查结论
| 候选宏 | openEuler 22.03 | openEuler 25.09 | 结论 |
|---|
%{?openEuler} | 1(EulerMaker 文档确认) | 2(本机确认) | 值不反映具体版本,不可靠 |
%{?rhel} / %{?fedora} / %{?oe_ver} | 空 | 空 | 均未定义,不可用 |
/etc/openEuler-release 版本号 | 22 | 25 | 最终采用 |
验证结果(rpmspec -P 实测展开)
| 模拟版本 | oe_major | 选中的 BuildRequires |
|---|
| 22.03 | 22 | systemd |
| 24.03 | 24 | systemd |
| 25.09 | 25 | systemd-rpm-macros |
验证中发现并修复的宏解析陷阱
最初提取版本号使用 %(sed -n 's/^openEuler release \([0-9]*\)\..*/\1/p' ...),其中 \( \) 转义括号干扰了 rpm 宏解析,
导致 oe_major 展开为空、2509 也误走 systemd 分支。改用无转义括号的管道写法(sed ... | cut -d. -f1)后验证通过。
相关提交
| 提交 | 说明 |
|---|
eb4a1bb | build: dist 参数改为可选变量,默认不传 |
7923bdc | spec: systemd 构建依赖按 openEuler 版本条件选择
|