OpenSSH 10.5p1 - openEuler RPM 打包项目
概述
本项目基于 openEuler 系统环境,对 OpenSSH 10.5p1 源码进行 RPM 打包构建。支持 openEuler 22.03 LTS 和 24.03 LTS。
https://gitcode.com/micoder/openssh/releases
项目结构
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 子包:
| 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 智能卡中间件 |
快速构建
方法一:使用构建脚本(推荐)
sudo bash build.sh
脚本会自动完成:
- 安装所有构建依赖
- 设置 RPM 构建环境
- 生成 SRPM 源码包
- 构建二进制 RPM 包
- 输出构建结果
方法二:手动构建
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
mkdir -p ~/rpmbuild/{SOURCES,SPECS,SRPMS,RPMS,BUILD,BUILDROOT}
cp openssh-10.5p1.tar.gz ~/rpmbuild/SOURCES/
cp sshd.pam sshd.sysconfig sshd.service sshd_config ~/rpmbuild/SOURCES/
cp openssh.spec ~/rpmbuild/SPECS/
rpmbuild -ba ~/rpmbuild/SPECS/openssh.spec
安装
sudo rpm -Uvh ~/rpmbuild/RPMS/*/openssh-*.rpm
sudo dnf localinstall ~/rpmbuild/RPMS/*/openssh-*.rpm
配置说明
服务端配置
- 主配置文件:
/etc/ssh/sshd_config
- 扩展配置目录:
/etc/ssh/sshd_config.d/
- PAM 配置:
/etc/pam.d/sshd
- 服务环境变量:
/etc/sysconfig/sshd
客户端配置
- 全局配置:
/etc/ssh/ssh_config
- 扩展配置目录:
/etc/ssh/ssh_config.d/
服务管理
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_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 版本条件选择 |
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)