LabHub
学习 学习路径 课程

RHEL 系管理

rpm 的查询与校验

在 LabHub 中继续学习

一句话总结

rpm 在成为安装工具之前,首先是一个查询工具。而 rpm -V 则是一款强大的审计工具,能够告诉你系统中发生过什么。

概念图: 查询工具 · 尚未安装的 .rpm 文件 · 处理 epoch 时需要使用三元表达式。 · 文件名中不包含 epoch,所以必须把这个值写入清单。

为什么需要掌握这些内容

在故障或疑似入侵场景中,比“软件包已经安装”更重要的是:已安装的文件是否与 原始软件包一致。直接从 rpm 数据库查询文件所属的软件包、安装脚本、配置文件列表与 摘要差异,就能在盲目重装之前缩小变更范围。不过,如果事故严重到 rpm 数据库本身也 不可信,就还需要与另一份可信清单进行比较。

它是如何工作的

查询(-q

rpm -qa                          # 설치된 전부
rpm -qa | wc -l
rpm -qi httpd                    # 상세 정보
rpm -ql httpd                    # 설치한 파일 목록
rpm -qc httpd                    # 설정 파일만
rpm -qd httpd                    # 문서 파일만
rpm -qf /usr/sbin/httpd          # 이 파일의 주인
rpm -q --changelog httpd | head
rpm -q --scripts httpd           # 설치 스크립트(%pre/%post 등)
rpm -q --requires httpd
rpm -q --provides httpd

在文件查询选项前加上 -p,即可查询尚未安装的 .rpm 文件

rpm -qpi ./labhub-tool-1.0-1.noarch.rpm
rpm -qpl ./labhub-tool-1.0-1.noarch.rpm
rpm -qp --qf '%{NAME} %{VERSION} %{RELEASE} %{ARCH}\n' ./x.rpm

通过 --qf(queryformat)只提取所需字段,是实现自动化的关键。处理 epoch 时需要使用三元表达式。

rpm -qp --qf '%{NAME}\t%|EPOCH?{%{EPOCH}}:{0}|\t%{VERSION}\t%{RELEASE}\t%{ARCH}\n' ./x.rpm

没有 epoch 的软件包会在该字段显示 (none),因此这个写法会用 0 补齐。文件名中不包含 epoch,所以必须把这个值写入清单。

验证(-V

rpm -V httpd
rpm -Va | head                   # 전체 검증 (느리다)

输出采用 SM5DLUGTP c /etc/httpd/conf/httpd.conf 这样的格式。

字符 含义
S 文件大小不同
M 模式(权限/类型)不同
5 文件内容摘要不同(这一字符源自历史上的 MD5 标记)
D 设备号不同
L 符号链接目标不同
U / G 所有者/所属组不同
T mtime 不同
P capabilities 不同
c(第二列) 配置文件标记

配置文件(c)发生变化通常是正常的。 因为管理员很可能修改过它。但如果二进制文件被改动,就必须调查——这意味着系统可能遭到入侵,或者有人手动覆盖了文件。

签名验证

rpm --checksig ./x.rpm
rpmkeys --checksig ./x.rpm       # 권장 표기
rpmkeys --import /etc/pki/rpm-gpg/RPM-GPG-KEY-...
rpmkeys --list

正常情况下应输出 digests signatures OK如果尚未导入密钥,摘要可能验证通过,而签名仍显示无法验证;这很容易被误读为“已通过”。 应养成在检查前先用 rpmkeys --list 确认密钥是否已经导入的习惯。

构建软件包

~/rpmbuild/
  SPECS/     labhub-tool.spec
  SOURCES/   labhub-tool-1.0.tar.gz
  BUILD/     (빌드 중간 산출물)
  BUILDROOT/ (가상의 설치 루트)
  RPMS/      (완성된 바이너리 rpm)
  SRPMS/     (소스 rpm)

spec 文件的基本骨架如下。

Name:      labhub-tool
Version:   1.0
Release:   1%{?dist}
Summary:   예제 도구
License:   MIT
Source0:   %{name}-%{version}.tar.gz
BuildArch: noarch
Requires:  coreutils

%description
...

%prep
%setup -q

%build
make

%install
make install DESTDIR=%{buildroot} PREFIX=/usr

%files
/usr/bin/labhub-tool

%changelog
* Sat Aug 15 2026 LabHub <lab@labhub.local> - 1.0-1
- 최초 패키징

如果 buildroot 中存在没有列在 %files 里的文件,构建就会失败。 对应的错误消息是“Installed (but unpackaged) files found”。反过来,如果 %files 中列出的文件实际不存在,构建同样会失败。正是这种严格性保证了软件包内容的准确性。

rpmbuild -ba ~/rpmbuild/SPECS/labhub-tool.spec     # 바이너리 + 소스 rpm
rpmbuild -bb ...                                    # 바이너리만
rpm2cpio x.rpm | cpio -idmv                         # 설치 없이 내용 풀기

实际工作中会遇到的情况

使用 rpm -Va 查找入侵痕迹。 系统出现异常时,可以通过这条命令找出被篡改的二进制文件。不过,rpm 数据库本身也可能已被篡改,因此只有与可信副本比较才能得到可靠结论。

下一个实验要做什么

使用 rpm 完成查询与验证,再通过 spec 文件亲手构建软件包并完成安装。