// Datei: ./werkzeuge/paketoperationen/paket-auf-veraenderungen-pruefen.adoc

// Baustelle: Fertig

[[paket-auf-veraenderungen-pruefen]]
=== Paket auf unerwünschte Veränderungen prüfen ===

// Stichworte für den Index
(((Paket, auf unerwünschte Veränderungen prüfen)))
(((Paket, auf Vertrauenswürdigkeit prüfen)))
(((Paket, Signatur überprüfen)))
(((Paket, verifizieren)))
(((Paketsignatur, überprü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.

[[bezogenes-paket-verifizieren]]
==== Prüfung eines Paketes auf Unversehrtheit ====

// Stichworte für den Index
(((Debian, Vertrauenskette)))
(((Debian, Debian-Archive-Keyring)))
(((Debian, Keyring)))
(((Paket, auf Vertrauenswürdigkeit prüfen)))
(((Paket, Signatur überprüfen)))
(((Paket, verifizieren)))
(((Paketsignatur, überprüfen)))
(((Paketsignaturen)))

Die offiziellen Paketquellen von Debian, als auch die darüber referenzierten 
Quellpakete sind kryptographisch signiert (siehe dazu 
<<paketquelle-auf-echtheit-ueberpruefen>>). Die Signaturen werden mit Hilfe 
der Public-Key-Kryptographie erststellt. 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.

// Stichworte für den Index
(((apt-key)))
(((apt-key, add)))
(((/etc/apt/trusted.gpg)))
(((/etc/apt/trusted.gpg.d)))
(((Debian, Debian-Archive-Keyring)))
(((Debianpaket, apt)))
(((Debianpaket, debian-archive-keyring)))
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 <<apt-key-unterkommandos>> 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 =====

// Stichworte für den Index
(((Debianpaket, dpkg-sig)))
(((Paket, Signatur überprüfen)))
(((Paketsignatur, überprü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 
<<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-----


+2M2eryG8LOriFw5m7C39WmYcJr14tdm0ENmxqnEBzh+EhBwkhk=
=/SDv
-----END PGP SIGNATURE-----
----

===== Mehrere Pakete prüfen =====

* Todo

==== 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 aus einem gerade 
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.

// Stichworte für den Index
(((Debianpaket, debsums)))
(((Debianpaket, dpkg)))
(((Debianpaket, diffoscope)))
(((Debianpaket, dlocate)))
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.

// siehe dazu: http://debiananwenderhandbuch.de/debsums.html

===== 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 <<bezogenes-paket-verifizieren>>), 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', 'intergrit', 'fcheck', 'stealth' und
'tiger'.

===== MD5-Summen von Dateien mit `dlocate` anzeigen ===== 

// Stichworte für den Index
(((Debianpaket, dlocate)))
(((dlocate, -md5sum)))
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 =====

// Stichworte für den Index
(((Debianpaket, dlocate)))
(((dlocate, -md5check)))
`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` =====

// Stichworte für den Index
(((Debianpaket, debsums)))
(((debsums)))
(((Paket, Dateien auf Integrität prüfen)))
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
...
#
----

// Stichworte für den Index
(((debsums, -a)))
(((debsums, --all)))
(((debsums, -c)))
(((debsums, --changed)))
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)
#
----

// Stichworte für den Index
(((debsums, -e)))
(((debsums, --config)))

`-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:

// Stichworte für den Index
(((debsums, -ce)))

.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 <<paket-zu-datei-finden>>) und installieren dieses
dann erneut (siehe <<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 =====

// Stichworte für den Index
(((Debianpaket, dpkg)))
(((dpkg, --verify)))
(((dpkg, -V)))
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
$
----

// Stichworte für den Index
(((dpkg, --verify-format)))
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'.

// Datei (Ende): ./werkzeuge/paketoperationen/paket-auf-veraenderungen-pruefen.adoc
