8.32. Paket auf unerwünschte Veränderungen prüfen

Das Thema Vertrauen und Authentizität der bereitgestellten Softwarepakete wird bei Debian großgeschrieben. Ziel ist, dass Sie sicher sein können, dass die von einem Debian-Spiegelserver bezogene Software unverändert ist. Es greifen dabei eine ganze Reihe von automatischen Überprüfungen. Mit den nachfolgend beschriebenen Vorgehensweisen können Sie die entsprechenden Einzelschritte selbst nachvollziehen und durchführen.

Wir unterscheiden hier zwei Fälle:

beziehen eines Paketes und Prüfung auf Unversehrtheit der Übertragung
wurde das Paket korrekt zu Ihnen übertragen und ist die genutzte Quelle vertrauenswürdig. Diese Überprüfungen stellen sicher, dass ein von Ihnen bezogenenes Debianpaket dem Paketmirror so entnommen wurde, wie es von der Distribution in der Veröffentlichung zur Verfügung gestellt wurde. Sie schließen damit aus, dass zwischenzeitlich Veränderungen von einer dritten Partei auf dem Paketmirror oder dem Übertragungsweg stattgefunden haben. Diese Schritte bilden die Vertrauensbasis für die von Ihnen bezogene Software.
überprüfen, ob die Inhalte eines installierten Pakets verändert wurden
bestehen zwischen der Version vom Paketmirror und den installierten Dateien auf ihrem System Unterschiede, und wenn ja, welche sind das.

8.32.1. Prüfung eines Paketes auf Unversehrtheit

Die offiziellen Paketquellen von Debian, als auch die darüber referenzierten Quellpakete sind kryptographisch signiert (siehe dazu Abschnitt 3.12, „Paketquelle auf Echtheit überprüfen“). Die Signaturen werden mit Hilfe der Public-Key-Kryptographie erstellt. Mit dem entsprechenden öffentlichen Schlüssel (engl. Public Key) können Sie (und jeder andere Benutzer ebenso) überprüfen, ob das Paket vertrauenswürdig ist.

Die Grundlage dazu bildet die Vertrauenskette bei Debian, die sich vom Entwickler zum Build-Daemon (kurz „buildd“) bis hin zum FTP-Master-Server, den Paketlisten, dem Debian-Archive-Keyring und dem Debian-Keyring erstreckt. Genutzt wird dabei eine Kombination aus kryptographischen Hashsummen und einer digitalen Signatur.

Auf den Debian-Spiegelservern befindet sich pro Veröffentlichung eine digital signierte Datei namens Release. Sie beinhaltet die Namen der Paketlisten (heutzutage meist Packages, Packages.gz und Packages.xz, früher oft auch noch Packages.bz2) sowie deren Hashsummen als MD5-, SHA1- und SHA256-Variante. Mit der digitalen Signatur der Release-Datei und den darin enthalten Hashsummen wird sichergestellt, dass diese Dateien nicht verändert wurden.

Die Datei Packages (wie auch deren komprimierten Varianten) beinhaltet wiederum eine Liste von Paketen bzw. deren Dateien, die für diese Veröffentlichung zur Verfügung stehen – und deren Hash-Summen. Dies stellt wiederum sicher, dass die Paketdateien aus der Liste nicht verändert wurden.

Durch die gesamte Kette aus Paket-Hashsummen in den Paketlisten und Paketliste-Hashsummen in der Release-Datei garantiert die einzelne digitale Signatur auf der Release-Datei die Integrität sämtlicher Pakete einer Veröffentlichung.

Eine lokale Kopie der vertrauenswürdigen Schlüssel passend zur Veröffentlichung verwalten Sie mit dem Programm apt-key aus dem Paket apt [Debian-Paket-apt]. Auf dessen Bedienung gehen wir unter Abschnitt 3.12.3, „Unterkommandos von apt-key ein.

Zu dem Programm gehört ein Schlüsselring von öffentlichen GnuPG-Schlüsseln, sog. „Public Keys“, mit denen die Signaturen in der Datei Release.gpg auf den Debian-Spiegelservern überprüft werden können. Dieser Schlüsselring ist im Paket debian-archive-keyring enthalten und lokal in Dateien im Verzeichnis /etc/apt/trusted.gpg.d gespeichert. Dazu kommt noch die Datei /etc/apt/trusted.gpg, welche heutzutage nur noch manuell per apt-key add hinzugefügte Schlüssel enthält. Bei früheren Veröffentlichungen war diese Datei die alleinige Quelle zur Überprüfung von Veröffentlichungssignaturen.

Debian signiert seine einzelnen Pakete nicht kryptographisch mittels dpkg-sig, sondern vertraut auf die signierte RELEASE-Datei und die darin gespeicherten Hashsummen der Pakete.

Nur ein Einzelpaket kryptographisch prüfen

Die kyptographische Signatur eines einzelnen Paketes überprüfen Sie mit Hilfe des Werkzeugs dpkg-sig [Debian-Paket-dpkg-sig]. Hat das Paket keine kyptographische Signatur, sieht die Ausgabe so aus:

Paket ohne kryptographische Signatur. 

$ dpkg-sig --verify /var/cache/apt/archives/mc-data_3%3a4.8.18-1_all.deb
Processing /var/cache/apt/archives/mc-data_3%3a4.8.18-1_all.deb...
NOSIG
$

Im positiven Fall sehen Sie das folgende Ergebnis, hier für das in Kapitel 22, Metapakete bauen erzeugte Metapaket meta-mc:

Paket mit kryptographischer Signatur. 

$ dpkg-sig --verify meta-mc_1.0_all.deb
Processing meta-mc_1.0_all.deb...
GOODSIG _gpgbuilder 35F8DF9C884E36AB974460AFCFA72978D431AC07 1573823436
$

Nun überprüfen Sie, ob ein Debianpaket selbst noch eine kryptographische Signatur enthält. Sie packen dieses aus und schauen nach, ob darin eine Datei namens _gpgbuilder enthalten ist:

Dateiliste eines Pakets mit kryptographischer Signatur. 

$ ar vx meta-mc_1.0_all.deb
x - debian-binary
x - control.tar.gz
x - data.tar.xz
x - _gpgbuilder
$

Im vorliegenden Fall enthält die Datei _gpgbuilder folgendes Klartextzertifikat („clearsign GnuPG signature“):

Enthaltenes Klartextzertifikat. 

$ cat _gpgbuilder
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Version: 4
Signer: Frank Hofmann (Hofmann EDV) <frank.hofmann@efho.de>
Date: Fri Nov 15 14:10:36 2019
Role: builder
Files:
        3cf918272ffa5de195752d73f3da3e5e 7959c969e092f2a5a8604e2287807ac5b1b384ad 4 debian-binary
        9fd3b3462326a863565c1ca251ff0fe7 46aebc946b932b8b7e9ab541a01231d474e08330 458 control.tar.gz
        0baf7633e67bbcd272663089133a9cbc 2ad0ecd5fa6e5f2dd6b296e786fc4569050ea025 1400 data.tar.xz
-----BEGIN PGP SIGNATURE-----

iQIzBAEBAgAdFiEENfjfnIhONquXRGCvz6cpeNQxrAcFAl3Oo8wACgkQz6cpeNQx
rAeExhAAp7zBeBjijB6De5myMolGxGx9JqLNA2sF48RHsibFJwf4LmXC8NMcGHwO
q9c4TvIdUXb/94pIPTSLdLXSpPiEC4sFRx5SU7zwLaHO/HO7O+Qn0Y9XvuuJJDXm
0Fj+M8LyJPBpV7VgngTvXP7mX9mTPGD+ZxidJuZrR028LjxZYQ1kX6yiivZS4HBU
cKJlmRlopKaJ5Kdfypa52Nr9PB5MSTdaKm0jYz9W1nW+LCo4IDJAnii8VU2F7VuP
6ISTtcdC3sa4nh6+PaWC7lWR8wpj9A/Bc/n6ddGql3VaswUNNHGuVfxqoim7hrPc
uGckJ8sUgqYtWbCG+zyF4jgwoc+DtLwMHjoSIJPtxgEBI1R4GIzxF8Poa8ZVEuOY
fvRc9158oZVQpBc9w4MaWWtuImzjaQGLOgyutN4ow8UiQxzEIc7pep2N0zMw+Ir4
7C69KOjJ0exA+Fu34aLghe1SOhiNLSFu52r1axyomuN2cQfzw2cuVn2eLWZDxqAD
qlMQjMwtuYR9yED7R/PVC2B2Hq5pzBltN2kekhe3XL9yLgy3tyyGh7vNOeQn15+j
QKAxD31KZHIDdExeifRhQrLwBU3YVyuj1kSFIULO5kAD6v+i6dd341IUBNip2B7z
+2M2eryG8LOriFw5m7C39WmYcJr14tdm0ENmxqnEBzh+EhBwkhk=
=/SDv
-----END PGP SIGNATURE-----

Mehrere Pakete prüfen

Hier bietet sich ein Aufruf in einer for-Schleife an, bspw. wie folgt:

Mehrere Pakete prüfen. 

$ for paket in *.deb; do dpkg-sig --verify $paket; done
...
$

Als Ausgabe erhalten das Prüfergebnis paketweise untereinander.

8.32.2. Die Inhalte eines bereits installierten Paketes überprüfen

Installieren Sie ein Debianpaket, landen die darin enthaltenen Dateien üblicherweise eins-zu-eins auf dem Speichermedium. Als Administrator gehört zu Ihren Aufgaben, das System und die Dateien auf Integrität zu prüfen. Das umfasst auch das Nachschauen, ob die lokalen Dateien eines bereits installierten Paket später verändert wurden, d.h. ob zwischen der Version vom Paketmirror und der lokalen Version Unterschiede bestehen. Falls ja, ist von Ihnen zu klären, welche Dateien verändert wurden. Es gibt mehrere Situationen, in denen das wichtig ist, gewollte oder unerwünschte Änderungen von Daten festzustellen.

  • Welche Unterschiede bestehen zwischen der offiziell verfügbaren Version (und dessen Konfiguration) und den lokalen Einstellungen, sprich: welche Änderungen haben Sie vorgenommen und müssen ggf. bei einer Aktualisierung der Pakete oder des Systems berücksichtigt werden? (Bei der Installation fragt Debian mittlerweile, ob ihre Anpassungen bestehen bleiben sollen.)
  • Vorher hat ein anderer Administrator den Rechner betreut. Sie möchten wissen, an welchen Dateien Änderungen von demjenigen vorgenommen wurden.
  • Nach einer Reparatur des Dateisystems, bei der zu Paketen gehörende Dateien verändert wurden, prüfen Sie nach, ob die Reparatur erfolgreich war, d.h. ob die Dateien nach wie vor den erwarteten Inhalt haben.

Bei der Klärung dieser Fragen helfen Ihnen u.a. die Werkzeuge debsums [Debian-Paket-debsums], dlocate [Debian-Paket-dlocate], diffoscope [Debian-Paket-diffoscope] sowie auch dpkg selbst weiter. Letzteres steht Ihnen mit einem passenden Schalter ab der Version 1.17 ab Debian 8 Jessie und Ubuntu 14.04 LTS Trusty Tahr zur Verfügung.

MD5-Summen zur Erkennung von Änderungen

Während Debian bei der Verifizierung der bezogenen Pakete auch SHA1- und SHA256-Hashsummen zur kryptographischen Absicherung verwendet (siehe dazu Abschnitt 8.32.1, „Prüfung eines Paketes auf Unversehrtheit“), werden zum Erkennen von Änderungen an installierten Paketdateien nur MD5-Summen verwendet. Diese sind pro Paket in den Dateien /var/lib/dpkg/info/*.md5sums gespeichert. Alle o.g. Programme verwenden die Hashsummen aus diesen via dpkg bereitgestellten Dateien.

Die ausschließliche Verwendung von MD5-Summen an dieser Stelle bedeutet, dass diese nicht mehr den heutigen Ansprüchen für das Aufdecken von Datei-Ersetzungen entsprechen, insbesondere wenn diese mit hoher krimineller Energie ausgeführt wurden. Sie können jedoch durchaus helfen, von dilettantischen Einbrechern durchgeführte Datei-Ersetzungen zu finden. Bedenken Sie jedoch dabei, dass die Einbrecher genauso gut auch die o.g. Dateien mit den MD5-Summen angepasst haben könnten. Möchten Sie sich jedoch stärker gegen Datei-Ersetzungen oder Änderungen durch professionelle Angreifer schützen, so reichen die hier genannten Techniken nicht aus. Dazu gibt es spezialisierte Pakete wie z. B. tripwire, samhain, aide, integrit, fcheck, stealth und tiger.

MD5-Summen von Dateien mit dlocate anzeigen

Mit dem Schalter -md5sum des Werkzeugs dlocate zeigen Sie die MD5-Summen aller Dateien in einem bestimmten Paket an, so wie sie in o.g. Dateien von dpkg gespeichert werden. Nachfolgend sehen Sie die Ausgabe zum Paket htop, wobei sich in der linken Spalte die MD5-Summe befindet und in der rechten Spalte die dazugehörige Datei mit ihrem vollständigem Pfad. Die Angaben entsprechen dem Inhalt der Datei /var/lib/dpkg/info/htop.md5sums.

Darstellung der MD5-Summen für alle Dateien aus dem Paket htop

$ dlocate -md5sum htop
292b696a5b879f1068f7c15073c245cd  usr/bin/htop
194b840f96d3e6bbf29229811a6195c2  usr/share/applications/htop.desktop
75557092070931bcb0fb9a6d74575542  usr/share/doc/htop/AUTHORS
0c9303726b090f478b383dd059b3265f  usr/share/doc/htop/README
3adf8fa10448f27bb30385b37eb14231  usr/share/doc/htop/changelog.Debian.gz
84555fa6bc74568aea8de2a18072d5b2  usr/share/doc/htop/changelog.gz
ee7657b42989a83c9b04a179b35e59e1  usr/share/doc/htop/copyright
58a889c99141c2945c1c50bb51d314c6  usr/share/man/man1/htop.1.gz
f059e3f0159a5aeb761d41514a117310  usr/share/menu/htop
5bbd19dc6cccaf0a74866a92f5cca75c  usr/share/pixmaps/htop.png
$

Dateien paketbezogen mit dlocate überprüfen

dlocate kann nicht nur die MD5-Summe für eine Datei ausgeben, sondern diese auch überprüfen. Dazu benutzen Sie den Schalter -md5check. Falls die ermittelte MD5-Summe mit dem Original aus dem Paket übereinstimmt, ergänzt dlocate hinter dem Dateinamen ein OK, andernfalls ein FAILED.

Bitte beachten Sie dabei, dass dlocate -md5check keine Konfigurationsdateien überprüft und auch nur die Dateien von explizit angegebenen Paketen überprüfen kann.

Überprüfung der MD5-Summen für jede einzelne Datei aus dem Paket htop

$ dlocate -md5check htop
usr/bin/htop: OK
usr/share/applications/htop.desktop: OK
usr/share/doc/htop/AUTHORS: OK
usr/share/doc/htop/README: OK
usr/share/doc/htop/changelog.Debian.gz: OK
usr/share/doc/htop/changelog.gz: OK
usr/share/doc/htop/copyright: OK
usr/share/man/man1/htop.1.gz: OK
usr/share/menu/htop: OK
usr/share/pixmaps/htop.png: OK
$

Dateien überprüfen mit debsums

Genauso wie dlocate kann auch debsums die Dateien eines Pakets auf Integrität überprüfen. Dazu braucht es jedoch keine weitere Option, da das Überprüfen von Dateien die einzige Aufgabe von debsums ist:

debsums beim Prüfen des Pakets htop

$ debsums htop
/usr/bin/htop                                   OK
/usr/share/applications/htop.desktop            OK
/usr/share/doc/htop/AUTHORS                     OK
/usr/share/doc/htop/README                      OK
/usr/share/doc/htop/changelog.Debian.gz         OK
/usr/share/doc/htop/changelog.gz                OK
/usr/share/doc/htop/copyright                   OK
/usr/share/man/man1/htop.1.gz                   OK
/usr/share/menu/htop                            OK
/usr/share/pixmaps/htop.png                     OK
$

Im Gegensatz zu dlocate braucht debsums jedoch nicht notwendigerweise einen Paketnamen als Parameter. Rufen Sie das Werkzeug debsums ohne weitere Parameter auf, so prüft es alle Dateien (außer Konfigurationsdateien in /etc/) sämtlicher installierten Pakete auf Veränderungen zum Original und gibt hinter dem Dateinamen den Wert OK für unverändert und FAILED für modifizierte Daten aus. Dieser Schritt eignet sich gut, um ihr gesamtes System einer Integritätsprüfung zu unterziehen.

debsums bei der Arbeit. 

# debsums
/usr/bin/a2ps                         OK
/usr/bin/a2ps-lpr-wrapper             OK
/usr/bin/card                         OK
/usr/bin/pdiff                        OK
/usr/bin/psmandup                     OK
/usr/bin/psset                        OK
/usr/bin/texi2dvi4a2ps                OK
/usr/share/a2ps/README                OK
/usr/share/a2ps/afm/fonts.map         OK
...
#

Desweiteren hat debsums noch ein paar nützliche Schalter:

-a (Langform --all)
Überprüfung aller Dateien.
-c (Langform --changed)
Nur die Dateien anzeigen, die sich geändert haben.

Auflistung der Dateien, die sich geändert haben. 

# debsums --changed
/usr/local/Brother/Printer/HL2250DN/inf/brHL2250DNfunc
/usr/local/Brother/Printer/HL2250DN/inf/brHL2250DNrc
debsums: missing file /usr/share/doc/hl2250dnlpr/copyright (from hl2250dnlpr package)
debsums: missing file /usr/share/doc/hl2250dnlpr/changelog.Debian.gz (from hl2250dnlpr package)
debsums: missing file //opt/PDFStudio/jre/lib/charsets.jar.pack (from pdfstudio package)
#

-e (Langform --config)
Überprüfung der Conffiles. Conffiles sind Konfigurationsdateien, die vom Paket ausgeliefert werden und somit vorab deklariert wurden. Diese befinden sich fast immer unterhalb des Verzeichnisses /etc/.

Auflistung aller Conffiles des Pakets unburden-home-dir mit Zustand: 

$ debsums -e unburden-home-dir
/etc/unburden-home-dir.list                 FAILED
/etc/unburden-home-dir                          OK
/etc/default/unburden-home-dir              FAILED
/etc/X11/Xsession.d/95unburden-home-dir         OK
$

Möchten Sie nur die Konfigurationsdateien (genauer Conffiles) eines Pakets auflisten, die lokal geändert wurden, so kombinieren Sie die beiden Schalter -c und -e miteinander:

Auflistung geänderter Conffiles des Pakets unburden-home-dir

$ debsums -ce unburden-home-dir
/etc/default/unburden-home-dir
/etc/unburden-home-dir.list
$

Möchten Sie die Originaldatei wiedereinspielen (und damit die Änderungen rückgängig machen), ermitteln Sie zuerst das Paket, in dem besagte Datei enthalten ist (siehe Abschnitt 8.24, „Paket zu Datei finden“) und installieren dieses dann erneut (siehe Abschnitt 8.39, „Pakete erneut installieren“).

Bitte beachten Sie, dass das bei Conffiles nicht funktioniert, da dpkg nur dann wegen geänderter (oder gelöschter) Konfigurationsdateien fragt, wenn sich die Konfigurationsdatei auch im Paket geändert hat. Dies ist bei einer Reinstallation nie der Fall. Hier hilft entweder, die Datei aus dem heruntergeladenen Paket manuell zu extrahieren oder zunächst das Paket mit dpkg --purge vollständig zu entfernen und danach wieder zu installieren.

Bei der Benutzung von debsums spielen die Berechtigungen des Benutzers eine Rolle. Die Integrität von Dateien, die für normale Benutzer nicht lesbar sind, können nur vom Benutzer root geprüft werden.

Auflistung geänderter Conffiles des Pakets sudo geht nur root-Rechten: 

$ debsums -e sudo
/etc/pam.d/sudo                                 OK
/etc/init.d/sudo                                OK
debsums: can't open sudo file /etc/sudoers (Permission denied)
debsums: can't open sudo file /etc/sudoers.d/README (Permission denied)
$ sudo debsums -e sudo
/etc/pam.d/sudo                                 OK
/etc/sudoers                                    OK
/etc/init.d/sudo                                OK
/etc/sudoers.d/README                           OK
$

Dateien mit dpkg -V überprüfen

Ab dpkg Version 1.17 kann auch dpkg selbst Dateien anhand der gespeicherten MD5-Summen auf Unversehrtheit überprüfen. Im Gegensatz zu debsums und dlocate -md5check überprüft es Conffiles stets mit und zeigt auch immer nur Dateien an, die sich nicht mehr im Originalzustand befinden.

Die passende Option dazu ist -V bzw. in der Langform --verify. Geben Sie zum Aufruf einen oder mehrere Paketnamen als Parameter mit, so werden nur die Dateien dieser Pakete überprüft:

Dateien der Pakete unburden-home-dir und ack-grep mit dpkg -V überprüfen. 

$ dpkg -V unburden-home-dir ack-grep
??5?????? c /etc/unburden-home-dir.list
??5?????? c /etc/default/unburden-home-dir
??5??????   /usr/bin/ack
$

Das Ausgabeformat stellen Sie über die Option --verify-format ein. Das Standardformat ist von RPM übernommen [Bailey-Maximum-RPM-verify]. Da dpkg bisher nur die MD5-Summe überprüft, werden alle anderen Spalten nur als Fragezeichen ausgegeben. Erscheint ein einzelnes c in der Ausgabe, handelt es sich hierbei um Conffiles.