1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

GNU Privacy Guard

GnuPG implementiert den OpenPGP Standard für die digitale Signatur und Verschlüsselung. Dieses Kapitel zeigt, wie man die Schlüssel sicher auf einer OpenPGP-Karte wie dem YubiKey 5 NFC speichert und der Secure Shell zur Verfügung stellt.

Komponenten

Installation

Zusätzlich zum Kommandozeilenwerkzeug gpg installieren wir Pakete zur Kommunikation mit einer OpenPGP-Karte und der Einrichtung des YubiKey.

apt install gnupg scdaemon pcscd yubikey-manager

Konfiguration

~/.gnupg/gpg.conf
Konfiguration des Kommandozeilenwerkzeugs
~/.gnupg/gpg-agent.conf
Der Schlüssel-Agent merkt sich Passwörter und PINs und stellt Anwendungsprogrammen Signatur- und Verschlüsselungs- und Authentisierungdienste zur Verfügung.
~/.gnupg/dirmngr.conf
Kommunikation mit Schlüsselservern
~/.gnupg/scdaemon.conf
Konfiguration des Karten-Daemons
~/.gnupg/pubring.kbx
Schlüsselbund mit öffentlichen Schlüsseln
~/.gnupg/private-keys-v1.d/*.key
Verzeichnis mit privaten Schlüsseln

GnuPG hat sichere Voreinstellungen, eine Festlegung auf bestimmte Algorithmen (Härtung) ist meiner Meinung nach eher kontraproduktiv

~/.gnupg/gpg.conf

# Avoid information leaked when exporting keys
no-emit-version
no-comments
export-options		export-minimal

# Displays the long format of the ID of the keys and their fingerprints
keyid-format		0xlong
with-fingerprint

# Show UID validity in key listings
list-options		show-uid-validity
verify-options		show-uid-validity

# Always use the following keyserver
keyserver		hkps://hkps.pool.sks-keyservers.net
keyserver-options	no-honor-keyserver-url
keyserver-options	include-revoked

Schlüssel erzeugen

Theoretisch kann der YubiKey Schlüssel generieren, die das Gerät niemals verlassen können. Leider habe ich keine Möglichkeit gefunden, diese in den Schlüsselbund von GnuPG zu integrieren. Daher folgen wir dem vorgeschlagenen Pfad, einen separat aufbewahrten Hauptschlüssel mit kurzlebigen Unterschlüsseln für die verschiedenen kryptograohischen Operationen zu erzeugen.

Slot Operation Verwendung
[C]ertify Hauptschlüssel zum Ausstellen der Unterschlüssel
1 [S]ign Unterschlüssel zum Unterschreiben
2 [E]ncrypt Unterschlüssel zum Verschlüsseln
3 [A]uthenticate Unterschlüssel zum Authentifizieren

Der Hauptschlüssel wird ausschließlich dazu verwendet, Unterschlüssel zu unterschreiben. Er bleibt beliebig lange gültig.

id=User
gpg --expert --full-gen-key
	Bitte wählen Sie, welche Art von Schlüssel Sie möchten
		11	ECC (Nutzung selber einstellbar)
	Derzeit erlaubte Vorgänge: Zertif
		S	Signaturnutzbarkeit aus
		Q	Beenden
	Bitte wählen Sie, welche elliptische Kurve Sie möchten:
		1	Curve 25519
	Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
		0	Schlüssel verfällt nie
	Ihr Name
	Email-Adresse
	Kommentar
		F	Fertig
	Passphrase

Als nächstes erzeugen wir drei Unterschlüssel hinzu, die wir später auf dem YubiKey speichern werden. Dabei wird jedesmal die Passphrase des Hauptschlüssels abgefragt.

gpg --expert --edit-key $id
addkey
	10	ECC (Nur signieren)
	1	Curve 25519
	1y	Schlüssel verfällt nach n Jahren
addkey
	12	ECC (nur verschlüsseln)
	1	Curve 25519
	1y	Schlüssel verfällt nach n Jahren
addkey
	11	ECC (Nutzung selber einstellbar)
	A	Authentisierungsnutzbarkeit ein
	S	Signaturnutzbarkeit aus
	Q	Beenden
	1	Curve 25519
	1y	Schlüssel verfällt nach n Jahren

Doch vorher exportieren wir alle privaten Schlüssel.

gpg         --gen-revoke            $id > $id.revoke
gpg --armor --export                $id > $id.pub
gpg --armor --export-secret-keys    $id > $id.key
gpg --armor --export-secret-subkeys $id > $id.subkey
gpg         --export-ssh-key        $id >> authorized_keys

Danach löschen wir den Hauptschlüssel aus dem Schlüsselbund und re-importieren nur die Unterschlüssel.

gpg --delete-secret-key $id
gpg --import $id.subkey

Den Hauptschlüssel speichern wir auf einem externen Datenträger und bewahren diesen an einem sicheren Ort auf.

YubiKey

Nun verschieben wir die drei Unterschlüssel auf den Yubikey.

gpg --expert --edit-key $id
key 1
keytocard
	1	(Signatur-Schlüssel)
key 1
key 2
keytocard
	2	(Verschlüsselungs-Schlüssel)
key 2
key 3
keytocard
	3	(Authentisierungs-Schlüssel)
key 3
save

Im Schlüsselbund verbleiben nur noch sogenannte Stubs, markiert durch ssb>.

gpg --list-secret-keys
/home/phrank/.gnupg/pubring.kbx
-------------------------------
sec#  ed25519/0x36AA8A4A6D1880C6 2021-04-12 [C]
  Schl.-Fingerabdruck = 47C2 2ACA 7F6A 67BD AF82  C9BB 36AA 8A4A 6D18 80C6
uid                [ ultimativ ] John Doe <john@example.com>
ssb>  ed25519/0x408E8DDF1CFE1E43 2021-04-12 [S] [verfällt: 2022-04-12]
ssb>  cv25519/0xCDD70704E48A3472 2021-04-12 [E] [verfällt: 2022-04-12]
ssb>  ed25519/0xCF424D61DD25DBE0 2021-04-12 [A] [verfällt: 2022-04-12]
^     ^       ^                  ^           ^              ^
|     Algo    Id                 Gültig von  Verwendung     Gültig bis
Unterschlüssel
? err Fehler
q undefined Ich weiß es nicht
r revoked Besitzer hat den Schlüssel zurückgezogen
e expired Die Gültigkeit des Schlüssels ist abgelaufen
1 - unknown Ich weiß es nicht
2 n never Ich vertraue ihm nicht
3 m marginal Ich vertraue ihm etwas
4 f full Ich vertraue ihm sehr
5 u ultimate Ich vertraue ihm absolut

Zum Schluß können wir die Karte noch personalisieren.

gpg --card-status
gpg --card-edit
admin
passwd
login
name
lang

Verschlüsselung testen (fragt nach PIN)

echo test | gpg --armor --sign --encrypt --recipient $id | gpg --armor --decrypt

Sollte einmal alles schiefgehen, lässt sich ein YubiKey 5 NFC mit folgenden APDUs vollständig zurücksetzen.

gpg-connect-agent << .
/hex
scd serialno
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 e6 00 00
scd apdu 00 44 00 00
/echo YubiKey has been successfully reset.
/echo All OpenPGP keys have been deleted. PINs have been reset to factory defaults.
/echo The factory default PINs are 123456 (user) and 12345678 (admin).
.

Secure Shell

Komponenten
~/.gnupg/gpg-agent.conf
enable-ssh-support
systemctl --user restart gpg-agent.service
gpgconf --list-dirs
export SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh"

Literatur

  1. Installieren und einrichten
  2. Schlüssel generieren
  3. YubiKey-Guide