记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

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 子包:

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 手册页和文档

环境要求

支持的操作系统

系统版本架构
openEuler22.03 LTSx86_64, aarch64
openEuler24.03 LTSx86_64, aarch64
openEuler24.09x86_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.1SSL/TLS 加密库
pam-devel-PAM 认证框架
libselinux-devel>= 2.3-5SELinux 安全策略
audit-libs-devel>= 2.0.5Linux 审计系统
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-5openssh
audit-libs>= 1.0.8openssh
openssh-server= %{version}-%{release}openssh
crypto-policies>= 20180306-1clients, server
pam>= 1.0.1-3server
shadow-server (pre)
systemd-server

推荐安装 (Recommends)

包名用途
p11-kitPKCS#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只读重定位保护
libeditsftp 行编辑历史

注意事项

  1. FIDO/U2F 测试: 构建过程中禁用了测试套件,因为 FIDO 密钥模拟器在容器/虚拟机环境中可能存在问题。
  2. seccomp 沙箱: 在 riscv64、loongarch64、sw_64 架构上自动禁用 seccomp_filter 沙箱(这些架构内核支持不完整)。
  3. 签名文件: 不再需要 Source1 签名文件(.asc),构建过程已移除相关检查。
  4. 自检测试: 如需运行测试,在 spec 中取消注释 %%check 部分,然后执行 make tests

版本历史

版本日期说明
10.5p1-12026-08-22基于 openEuler 的 OpenSSH 10.5p1 打包
10.4p1-12026-07-20首次适配 openEuler 的 OpenSSH 10.4p1 打包
10.3p1-12026-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 脚本

审查发现的问题与修复

#问题描述严重程度修复方式
1BuildRequires 中误用运行时库 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
4openEuler 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 留空)不传 distopenssh-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.03openEuler 25.09结论
%{?openEuler}1(EulerMaker 文档确认)2(本机确认)值不反映具体版本,不可靠
%{?rhel} / %{?fedora} / %{?oe_ver}均未定义,不可用
/etc/openEuler-release 版本号2225 最终采用

验证结果(rpmspec -P 实测展开)

模拟版本oe_major选中的 BuildRequires
22.0322systemd
24.0324systemd
25.0925systemd-rpm-macros

验证中发现并修复的宏解析陷阱

最初提取版本号使用 %(sed -n 's/^openEuler release \([0-9]*\)\..*/\1/p' ...),其中 \( \) 转义括号干扰了 rpm 宏解析,

导致 oe_major 展开为空、2509 也误走 systemd 分支。改用无转义括号的管道写法(sed ... | cut -d. -f1)后验证通过。

相关提交

提交说明
eb4a1bbbuild: dist 参数改为可选变量,默认不传
7923bdcspec: systemd 构建依赖按 openEuler 版本条件选择


转载请标明出处【OpenSSH 10.5p1 - openEuler RPM 打包项目】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论