Fedora 15
Signieren von selbstgebauten rpm-Paketen
Ich will meine selbstgebauten rpm-Pakete signieren. Aber weil es sich um Pakete für die aktuelle Fedora-15 Distribution handelt, will ich auch einen Schlüssel verwenden, der genau so stark bzw. schwach ist, wie derjenige, den die Fedora Leute für eben dieses Fedora-15 verwenden. Zwar gibt es im Internet unter der URL http://fedoranews.org/tchung/gpg/ von Thomas Chung eine hervorragende Anleitung zu diesem Thema, doch wenn man sich streng an diese Anleitung hält, erhält man eine Signatur, die eben nicht äquivalent zu Fedora-15 ist, sondern nur zu älteren Fedora Versionen paßt. Ich weiß auch, daß das zwar eigentlich egal ist, hauptsache die Pakete sind überhaupt signiert, aber bei mir geht es immer auch ein bißchen um die Ästhetik.
Also, laßt uns der Ästhetik frönen:
Schritt 1: Voraussetzungen schaffen
Ich werde root (sofern ich es noch nicht bin) und begebe mich in das Heimatverzeichnis von root (sofern ich nicht schon da bin).
[seeburge@vv06 ~]$ su Passwort: mein_root_passwort [root@vv06 seeburge]# cd [root@vv06 ~]# pwd /root [root@vv06 ~]#
Als Erstes prüfe ich, ob die Software, die ich für mein Vorhaben benötige auch auf meinem Rechner installiert ist. Natürlich muß gnupg installiert sein. Das ist das wesentliche Softwarepaket um den Schlüssel überhaupt erzeugen zu können. Darüberhinaus muß aber auch rpm-sign installiert sein. Das war in Fedora-14 mit seinem rpm 4.8.1 Unterbau noch anders, da war der Befehl "rpm --addsign" noch Bestandteil des allgemeinen rpm-Pakets. Doch seit rpm 4.9.0, das in Fedora-15 Einzug gehalten hat, ist "rpm --addsign" in ein eigenständiges Unterpaket - das besagte rpm-sign - ausgelagert worden. Alles andere, was sonst noch gebraucht wird, ist bereits Bestandteil der Fedora-15 Minimalinstallation.
[root@vv06 ~]# yum install gnupg Einrichten des Installationsprozess Paket gnupg-1.4.11-3.fc15.x86_64 ist bereits in der neusten Version installiert. Nichts zu tun [root@vv06 ~]# yum install rpm-sign Einrichten des Installationsprozess Paket rpm-sign-4.9.0-9.fc15.x86_64 ist bereits in der neusten Version installiert. Nichts zu tun [root@vv06 ~]#
Wie man sieht, ist bei mir beides bereits vorhanden.
Schritt 2: Wir basteln uns einen eigenen Schlüssel
Sodann schaffe ich mir eine saubere Arbeitsumgebung. Hier ist dringend ein Wort der Warnung angebracht. Ich werde nämlich nun ein ganzes Verzeichnis löschen, das Sie - sofern Sie es nachmachen wollen - eventuell noch dringend brauchen werden. Ich empfehle daher allen anderen lieber ein "mv .gnupg .gnupg.backup" anstatt meinem "rm -rf .gnupg". Wie dem auch sei, Sie müssen selbst wissen was Sie tun.
[root@vv06 ~]# rm -rf .gnupg [root@vv06 ~]# gpg --list-keys gpg: Verzeichnis `/root/.gnupg' erzeugt gpg: Neue Konfigurationsdatei `/root/.gnupg/gpg.conf' erstellt gpg: WARNUNG: Optionen in `/root/.gnupg/gpg.conf' sind während dieses Laufes noch nicht wirksam gpg: Schlüsselbund `/root/.gnupg/pubring.gpg' erstellt gpg: /root/.gnupg/trustdb.gpg: trust-db erzeugt [root@vv06 ~]# cd .gnupg [root@vv06 .gnupg]# ls -al insgesamt 24 drwx------. 2 root root 4096 17. Jun 09:25 . dr-xr-x---. 3 root root 4096 17. Jun 09:25 .. -rw-------. 1 root root 9188 17. Jun 09:25 gpg.conf -rw-------. 1 root root 0 17. Jun 09:25 pubring.gpg -rw-------. 1 root root 40 17. Jun 09:25 trustdb.gpg [root@vv06 .gnupg]# cd [root@vv06 ~]#
Als Ergebnis haben wir eine druckfrische, noch unveränderte Konfigurationsdatei gpg.conf erhalten.
Nun kommt der entscheidende Schritt. Ich nehme nämlich Anpassungen an dieser Konfigurationsdatei vor, die dazu führen, daß wir am Ende der Schlüsselerzeugung einen ähnlichen Schlüssel haben wie die Fedora Leute. Im Einzelnen werde ich die Auskommentierung einer Zeile zurücknehmen und am Ende der Datei zwei Zeilen hinzufügen.
[root@vv06 ~]# vi /root/.gnupg/gpg.conf
So soll es aussehen. Ich zeige hier nur die entscheidenden Stellen der gpg.conf Datei:
. . . # require the older version 3 signatures. Setting this option forces # GnuPG to create version 3 signatures. force-v3-sigs # Because some mailers change lines starting with "From " to ">From " # it is good to handle such lines in a special way when creating . . . # Try CERT, then PKA, then LDAP, then hkp://subkeys.net: #auto-key-locate cert pka ldap hkp://subkeys.pgp.net personal-digest-preferences SHA256 cert-digest-algo SHA256
Nun weiß gpg wie der von mir gewünschte Schlüssel aussehen soll und ich kann mit der eigentlichen Schlüsselerzeugung beginnen:
[root@vv06 ~]# gpg --gen-key gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: Schlüsselbund `/root/.gnupg/secring.gpg' erstellt Bitte wählen Sie, welche Art von Schlüssel Sie möchten: (1) RSA und RSA (voreingestellt) (2) DSA und Elgamal (3) DSA (nur unterschreiben/beglaubigen) (4) RSA (nur signieren/beglaubigen) Ihre Auswahl? 4 RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein. Welche Schlüssellänge wünschen Sie? (2048) 4096 Die verlangte Schlüssellänge beträgt 4096 Bit Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll. 0 = Schlüssel verfällt nie <n> = Schlüssel verfällt nach n Tagen <n>w = Schlüssel verfällt nach n Wochen <n>m = Schlüssel verfällt nach n Monaten <n>y = Schlüssel verfällt nach n Jahren Wie lange bleibt der Schlüssel gültig? (0) 0 Schlüssel verfällt nie Ist dies richtig? (j/N) j Sie benötigen eine User-ID, um Ihren Schlüssel eindeutig zu machen; das Programm baut diese User-ID aus Ihrem echten Namen, einem Kommentar und Ihrer Email-Adresse in dieser Form auf: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Ihr Name ("Vorname Nachname"): mein_vorname mein_nachname Email-Adresse: meine_e-mail_addresse Kommentar: Sie haben diese User-ID gewählt: "mein_vorname mein_nachname <meine_e-mail_addresse>" Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(B)eenden? F Sie benötigen eine Passphrase, um den geheimen Schlüssel zu schützen. Geben Sie die Passphrase ein: meine_passphrase Geben Sie die Passphrase nochmal ein: meine_passphrase Wir müssen eine ganze Menge Zufallswerte erzeugen. Sie können dies unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen. Es sind nicht genügend Zufallswerte vorhanden. Bitte führen Sie andere Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann! gpg: Schlüssel B78E038C ist als uneingeschränkt vertrauenswürdig gekennzeichnet Öffentlichen und geheimen Schlüssel erzeugt und signiert. gpg: "Trust-DB" wird überprüft gpg: 3 marginal-needed, 1 complete-needed, PGP Vertrauensmodell gpg: Tiefe: 0 gültig: 1 unterschrieben: 0 Vertrauen: 0-, 0q, 0n, 0m, 0f, 1u pub 4096R/B78E038C 2010-12-14 Schl.-Fingerabdruck = 9E82 9B7E 5A05 75BF CF12 7D81 317E CB28 B78E 038C uid mein_vorname mein_nachname <meine_e-mail_addresse> Bitte beachten Sie, daß dieser Schlüssel nicht zum Verschlüsseln benutzt werden kann. Sie können aber mit dem Befehl "--edit-key" einen Unterschlüssel für diesem Zweck erzeugen. [root@vv06 ~]#
Nun muß noch der öffentliche Teil des soeben erzeugten Schlüssels in eine eigene Datei exportieren werden. Diese Datei kann man dann später dritten Personen zur Verfügung stellen, damit diese die Gültigkeit des signierten Paketes prüfen können. Auch an dieser Stelle hat sich etwas zwischen Fedora-14 und Fedora-15 geändert. Während unter Fedora-14 der "gpg --export" Befehl standardmäßig eine Textdatei erzeugte, so wird unter Fedora-15 standardmäßig eine Binärdatei erzeugt. Will man auch weiterhin eine Datei im alten ASCII-Format, so muß man die Befehlsoption -a zusätzlich verwenden, also "gpg --export -a". Ich will hier eine ASCII-Datei, weil auch die Fedora-Datei noch im ASCII-Format vorliegt.
[root@vv06 ~]# gpg --export -a 'mein_vorname mein_nachname' > rpm-gpg-key.txt
[root@vv06 ~]#
So, jetzt haben wir einen eigenen Schlüssel erzeugt, mit dem wir fortan unsere selbstgemachten Pakete signieren können. Der gesamte Schlüssel befindet sich in dem Verzeichnis /root/.gnupg, weshalb es ratsam ist dieses Verzeichnis gut zu verwahren und wie seinen Augapfel zu hüten. Der öffentliche Teil unseres Schlüssels ist die Datei rpm-gpg-key.txt. Diese Datei kann auch schonmal verloren gehen, weil sie ja jederzeit wieder neu aus dem Verzeichnis /root/.gnupg generiert werden kann. Nur die Datei rpm-gpg-key.txt darf (und muß, sonst gelingt die Überprüfung nicht) veröffentlicht werden, das Verzeichnis /root/.gnupg auf keinen Fall.
Schritt 3: Vergleichen der Schlüssel
Nun kontrollieren wir ersteinmal ob der Fedora-15 Schlüssel auch so ähnlich aussieht, wie der soeben von uns erzeugte Schlüssel:
[root@vv06 ~]# gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-15-primary pub 4096R/069C8460 2011-02-07 Fedora (15) <fedora@fedoraproject.org> Schl.-Fingerabdruck = 25DB B54B DED7 0987 F4C1 0042 B4EB F579 069C 8460 [root@vv06 ~]# gpg --quiet --with-fingerprint /root/rpm-gpg-key.txt pub 4096R/B78E038C 2010-12-14 Oliver Seeburger <oliver.seeburger@sundermeier-werkzeugbau.de> Schl.-Fingerabdruck = 9E82 9B7E 5A05 75BF CF12 7D81 317E CB28 B78E 038C [root@vv06 ~]# ls -al /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-15-primary -rw-r--r--. 1 root root 1653 11. Mai 16:24 /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-15-primary [root@vv06 ~]# ls -al /root/rpm-gpg-key.txt -rw-r--r--. 1 root root 1691 14. Dez 15:19 /root/rpm-gpg-key.txt [root@vv06 ~]#
Natürlich unterscheiden sich die beiden Schlüssel in wesentlichen Bereichen. Sie sind unterschiedlich was das Datum, den Namen und insbesondere den Fingerabdruck angeht. Das muß ja auch so sein. Aber sie sind vergleichbar hinsichtlich der Länge (4096 = 4096Bit) und des Verschlüsselungsalgorithmuses (R = RSA). Auch die entstandenen Exportdateien haben eine vergleichbare Dateigröße, wie man am ls-Befehl sehen kann.
Schritt 4: Pakete signieren
Zweierlei müssen wir haben, damit wir unsere Pakete signieren können: Erstens unseren kompletten Schlüssel und zweitens eine Vorschrift die dem rpm-Paketmanager sagt, daß er genau diesen Schlüssel verwenden soll. Nun, das erste haben wir, nämlich das Verzeichnis /root/.gnupg. Das zweite müssen wir erst noch besorgen. Die Vorschrift befindet sich nämlich in der Datei /root/.rpmmacros, die wir zunächst noch um zwei Zeilen erweitern müssen.
[root@vv06 ~]# vi /root/.rpmmacros
So soll es aussehen:
%_topdir %(echo $HOME)/rpmbuild %_smp_mflags %([ -z "$RPM_BUILD_NCPUS" ] \\\ && RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"; \\\ if [ "$RPM_BUILD_NCPUS" -gt 16 ]; then echo "-j16"; \\\ elif [ "$RPM_BUILD_NCPUS" -gt 3 ]; then echo "-j$RPM_BUILD_NCPUS"; \\\ else echo "-j3"; fi) %__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot %_signature gpg %_gpg_name mein_vorname mein_nachname
Nachdem das erledigt ist, kann der eigentliche Signierbefehl aufgerufen werden. Ab dieser Stelle gehe ich davon aus, daß sich in dem root-Heimatverzeichnis - also /root - zwei rpm-Dateien befinden. Und zwar einmal, zu Vergleichszwecken, ein original Fedora-15 Paket. Ich habe hier beispielsweise das Paket tar-1.25-6.fc15.x86_64.rpm genommen, es geht aber auch jedes andere Paket aus den original Fedora-14 Repositorys. Und zum Zweiten das von mir gepackte noch unsignierte Paket squidclamav-6.2-1.fc15.x86_64.rpm. Genau dieses Paket will ich nun signieren.
[root@vv06 ~]# rpm --addsign squidclamav-6.2-1.fc15.x86_64.rpm Bitte das Passwort eingeben: meine_passphrase Das Passwort ist richtig. squidclamav-6.2-1.fc15.x86_64.rpm: [root@vv06 ~]#
Das ist schon alles. Jetzt ist mein Paket endlich signiert.
Schritt 5: Vergleichen der Pakete
Zunächsteinmal möchte ich sehen, wie der Paketvergleich aussieht, wenn der Fedora-15 Schlüssel und mein eigener Schlüssel nicht an den rpm-Paketmanager bekanntgegeben wurden. Da der Fedora-15 Schlüssel aber höchswahrscheinlich schon in rpm importiert wurde, entlade ich ihn zunächst.
[root@vv06 ~]# rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' gpg-pubkey-069c8460-4d5067bf --> gpg(Fedora (15) <fedora@fedoraproject.org>) [root@vv06 ~]# rpm -e gpg-pubkey-069c8460-4d5067bf [root@vv06 ~]# rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' Das Paket gpg-pubkey ist nicht installiert [root@vv06 ~]#
Sobald diese Meldung erscheint, hat rpm alle Signaturen vergessen. Doch keine Angst, wir importieren gleich alle Schlüssel wieder. Nun vergleichen wir ein Muster-Paket aus dem Fedora-15 Repository mit meinem signierten Selbstbaupaket.
[root@vv06 ~]# rpm -K tar-1.25-6.fc15.x86_64.rpm tar-1.25-6.fc15.x86_64.rpm: RSA sha1 (MD5) PGP md5 NICHT OK [root@vv06 ~]# rpm -K squidclamav-6.2-1.fc15.x86_64.rpm squidclamav-6.2-1.fc15.x86_64.rpm: RSA sha1 (MD5) PGP md5 NICHT OK [root@vv06 ~]#
Oder etwas ausführlicher:
[root@vv06 ~]# rpm -vK tar-1.25-6.fc15.x86_64.rpm tar-1.25-6.fc15.x86_64.rpm: Header V3 RSA/SHA256 Signature, Schlüssel-ID 069c8460: NOKEY SHA1-Kurzfassung des Headers: OK (15d33eb16e581ee891218715bc59ba6d0192a543) V3 RSA/SHA256 Signature, Schlüssel-ID 069c8460: NOKEY MD5-Kurzfassung: OK (e06449f707b7904dfcf947fac3289550) [root@vv06 ~]# rpm -vK squidclamav-6.2-1.fc15.x86_64.rpm squidclamav-6.2-1.fc15.x86_64.rpm: Header V3 RSA/SHA256 Signature, Schlüssel-ID b78e038c: NOKEY SHA1-Kurzfassung des Headers: OK (171138c6f91cb3c3bcaa41f41efa1b7c0a8b7d00) V3 RSA/SHA256 Signature, Schlüssel-ID b78e038c: NOKEY MD5-Kurzfassung: OK (b3828280766f35fe68decd9345bef2cd) [root@vv06 ~]#
Wer es noch ausführlicher wünscht, der kann statt rpm -vK auch rpm -vvK schreiben. Das Ergebnis bleibt aber das gleiche: Ein hohes Maß an Übereinstimmung. Beidesmal V3-Header und beidesmal RSA/SHA256 Signatur. Ich denke, das sieht sehr ordentlich aus.
Jetzt möchte ich aber wissen, wie das ganze aussieht wenn alle Schlüssel ordentlich importiert wurden. Dazu muß ich nun sowohl den Fedora-15 als auch meinen eigenen Schlüssel importieren.
[root@vv06 ~]# rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' Das Paket gpg-pubkey ist nicht installiert [root@vv06 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-15-primary [root@vv06 ~]# rpm --import /root/rpm-gpg-key.txt [root@vv06 ~]# rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' gpg-pubkey-069c8460-4d5067bf --> gpg(Fedora (15) <fedora@fedoraproject.org>) gpg-pubkey-b78e038c-4d077ccc --> gpg(Oliver Seeburger <oliver.seeburger@sundermeier-werkzeugbau.de>) [root@vv06 ~]#
Man sieht, alle Signaturen sind wieder da. Nun kann ich erneut die Pakete vergleichen.
[root@vv06 ~]# rpm -K tar-1.25-6.fc15.x86_64.rpm tar-1.25-6.fc15.x86_64.rpm: rsa sha1 (md5) pgp md5 OK [root@vv06 ~]# rpm -K squidclamav-6.2-1.fc15.x86_64.rpm squidclamav-6.2-1.fc15.x86_64.rpm: rsa sha1 (md5) pgp md5 OK [root@vv06 ~]#
Oder etwas ausführlicher:
[root@vv06 ~]# rpm -vK tar-1.25-6.fc15.x86_64.rpm tar-1.25-6.fc15.x86_64.rpm: Header V3 RSA/SHA256 Signature, Schlüssel-ID 069c8460: OK SHA1-Kurzfassung des Headers: OK (15d33eb16e581ee891218715bc59ba6d0192a543) V3 RSA/SHA256 Signature, Schlüssel-ID 069c8460: OK MD5-Kurzfassung: OK (e06449f707b7904dfcf947fac3289550) [root@vv06 ~]# rpm -vK squidclamav-6.2-1.fc15.x86_64.rpm squidclamav-6.2-1.fc15.x86_64.rpm: Header V3 RSA/SHA256 Signature, Schlüssel-ID b78e038c: OK SHA1-Kurzfassung des Headers: OK (171138c6f91cb3c3bcaa41f41efa1b7c0a8b7d00) V3 RSA/SHA256 Signature, Schlüssel-ID b78e038c: OK MD5-Kurzfassung: OK (b3828280766f35fe68decd9345bef2cd) [root@vv06 ~]#
Auch hier kann man getrost anstatt -vK -vvK schreiben. So oder so, jetzt bin ich ganz und gar zufrieden. Meine eigene Paketsignatur ist auf gleicher Höhe wie die von Fedora. Genau das wollte ich ja auch erreichen.