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(2列目) |
設定ファイルの印 |
設定ファイル(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
- 최초 패키징
%filesに書かれていないファイルがbuildrootにあると、ビルドが失敗します。「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ファイルで自分でパッケージをビルドして、インストールまで行います。