はじめに
この実験では、強力なコマンドラインユーティリティであるrpmを使用して、RPMベースのLinuxディストリビューションでソフトウェアパッケージを管理する基礎を学びます。パッケージの詳細情報の照会、インストール済みパッケージの整合性検証、RPMファイルの内容検査など、パッケージ管理に不可欠なタスクを実践的に体験します。
各ステップを通じて、特定のrpmコマンドを使用してファイルがどのパッケージに属しているかを特定したり、パッケージの依存関係や設定ファイルをリストアップしたり、逆依存関係を確認したりする方法を学びます。また、パッケージ削除のシミュレーションを安全に行いその影響を理解する方法や、rpm2cpioおよびcpioツールを使用してインストール前にRPMパッケージの内容を調べる方法も習得します。
rpm -qi と rpm -qf による基本的なパッケージ情報の照会
このステップでは、Red Hat Package Manager (rpm) を使用して、インストール済みパッケージに関する情報を照会する方法を学びます。rpmは、CentOS、Fedora、RHELなどのRPMベースのLinuxディストリビューションでソフトウェアを管理するための強力なコマンドラインユーティリティです。ここでは、パッケージの詳細情報を取得する-qiと、特定のファイルがどのパッケージに属しているかを調べる-qfという2つの基本的なクエリオプションに焦点を当てます。
まず、システムに既にインストールされているパッケージの詳細を確認してみましょう。bashシェルはシステムの中心的なコンポーネントであるため、最適な例となります。-qフラグは「クエリ(照会)」を意味し、iフラグは「情報」を意味します。
実験で作成するコマンド出力ファイルを一箇所にまとめるため、まずは実験用ワークスペースに移動します。
cd /home/labex/project
ターミナルで以下のコマンドを実行し、bashパッケージに関する情報を照会して、その出力を bash-package-info.txt に保存します。
rpm -qi bash | tee bash-package-info.txt
パッケージのさまざまな属性がリストされた詳細な出力が表示されます。出力は以下のようになります(バージョン番号や日付は異なる場合があります)。
Name : bash
Version : 4.4.20
Release : 5.el8
Architecture: x86_64
Install Date: <some_date>
Group : System Environment/Shells
Size : 4989189
License : GPLv3+
Signature : RSA/SHA256, <some_date_and_time>, Key ID <some_key_id>
Source RPM : bash-4.4.20-5.el8.src.rpm
Build Date : <some_date>
Build Host : <some_build_host>
Relocations : (not relocatable)
Vendor : CentOS
URL : http://www.gnu.org/software/bash
Summary : The GNU Bourne-Again Shell
Description :
The GNU Bourne-Again Shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C
shell (csh). Most sh scripts can be run by bash without
modification.
この出力には、パッケージのバージョン、目的の概要、詳細な説明など、豊富な情報が含まれています。
次に、システム上に /usr/bin/bash のような実行ファイルがあり、それがどのパッケージによってインストールされたのかを知りたいと仮定します。これは、システムの監査やトラブルシューティングを行う際によくあるタスクです。この目的には -qf フラグを使用します(f は「ファイル」を意味します)。
以下のコマンドを実行して、/usr/bin/bash ファイルを所有しているパッケージを特定し、結果を bash-owner.txt に保存します。
rpm -qf /usr/bin/bash | tee bash-owner.txt
コマンドは、このファイルを提供しているパッケージのフルネームを返します。
bash-5.1.8-9.el9.x86_64
ご覧の通り、システムは /usr/bin/bash が bash パッケージから提供されていることを正しく識別しており、先ほど確認した情報と一致しています。これらのフラグを組み合わせて rpm -qif /usr/bin/bash を実行すれば、ファイルを所有するパッケージの情報を直接取得することも可能です。
rpm -qR と rpm -qc によるパッケージの依存関係と設定ファイルのリストアップ
このステップでは、rpmの探索を続け、パッケージの依存関係とそれに関連する設定ファイルをリストアップする方法を学びます。ほとんどのソフトウェアは正しく機能するために他のパッケージに依存しているため、依存関係を理解することは非常に重要です。また、設定ファイルの場所を知ることは、システム管理やカスタマイズにおいて不可欠です。
引き続き /home/labex/project で作業を行います。まずは、bashパッケージが他にどのようなパッケージや機能を必要としているかを確認しましょう。これには -qR(または --requires)フラグを使用します。R は「要求(requires)」を意味します。
以下のコマンドを実行して bash の依存関係を確認し、出力を bash-requires.txt に保存します。
rpm -qR bash | tee bash-requires.txt
出力には、bash が依存しているパッケージやシステム機能のリストが表示されます。このリストは非常に長くなることがあります。
/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
libc.so.6()(64bit)
info
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
rtld(GNU_HASH)
この出力から、bash が libc.so.6、filesystem パッケージ、その他のランタイムコンポーネントといったコアシステム機能に依存していることがわかります。
次に、bash パッケージの一部としてインストールされた設定ファイルを見つけましょう。これは、新しいユーザーのためにシェルのデフォルト動作を変更する必要がある場合に役立ちます。これには -qc フラグを使用します(c は「設定ファイル(configfiles)」を意味します)。
以下のコマンドを実行して bash の設定ファイルをリストアップし、出力を bash-config-files.txt に保存します。
rpm -qc bash | tee bash-config-files.txt
出力には、設定ファイルへのフルパスが表示されます。
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
/etc/skel 内のこれらのファイルは、ユーザーアカウントが作成される際に新しいユーザーのホームディレクトリにコピーされるテンプレートファイルです。
フラグを組み合わせて、特定のコマンドに関連する設定ファイルを見つけることもできます。例えば、passwd コマンドが使用する設定ファイルを確認するには -qcf を使用します。これは、rpm に対して、まずファイルに対応するパッケージを特定し(-f /usr/bin/passwd)、次にその設定ファイルをリストアップする(-c)よう指示するものです。
rpm -qcf /usr/bin/passwd | tee passwd-config-files.txt
このコマンドにより、passwd ユーティリティに関連する設定ファイルが明らかになります。
/etc/pam.d/passwd
これは、コマンドの動作を変更するために編集が必要なファイルを素早く特定するための強力な方法です。
rpm -V によるパッケージの整合性検証とファイル変更の確認
このステップでは、rpm -V(または rpm --verify)を使用してインストール済みパッケージの整合性を検証する方法を学びます。このコマンドは、セキュリティやトラブルシューティングにおいて非常に重要なツールです。パッケージによってインストールされたファイルを、ファイルサイズ、パーミッション、チェックサムなどのRPMデータベースに保存されている情報と照合します。これにより、システムファイルに対する不正な変更や誤った変更を検出できます。
まず、検証テストのために lsscsi と at というユーティリティパッケージがシステムにインストールされていることを確認します。
sudo dnf install -y lsscsi at
引き続き /home/labex/project で作業を行います。次に lsscsi パッケージを検証します。インストールしたばかりで何も変更していないため、検証テストは成功するはずです。検証が成功した場合、出力は何も表示されません。
rpm -V lsscsi | tee lsscsi-verify.txt
予想通り、コマンドプロンプトは何もメッセージを返さず、lsscsi パッケージ内のすべてのファイルが元の状態であることを示しています。
次に、意図的に設定ファイルを変更して、rpm -V がどのように変更を報告するかを確認します。at パッケージに属する /etc/at.deny ファイルに1行追加します。このファイルは、どのユーザーが at コマンドの使用を許可されていないかを制御するものです。
echo "labex" | sudo tee -a /etc/at.deny
ファイルを変更したので、再度 at パッケージを検証してみましょう。
sudo rpm -V at | tee at-verify.txt
今度はコマンドが出力を生成し、変更が検出されたことを示します。
S.5....T. c /etc/at.deny
この出力を分解してみましょう。
S: ファイルのサイズ(Size)が変更されました。5: MD5 チェックサムが変更されました。T: 更新時刻(Time)が変更されました。c: これは設定ファイル(configuration file)であることを示します。/etc/at.deny: 変更されたファイルへのパス。
8文字の文字列 S.5....T. の各文字位置は、異なるテストを表しています。. はテストに合格したことを意味します。この出力は、/etc/at.deny 設定ファイルがインストール時から変更されていることを明確に示しています。
-qVf フラグを使用して、特定のファイルを所有するパッケージを直接検証することもできます。
sudo rpm -qVf /etc/at.deny | tee at-file-verify.txt
このコマンドは、まず /etc/at.deny を所有するパッケージ(at)を見つけ、次にそれを検証するため、同じ出力を生成します。
rpm -e --test による逆依存関係の確認とパッケージ削除のシミュレーション
このステップでは、逆依存関係を確認し、パッケージの削除を安全にシミュレートする方法を学びます。rpm -qR コマンドがパッケージの「必要とするもの(依存関係)」を表示するのに対し、rpm -q --whatrequires は他のパッケージが「何を必要としているか(逆依存関係)」を表示します。これは、パッケージを削除するとシステムの他の部分が壊れる可能性があるため、削除前に知っておくことが非常に重要です。
引き続き /home/labex/project で作業を行います。パッケージ削除の結果を安全に確認するには、rpm -e --test コマンドを使用します。-e フラグは「消去(erase)」を意味し、--test フラグはRPMに対して、実際にファイルを削除することなくドライラン(テスト実行)を行うよう指示します。
まず、他の多くのパッケージが依存しているコアシステムパッケージを調べてみましょう。glibc パッケージは、Linuxシステム上のほぼすべてのプログラムの基礎となるGNU Cライブラリを提供します。glibc を必要とするパッケージを確認します。
rpm -q --whatrequires glibc | tee glibc-whatrequires.txt
出力には、glibc に依存するいくつかのパッケージが表示されます。
glibc-common-2.34-168.el9_6.19.x86_64
glibc-langpack-en-2.34-168.el9_6.19.x86_64
libstdc++-11.5.0-5.el9_5.x86_64
glibc-headers-2.34-168.el9_6.19.x86_64
pam-1.5.1-23.el9.x86_64
glibc-devel-2.34-168.el9_6.19.x86_64
nscd-2.34-168.el9_6.19.x86_64
ご覧の通り、多くの重要なシステムパッケージが glibc に依存しています。次に、glibc を削除しようとした場合に何が起こるかを見てみましょう。システム全体を壊さないよう、--test フラグを使用して実際に削除されないようにします。
sudo rpm -e --test glibc 2>&1 | tee glibc-remove-test.txt
非常に多くのパッケージが glibc を必要としているため、RPMは依存関係エラーを報告し、削除を阻止します。出力には、失敗した依存関係の長いリストが表示されます。
error: Failed dependencies:
glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-common-2.34-168.el9_6.19.x86_64
glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-langpack-en-2.34-168.el9_6.19.x86_64
glibc >= 2.34 is needed by (installed) libstdc++-11.5.0-5.el9_5.x86_64
... (additional dependency errors)
次に、依存関係が少ないパッケージを見てみましょう。先ほどインストールした lsscsi パッケージは、逆依存関係が少ないユーティリティパッケージです。これを必要とするパッケージを確認します。
rpm -q --whatrequires lsscsi | tee lsscsi-whatrequires.txt
lsscsi を必要とするパッケージがないことを示す出力が表示されるはずです。
no package requires lsscsi
lsscsi に依存するパッケージはないため、安全に削除をシミュレートできます。
sudo rpm -e --test lsscsi 2>&1 | tee lsscsi-remove-test.txt
このコマンドはエラーなしで完了するはずであり、lsscsi を削除してもシステム上の他のパッケージが壊れることはないことを示しています。
これは、逆依存関係を先に確認することで、パッケージ削除の影響を予測し、システムを壊すことを回避する方法を示しています。
rpm2cpio と cpio によるRPMパッケージ内容の検査
このステップでは、RPMパッケージファイルをインストールせずにその内容を検査する強力なテクニックを学びます。これは、インストール前にパッケージに含まれるファイルを確認したり、破損または削除されたファイルを復元するためにパッケージから単一のファイルを抽出したりする場合に便利です。このプロセスには2つのコマンドが必要です。RPMファイルを cpio アーカイブに変換する rpm2cpio と、そのアーカイブからファイルをリストアップまたは抽出できる cpio です。
引き続き /home/labex/project で作業を行います。まず、検査するための実際の .rpm ファイルが必要です。dnf パッケージマネージャーを使用して、bash のパッケージファイルを現在のディレクトリ(/home/labex/project)にダウンロードしましょう。download サブコマンドは、インストールせずにパッケージファイルを取得します。
sudo dnf download bash
ファイルが正常にダウンロードされたことを示す出力が表示されます。ファイル名にはバージョンとアーキテクチャが含まれます。
Last metadata expiration check: ...
bash-<version>.<arch>.rpm
次に、ls コマンドを使用して、.rpm ファイルが /home/labex/project ディレクトリにあることを確認します。
ls bash-*.rpm
RPMファイルの準備ができたら、rpm2cpio と cpio コマンドを組み合わせて内容をリストアップできます。rpm2cpio コマンドはRPMファイルを読み取り、cpio アーカイブを標準出力に出力します。次に、パイプ(|)を使用してこの出力を cpio コマンドに渡します。cpio は標準入力からアーカイブを読み取ります。cpio の -t フラグは、目次をリストアップするよう指示します。
rpm2cpio bash-*.rpm | cpio -t | tee bash-rpm-contents.txt
これにより、bash パッケージに含まれるすべてのファイルとディレクトリの長いリストが生成されます。出力は以下のようになります。
.
./etc
./etc/skel
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
./usr
./usr/bin
./usr/bin/bash
./usr/bin/sh
./usr/share
./usr/share/doc
...
このテクニックを使用すると、パッケージのペイロードを完全に把握でき、インストールした場合にシステムに何が配置されるかを正確に確認できます。
まとめ
この実験では、Linux環境でRPMユーティリティを使用してソフトウェアパッケージを管理および照会する方法を学びました。まず、rpm -qi を使用してインストール済みパッケージの詳細情報を取得し、rpm -qf を使用して特定のファイルがどのパッケージに属しているかを特定しました。また、rpm -qR でパッケージの依存関係をリストアップし、rpm -qc で設定ファイルの場所を確認する練習を行い、パッケージがシステムにどのように統合されているかを包括的に把握しました。
これらのクエリスキルを基に、rpm -V を使用してインストール済みパッケージのファイルの整合性を検証し、変更を確認する方法を学びました。さらに、rpm -e --test を使用して逆依存関係を安全に確認し、パッケージ削除をシミュレートすることで、変更を加えることなく潜在的な影響を理解する方法を探求しました。最後に、rpm2cpio と cpio を使用してRPMパッケージの内容を抽出およびリストアップすることで、インストール前にパッケージの内容を検査する能力を習得しました。



