rpm 的查询与校验
一句话总结
rpm 在成为安装工具之前,首先是一个查询工具。而 rpm -V 则是一款强大的审计工具,能够告诉你系统中发生过什么。
为什么需要掌握这些内容
在故障或疑似入侵场景中,比“软件包已经安装”更重要的是:已安装的文件是否与 原始软件包一致。直接从 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 文件亲手构建软件包并完成安装。