Rpm verify

Aus Xinux Wiki
Version vom 30. September 2026, 17:39 Uhr von Thomas.will (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „=Grundsätzliches= *Mit dem Kommando rpm -V können die Dateien überprüft werden, die über RPM-Pakete auf dem System installiert wurden. *Mit diesem Werkzeu…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Grundsätzliches

  • Mit dem Kommando rpm -V können die Dateien überprüft werden, die über RPM-Pakete auf dem System installiert wurden.
  • Mit diesem Werkzeug kann der Systemadministrator Veränderungen an den Dateien des Systems feststellen.
  • Diese Veränderungen können gewollt sein (Konfigurationsdateien etc ...)
  • Sie können aber auch von einem Angreifer stammen, der Dateien im System gegen veränderte Binaries ausgetauscht hat (beispielsweise /bin/login).
  • Anders als bei Debian ist nichts zu installieren, die Funktion ist fester Bestandteil von rpm.

Funktionsweise

  • Bei der Installation speichert rpm zu jeder Datei eines Pakets Informationen in seiner Datenbank unter /var/lib/rpm: Checksumme (SHA256), Größe, Rechte, Besitzer, Gruppe, Änderungszeit und einiges mehr.
  • rpm -V vergleicht die installierten Dateien mit diesen gespeicherten Werten.
  • Im Gegensatz zu debsums wird also nicht nur der Inhalt geprüft, sondern auch Rechte und Besitzer. Ein nachträglich gesetztes SUID-Bit fällt damit ebenfalls auf.
  • Konfigurationsdateien werden mitgeprüft und in der Ausgabe mit einem c markiert.

Grenzen

  • Die Vergleichsdaten liegen in der RPM-Datenbank auf demselben System wie die geprüften Dateien.
  • Ein Angreifer mit Root-Rechten kann also nicht nur /bin/login austauschen, sondern auch die Datenbank oder rpm selbst manipulieren.
  • Ein Rootkit im Kernel kann rpm außerdem beim Lesen der Dateien den Originalinhalt vorspielen.
  • Auf einem möglicherweise kompromittierten System ist das Ergebnis daher nur ein Hinweis. Verlässlich ist erst die Prüfung vom Rettungssystem aus bzw. gegen ein frisch geladenes Paket (siehe unten).

Ausgabe lesen

  • rpm -V ist still, solange alles stimmt. Ausgegeben werden nur Abweichungen.
  • Jede Zeile beginnt mit neun Zeichen, eines pro Test:
Zeichen Bedeutung
S Größe weicht ab
M Rechte oder Dateityp weichen ab
5 Checksumme weicht ab (Inhalt verändert)
D Major/Minor-Nummer der Gerätedatei weicht ab
L Ziel eines symbolischen Links weicht ab
U Besitzer weicht ab
G Gruppe weicht ab
T Änderungszeit weicht ab
P Capabilities weichen ab
. Test bestanden
? Test konnte nicht durchgeführt werden (z.B. fehlende Leserechte)
  • Danach folgt ggf. die Art der Datei:
Zeichen Bedeutung
c Konfigurationsdatei
d Dokumentation
g ghost-Datei (gehört zum Paket, wird aber erst zur Laufzeit angelegt)
l Lizenzdatei
r readme-Datei
  • Fehlende Dateien werden mit missing gemeldet.
Beispiel
S.5....T.  c /etc/ssh/sshd_config
  • Größe, Inhalt und Änderungszeit der Konfigurationsdatei sind verändert - bei einer angepassten Konfiguration völlig normal.
S.5....T.    /usr/bin/ls
  • Dasselbe bei einem Binary - das darf nicht sein.
.M.......    /usr/bin/find
  • Nur die Rechte haben sich geändert - z.B. ein nachträglich gesetztes SUID-Bit.

Optionen

-V, --verify

  • Überprüft die angegebenen Pakete.
rpm -V openssh-server

-a, --all

  • Überprüft alle installierten Pakete.
rpm -Va

-f, --file

  • Überprüft das Paket, zu dem die angegebene Datei gehört.
rpm -Vf /usr/bin/ls

-p, --package

  • Vergleicht die installierten Dateien mit einer Paketdatei statt mit der RPM-Datenbank.
rpm -Vp coreutils-*.rpm

--noconfig

  • Konfigurationsdateien werden nicht geprüft.

--noghost

  • ghost-Dateien werden nicht geprüft.

--nofiledigest

  • Die Checksumme wird nicht geprüft. Das ist schneller, aber veränderte Inhalte bei gleicher Größe fallen nicht mehr auf.

-r, --root=DIR

  • Legt das Wurzelverzeichnis des zu prüfenden Systems fest (Standard /).
  • Damit lässt sich ein eingehängtes fremdes System prüfen, z.B. vom Rettungssystem aus.
  • Die RPM-Datenbank wird unterhalb dieses Verzeichnisses benutzt.

Beispiele

Alle Pakete prüfen

  • rpm -Va
S.5....T.  c /etc/ssh/sshd_config
.......T.  c /etc/chrony.conf
missing   c /etc/sysconfig/ip6tables
[..]

Alle Pakete prüfen, ohne Konfigurationsdateien

  • rpm -Va --noconfig

Nur veränderte Konfigurationsdateien anzeigen

  • rpm -Va | grep ' c /'

Nur Dateien mit verändertem Inhalt anzeigen

  • rpm -Va | grep '^..5'

Ein bestimmtes Paket prüfen

  • rpm -V bash

Das Paket einer bestimmten Datei prüfen

  • rpm -Vf /bin/login

Manipulation simulieren

  • Ein Binary verändern (hier wird nur ein Byte angehängt, ls funktioniert weiter):
echo >> /usr/bin/ls
  • Paket prüfen:
rpm -Vf /usr/bin/ls
S.5....T.    /usr/bin/ls
  • Datei aus dem Originalpaket wiederherstellen:
dnf reinstall coreutils

Prüfung gegen ein frisch geladenes Paket

  • Statt der lokalen Datenbank dient hier das Paket aus dem Repository als Vergleich.
  • Paket herunterladen:
dnf download coreutils
  • Signatur des Pakets prüfen:
rpm -K coreutils-*.rpm
  • Installierte Dateien gegen das Paket prüfen:
rpm -Vp coreutils-*.rpm
  • Damit ist eine manipulierte RPM-Datenbank kein Problem mehr. Gegen ein Kernel-Rootkit hilft aber auch das nicht - dafür braucht es das Rettungssystem.

Prüfung vom Rettungssystem

  • Das verdächtige System wird von einem Rettungssystem gebootet, Kernel und rpm des verdächtigen Systems werden also nicht benutzt.
  • Bei Rocky Linux eignet sich das Installationsmedium: Troubleshooting - Rescue a Rocky Linux system. Das installierte System wird dort unter /mnt/sysimage eingehängt.
  • Prüfen:
rpm --root /mnt/sysimage -Va
  • Die Vergleichsdaten stammen hier immer noch aus der RPM-Datenbank des verdächtigen Systems.

Vergleich mit debsums

debsums rpm -V
Installation nötig nicht nötig
Checksumme MD5 SHA256
Rechte, Besitzer, Gruppe nein ja
Konfigurationsdateien nur mit -a immer, mit c markiert
Ausgabe jede Datei (ohne -s) nur Abweichungen
Vergleich mit Paketdatei über -g rpm -Vp