OpenSSH 10.5p1 - openEuler RPM 打包项目

举报
山涧烟雨村 发表于 2026/08/23 14:32:49 2026/08/23
【摘要】 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 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 智能卡中间件

快速构建

方法一:使用构建脚本(推荐)

# 以 root 身份运行
sudo bash build.sh

脚本会自动完成:

  1. 安装所有构建依赖
  2. 设置 RPM 构建环境
  3. 生成 SRPM 源码包
  4. 构建二进制 RPM 包
  5. 输出构建结果

方法二:手动构建

# 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

客户端配置

  • 全局配置: /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 行编辑历史

注意事项

  1. FIDO/U2F 测试: 构建过程中禁用了测试套件,因为 FIDO 密钥模拟器在容器/虚拟机环境中可能存在问题。
  2. seccomp 沙箱: 在 riscv64、loongarch64、sw_64 架构上自动禁用 seccomp_filter 沙箱(这些架构内核支持不完整)。
  3. 签名文件: 不再需要 Source1 签名文件(.asc),构建过程已移除相关检查。
  4. 自检测试: 如需运行测试,在 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 参数);仅本机打包时填写,如 .oe2509
DIST=""

# 根据 DIST 是否填写构造 rpmbuild 参数(为空则不添加 --define "dist ...")
DIST_ARGS=()
if [ -n "$DIST" ]; then
    DIST_ARGS=(--define "dist $DIST")
fi

rpmbuild -bsrpmbuild -bb 命令均改为引用 "${DIST_ARGS[@]}",留空时不添加任何 dist 定义。

配套修改 openssh.specRelease: %{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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。