精准获取官方源码包需:①用rpm -qf定位精确二进制包名;②通过yumdownloader --source从启用的官方仓库下载同名.src.rpm;③用rpm -K和GPG密钥验证签名;④rpm2cpio解压提取原始tarball与spec文件,确保审计对象与线上组件1:1对应、可追溯、无篡改。

要从线上运行的 Linux 系统中,精准、可追溯、合规地获取某个核心组件(如 openssl、systemd、kernel)的官方源码包(.src.rpm)用于代码审计,关键不是“一键剥离”,而是确保来源可信、路径可逆、版本精确、无篡改风险。以下是面向企业级合规审计场景的实操路径,聚焦 CentOS/RHEL/Rocky Linux 8/9 等主流 yum/dnf 环境:
✅ 明确目标组件,定位其精确二进制包名
不要凭命令名(如 ls、ssh)直接猜包名——很多命令由不同包提供,且同名命令在不同发行版归属不同。
# 示例:查 ssh 命令实际属于哪个 RPM 包 which ssh # → /usr/bin/ssh rpm -qf /usr/bin/ssh # → openssh-clients-8.7p1-32.el9_4.1.x86_64 (RHEL 9.4) # 再确认该包是否为“上游原厂”(非第三方或 rebuild) rpm -qi openssh-clients | grep "Vendor\|Build Date" # Vendor: Red Hat, Inc. → 合规可信;若显示 "CentOS Buildsys" 或 "Fedora Project" 也属官方谱系
⚠️ 注意:
kernel、glibc、openssl等基础组件需用rpm -q kernel或rpm -q --last kernel查最新安装版本,避免误取旧版或 debuginfo 包。
✅ 下载对应 .src.rpm —— 必须通过原厂仓库 + --source,禁用镜像缓存污染
# 1. 确保已安装 yum-utils(含 yumdownloader) yum install -y yum-utils # 2. 清理潜在损坏的 repodata(规避 “no such table: packages” 错误) yum clean all rm -rf /var/cache/yum/* # 3. 强制使用系统默认启用的官方仓库(不走本地 mirror 缓存) yumdownloader --source --enablerepo=baseos,appstream,crb openssh-clients-8.7p1-32.el9_4.1.x86_64 # 注:RHEL 9 使用 baseos/appstream/crb;CentOS Stream 9 类似;Rocky 9 同理 # 若提示 no match,检查 repo 是否 enabled:yum repolist --enabled
? 合规要点:
- 不手动拼接 URL 从 pbone.net 或 vault.centos.org 下载(缺乏 GPG 签名校验,无法证明未被中间篡改);
- 不使用
--disablerepo=* --enablerepo=aliyun等第三方镜像(镜像可能延迟、删减或重打包 src.rpm);.src.rpm文件名必须与rpm -qf输出完全一致(含 epoch、release、arch),确保审计对象与线上运行组件 1:1 对应。
✅ 验证 .src.rpm 完整性与签名(审计必需步骤)
下载后立即校验,是合规流程不可跳过的环节:
# 查看包签名信息(必须显示 "Key ID XXXX" 且来自 Red Hat / CentOS / Rocky 官方密钥) rpm -K openssh-clients-8.7p1-32.el9_4.1.src.rpm # 输出应含:openssh-clients-8.7p1-32.el9_4.1.src.rpm: digests signatures OK # 导入并验证 GPG 签名(以 RHEL 9 为例) rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release rpm -Kv openssh-clients-8.7p1-32.el9_4.1.src.rpm | grep "signature" # 应显示:gpg OK
? 审计交付物建议包含:
linux-sysadmin下载Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
rpm -qi <pkg>输出(含 Build Date、Vendor、Packager);rpm -K校验结果截图;rpm -qp --changelog <pkg>.src.rpm | head -20(确认最后修改符合已知 CVE 修复节奏)。
✅ 解压并提取原始源码(非安装,仅审计用)
.src.rpm 是自解压归档,不建议 rpm -i 安装到 /root/rpmbuild/(路径不统一、易混入 patch 或 spec 修改):
# 直接流式解压,只取 tarball 和关键补丁 rpm2cpio openssh-clients-8.7p1-32.el9_4.1.src.rpm | cpio -idmv 2>/dev/null # 查看提取内容(典型结构) ls -1 # → openssh-8.7p1.tar.gz ← 主源码压缩包(审计主体) # → openssh-8.7p1-fips.patch ← 官方合规补丁(FIPS 模式支持) # → openssh.spec ← 构建脚本(含 configure 参数、安全加固选项) # 解压主源码 tar -xzf openssh-8.7p1.tar.gz cd openssh-8.7p1/
✅ 审计优势:
openssh.spec明确列出所有启用/禁用的编译选项(如--without-pam、--with-fips),可比对是否开启高危功能;- 所有
.patch文件均为 Red Hat/CentOS 官方维护,可溯源 CVE 补丁应用状态;- 源码时间戳、changelog 与
rpm -q --changelog一致,满足 ISO 27001/等保三级“软件物料清单(SBOM)可追溯”要求。
✅ 进阶:批量导出整套组件 SBOM(供自动化审计平台接入)
若需对数十个核心组件(如 glibc, openssl, systemd, curl, python3)统一处理,可用脚本生成标准化清单:
# 生成 CSV:组件名,二进制包名,src.rpm名,构建日期,官方仓库URL
for cmd in ssh curl python3; do
binpath=$(which $cmd 2>/dev/null)
[ -n "$binpath" ] && pkg=$(rpm -qf "$binpath") || continue
srcrpm=$(echo "$pkg" | sed 's/\.x86_64\.rpm$/.src.rpm/; s/\.aarch64\.rpm$/.src.rpm/')
buildtime=$(rpm -q --queryformat '%{BUILDTIME}\n' "$pkg" 2>/dev/null | xargs -I{} date -d @{} +"%Y-%m-%d")
echo "$cmd,$pkg,$srcrpm,$buildtime,https://gitlab.com/redhat/centos-stream/rpms/$(echo $pkg | cut -d- -f1)"
done | column -t -s,输出示例:
ssh openssh-clients-8.7p1-32.el9_4.1.x86_64 openssh-clients-8.7p1-32.el9_4.1.src.rpm 2024-05-12 https://gitlab.com/redhat/centos-stream/rpms/openssh
该清单可直接导入 SCA(Software Composition Analysis)工具,或作为内部审计报告附件。
整个过程不依赖外部网站、不绕过 GPG 校验、不修改源码、不引入非官方 patch,完全基于系统原生工具链和官方仓库,满足金融、政务、央企等强合规场景对“供应链透明性”与“代码源头可控性”的硬性要求。


















