Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
nitrokey:arch:start [04.06.2024 18:54. ] – [Anwendungsfälle - Software] django | nitrokey:arch:start [09.07.2025 12:05. ] (aktuell) – [Nitrokey Start und Thunderbird] django | ||
---|---|---|---|
Zeile 43: | Zeile 43: | ||
/ | / | ||
- | Mit Hilfe des Befehls '' | + | Mit Hilfe des Befehls '' |
# lsusb | grep Nitrokey | # lsusb | grep Nitrokey | ||
Bus 002 Device 020: ID 20a0:4211 Clay Logic Nitrokey Start | Bus 002 Device 020: ID 20a0:4211 Clay Logic Nitrokey Start | ||
Zeile 128: | Zeile 128: | ||
++++ | ++++ | ||
- | Die erforderliche udev-Regel findet sich also in der Datei **''/ | + | Die erforderliche udev-Regel findet sich also in der Datei **''/ |
==== erster Test ==== | ==== erster Test ==== | ||
Zeile 273: | Zeile 273: | ||
Wir wollen uns nun einen neuen PGP-Schlüssel in der SmartCard erzeugen und rufen hierzu den Befehl **generate** auf. Der **Nitrokey Start** unterstützt **__RSA__-Schlüssellängen** von **1024** und maximal von **2048**! | Wir wollen uns nun einen neuen PGP-Schlüssel in der SmartCard erzeugen und rufen hierzu den Befehl **generate** auf. Der **Nitrokey Start** unterstützt **__RSA__-Schlüssellängen** von **1024** und maximal von **2048**! | ||
- | <WRAP center round important | + | <WRAP center round important |
Mit Hinblick auf die möglichen Unsicherheiten im Bezug auf die [[https:// | Mit Hinblick auf die möglichen Unsicherheiten im Bezug auf die [[https:// | ||
Zeile 308: | Zeile 308: | ||
Real name: Django aka [BOfH] | Real name: Django aka [BOfH] | ||
- | Email address: secmail@mailserver.guru | + | Email address: secmail@nausch.org |
Comment: Bastard Operator from Hell | Comment: Bastard Operator from Hell | ||
You selected this USER-ID: | You selected this USER-ID: | ||
- | " | + | " |
Change (N)ame, (C)omment, (E)mail or (O)kay/ | Change (N)ame, (C)omment, (E)mail or (O)kay/ | ||
Zeile 318: | Zeile 318: | ||
Nun wird auf der Karte der gewählte Schlüssel erzeugt. | Nun wird auf der Karte der gewählte Schlüssel erzeugt. | ||
- | <WRAP center round tip 95%> | + | <WRAP center round tip 90%> |
Die Erzeugung eines Schlüssels mit einer Länge von **2048** dauert ca. 5 Minuten, also keinesfalls den Nitrokey Start abziehen oder die Generierung abbrechen! Während der Erzeugung der Schlüssel leuchtet die rote LED im Stick. | Die Erzeugung eines Schlüssels mit einer Länge von **2048** dauert ca. 5 Minuten, also keinesfalls den Nitrokey Start abziehen oder die Generierung abbrechen! Während der Erzeugung der Schlüssel leuchtet die rote LED im Stick. | ||
</ | </ | ||
Zeile 329: | Zeile 329: | ||
pub | pub | ||
E65B2BDF79A2E2E4C28F6E062E22436430385B49 | E65B2BDF79A2E2E4C28F6E062E22436430385B49 | ||
- | uid Django aka [BOfH] (Bastard Operator from Hell) < | + | uid Django aka [BOfH] (Bastard Operator from Hell) < |
sub | sub | ||
sub | sub | ||
Zeile 482: | Zeile 482: | ||
Real name: Django aka [BOfH] | Real name: Django aka [BOfH] | ||
- | Email address: secmail@mailserver.guru | + | Email address: secmail@nausch.org |
Comment: Bastard Operator from Hell | Comment: Bastard Operator from Hell | ||
You selected this USER-ID: | You selected this USER-ID: | ||
Zeile 548: | Zeile 548: | ||
=== Öffentlichen Schlüssel ausgeben === | === Öffentlichen Schlüssel ausgeben === | ||
Damit wir später unseren öffentlichen Schlüssel auch weitergeben oder zu einem [[https:// | Damit wir später unseren öffentlichen Schlüssel auch weitergeben oder zu einem [[https:// | ||
- | $ gpg --export --armor django@nausch.org > ~/.gnupg/secmail@mailserver.guru.pubkey | + | $ gpg --export --armor django@nausch.org > ~/.gnupg/django@nausch.org.pubkey |
Diese Datei enthält unseren Schlüssel in ASCII-lesbarer Form. | Diese Datei enthält unseren Schlüssel in ASCII-lesbarer Form. | ||
- | $ cat ~/.gnupg/secmail@mailserver.guru.pubkey | + | $ cat ~/.gnupg/django@nausch.org.pubkey |
- | <file key secmail@mailserver.guru.pubkey> | + | <file key secmail@nausch.org.pubkey> |
mDMEZZXO7BYJKwYBBAHaRw8BAQdA++J6Astvcm2DsHDnzXGHKujQiokCxG+F3qPy | mDMEZZXO7BYJKwYBBAHaRw8BAQdA++J6Astvcm2DsHDnzXGHKujQiokCxG+F3qPy | ||
Zeile 677: | Zeile 677: | ||
=== change-pin === | === change-pin === | ||
- | <WRAP center round alert 95%> | + | <WRAP center round alert 90%> |
**WICHTIG**: | **WICHTIG**: | ||
Unbedingt vor dem ersten Ändern der PINs ist es notwendig, erst einmal Schlüssel zu generieren bzw. zu importieren! Denn sonst schlägt das Ändern der Benutzer-PIN fehl, bzw. wird die Benutzer-PIN beim Überschreiben von Schlüsseln auf den Default-Wert von **123456** zurückgesetzt. Die Default-PIN für den Admin lautet **12345678**. | Unbedingt vor dem ersten Ändern der PINs ist es notwendig, erst einmal Schlüssel zu generieren bzw. zu importieren! Denn sonst schlägt das Ändern der Benutzer-PIN fehl, bzw. wird die Benutzer-PIN beim Überschreiben von Schlüsseln auf den Default-Wert von **123456** zurückgesetzt. Die Default-PIN für den Admin lautet **12345678**. | ||
Zeile 690: | Zeile 690: | ||
Die Admin-PIN (Menüpunkt **3**) wird für die Karten-/ | Die Admin-PIN (Menüpunkt **3**) wird für die Karten-/ | ||
- | <WRAP center round important | + | <WRAP center round important |
Wird die Benutzer-PIN 3x falsch eingeben, wird die Karte gesperrt und kann dann nur mit der Admin-PIN oder dem Reset-Code zurückgesetzt werden. Wenn Sie den falschen Admin-Pin dreimal eingeben, wird die Karte unbrauchbar und kann dann lediglich mit einem Factory-Reset (Verlußt aller Kartendaten!) zurück gesetzt werden! | Wird die Benutzer-PIN 3x falsch eingeben, wird die Karte gesperrt und kann dann nur mit der Admin-PIN oder dem Reset-Code zurückgesetzt werden. Wenn Sie den falschen Admin-Pin dreimal eingeben, wird die Karte unbrauchbar und kann dann lediglich mit einem Factory-Reset (Verlußt aller Kartendaten!) zurück gesetzt werden! | ||
Zeile 775: | Zeile 775: | ||
gpg/ | gpg/ | ||
+ | |||
+ | === Schlüssel umziehen bzw. auf weiterem Rechner nutzen === | ||
+ | Oft kommt es vor dass man entweder sein Schlüsselmaterial von einem Rechner auf einen anderen|neuen umziehen möchte, oder man benutzt ein und denselben Stick wahlweise auf mehreren Rechnern (Desktop, Laptop, etc.). | ||
+ | <WRAP center round tip 90%> | ||
+ | Nur wie bekommt man nun seinen privaten Schlüssel, der ja nur in der SmartCard des Kryptosticks sicher verwahrt wird, oder genauer gesagt seine Identität auf den neuen weiteren Rechner? Ganz einfach, man exportiert den OpenPGP-Schlüssel aus dem Schlüsselbund und importiert diesen dann auf dem neuen Rechner wieder mit GnuPG! | ||
+ | Der Ablauf ist der Gleiche wie bei einem " | ||
+ | |||
+ | Zunächst werfen wir also einen Blick in unseren keyring: | ||
+ | $ gpg2 --list-secret-keys | ||
+ | < | ||
+ | ------------------------------- | ||
+ | sec> | ||
+ | 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | Card serial no. = FFFE 43243711 | ||
+ | uid | ||
+ | ssb> | ||
+ | ssb> | ||
+ | |||
+ | sec> | ||
+ | F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | Card serial no. = 000F 6447F253 | ||
+ | uid | ||
+ | ssb> | ||
+ | ssb> | ||
+ | |||
+ | Den privaten Schlüssel unseres Nitrokey mit der Karten Serien-Nummer **'' | ||
+ | $ gpg --card-status | grep ' | ||
+ | |||
+ | General key info..: pub ed25519/ | ||
+ | |||
+ | Zunächst exportieren wir nun also die " | ||
+ | $ gpg -o ~/ | ||
+ | |||
+ | Diese Datei enthält nun alle nötigen Informationen. | ||
+ | $ file ~/ | ||
+ | |||
+ | / | ||
+ | |||
+ | Diese Datei kopieren wir nun auf einem sicheren und geschützten Weg auf unseren neuen weiteren Rechner. | ||
+ | |||
+ | Werfen wir zunächst noch einen Blick in den **keyring** auf unserem zweiten Rechner: | ||
+ | $ gpg2 --list-secret-keys | ||
+ | < | ||
+ | ------------------------------- | ||
+ | sec> | ||
+ | 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | Card serial no. = FFFE 43243711 | ||
+ | uid | ||
+ | ssb> | ||
+ | ssb> | ||
+ | </ | ||
+ | Hier fehlt also **__noch__** die Information für unseren weiteren Kryptostick der die eMail-adresse **'' | ||
+ | |||
+ | Wir importieren also nun die kopierte Pseudo-Dummy-Keydatei, | ||
+ | $ gpg --import Downloads/ | ||
+ | < | ||
+ | gpg: To migrate ' | ||
+ | gpg: key 0A56C9A3A69FE291: | ||
+ | gpg: Total number processed: 1 | ||
+ | gpg: | ||
+ | gpg: | ||
+ | |||
+ | Wie uns aufgetragen migrieren wir nun für die neue smartcard den **'' | ||
+ | ~$ gpg --card-status | ||
+ | < | ||
+ | Application ID ...: D276000124010304000F6447F2530000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 3.4 | ||
+ | Manufacturer .....: unknown | ||
+ | Serial number ....: 6447F253 | ||
+ | Name of cardholder: Michael Nausch | ||
+ | Language prefs ...: de | ||
+ | Salutation .......: Mr. | ||
+ | URL of public key : https:// | ||
+ | Login data .......: django | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 0 3 | ||
+ | Signature counter : 10 | ||
+ | KDF setting ......: off | ||
+ | Signature key ....: F5F0 CD13 074B A693 D950 F92A 0A56 C9A3 A69F E291 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Encryption key....: DBBD 5355 D9D0 334A A3FA 751F A89D D54D AE0E 394A | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Authentication key: EE7C 3807 4F0A 8F2A 5601 BF91 1E61 4A9A 36D4 DF53 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | General key info..: pub ed25519/ | ||
+ | sec> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253</ | ||
+ | |||
+ | Nun lassen wir uns erneut alle secret-key-Informationen unsere **keyring** anzeigen: | ||
+ | $ gpg2 --list-secret-keys | ||
+ | < | ||
+ | ------------------------------- | ||
+ | sec> | ||
+ | 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | Card serial no. = FFFE 43243711 | ||
+ | uid | ||
+ | ssb> | ||
+ | ssb> | ||
+ | |||
+ | sec> | ||
+ | F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | Card serial no. = 000F 6447F253 | ||
+ | uid [ unknown] Michael Nausch < | ||
+ | ssb> | ||
+ | ssb> | ||
+ | </ | ||
+ | |||
+ | Voila, wir haben also nun alle benötigten Informationen in unserem keyring, so dass wir den weiteren Nitrokey auch auf unserem zusätzlichen Rechner nutzen können! | ||
+ | |||
+ | <WRAP center round important 90%> | ||
+ | **WICHTIG: | ||
+ | </ | ||
=== Verschlüsseln und entschlüsseln === | === Verschlüsseln und entschlüsseln === | ||
Zeile 790: | Zeile 909: | ||
PRIVACY_POLICY_URL=" | PRIVACY_POLICY_URL=" | ||
LOGO=archlinux-logo"</ | LOGO=archlinux-logo"</ | ||
- | - Nun verschlüsseln wir dieses Textdokument: | + | - Nun verschlüsseln wir dieses Textdokument: |
-rw-r--r-- 1 django django 581 Jun 3 22:35 testdatei.txt.pgp</ | -rw-r--r-- 1 django django 581 Jun 3 22:35 testdatei.txt.pgp</ | ||
Zeile 804: | Zeile 923: | ||
-----END PGP MESSAGE-----</ | -----END PGP MESSAGE-----</ | ||
- Nun entschlüsseln wir unser Dokument wieder.< | - Nun entschlüsseln wir unser Dokument wieder.< | ||
- | " | + | " |
- | gpg: all values passed to ' | + | |
- | </ | + | |
PRETTY_NAME=" | PRETTY_NAME=" | ||
ID=arch | ID=arch | ||
Zeile 902: | Zeile 1019: | ||
{{ : | {{ : | ||
+ | <WRAP center round important 90%> | ||
+ | **WICHTIG: | ||
+ | Ansonsten kommt es zu unliebsamen Fehlermeldungen wie z.B. **'' | ||
+ | </ | ||
+ | |||
+ | Zur Kontrolle ob alle privaten Schlüssel in Thunderbird verankert sind oder zum Importieren von neuen (umgezogenen) Private Keys klicken wir auf die Schaltfläche **[ OpenPGP-Schlüssel __v__erwalten ]** auf der Konfigurations-Seite **Ende-zu-Ende-Verschlüsselung** bei den **Kontoeinstellungen**. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Im Folgenden Konfigurationsbeispiel sehen wir nur den Schlüssel für einen User|Adresse **'' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Zum Importieren des Schlüssels für den User|Adresse **'' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Auf der Folgenden Seite klicken wir nun auf die Schaltfläche **[ __D__atei für den Import auswählen ]** und wählen dann die betreffende Schlüsseldatei aus | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Nun präsentiert und Thunderbirds Schlüsselverwaltung den erkannten Schlüssel für den User|Adresse **'' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Über den Menüpunkt **[ Schlüss__e__leigenschaften ]** können wir uns nochmal svergewissern ob der Schlüssel für unseren Einsatzzwek entsprechend passt. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Mit einem Klick auf die Schatfläche **[ OK ]** kommen wir zurück zur vorherigen Anzeige. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Dort klicken wir auf die Schlatfläche **[ S__c__hließen ]** und beenden damit den Import des Schlüsselmaterials bzw. des Dummy-Privatekey unseres Nitrokeys. | ||
+ | |||
+ | Wir sehen nun unsere beiden aktiven Schlüssel: | ||
+ | {{ : | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Nitrokey Start und Secure Shell ==== | ||
+ | |||
+ | <WRAP center round important 90%> | ||
+ | Ob man in Zeiten von Überwachungsphantasten in Unternehmen und vor allem auch bei einer NSA oder BND, noch **[[http:// | ||
+ | |||
+ | Der Sicherheitsguru Bruce Schneier hat in seinem **[[https:// | ||
+ | |||
+ | <wrap em>//" | ||
+ | |||
+ | **[[https:// | ||
+ | </ | ||
+ | |||
+ | Auf RSA Schlüssel muss man aber nicht mehr zwingend zurückgreifen, | ||
+ | Diesen Schlüssel wollen wir nun auch zur Serveradministration verwenden. | ||
+ | |||
+ | === SSH Client vorbereiten === | ||
+ | Damit wir beim Verbindungsaufbau auf den Authentication Key zugreifen können, müssen wir unseren Client entsprechend vorbereiten. | ||
+ | |||
+ | In der Konfigurationsdatei // | ||
+ | $ vim ~/ | ||
+ | <file bash ~/ | ||
+ | # See backup in '/ | ||
+ | |||
+ | # File re-created by pEp | ||
+ | # See backup in '/ | ||
+ | |||
+ | # Created by pEpEngine | ||
+ | keyserver hkp:// | ||
+ | cert-digest-algo SHA256 | ||
+ | no-emit-version | ||
+ | no-comments | ||
+ | personal-cipher-preferences AES AES256 AES192 CAST5 | ||
+ | personal-digest-preferences SHA256 SHA512 SHA384 SHA224 | ||
+ | ignore-time-conflict | ||
+ | allow-freeform-uid | ||
+ | |||
+ | # Ansible generated, do not edit manual! | ||
+ | # Option use-agent für Authentication Key Nutzung des Nitrokey Start bei SSH | ||
+ | use-agent | ||
+ | </ | ||
+ | |||
+ | |||
+ | Im nächsten Schritt aktivieren wir die Option '' | ||
+ | **// des GPG-Agenten. | ||
+ | $ vim ~/ | ||
+ | <file bash ~/ | ||
+ | # See backup in '/ | ||
+ | |||
+ | # File re-created by pEp | ||
+ | # See backup in '/ | ||
+ | |||
+ | default-cache-ttl 300 | ||
+ | max-cache-ttl 999999 | ||
+ | |||
+ | # Ansible generated, do not edit manual! | ||
+ | # SSH-Support activated for gnupg-agent | ||
+ | enable-ssh-support | ||
+ | </ | ||
+ | |||
+ | Nun werden wir noch die Datei // | ||
+ | $ vim ~/.bashrc | ||
+ | <file bash ~/ | ||
+ | |||
+ | # Source global definitions | ||
+ | if [ -f /etc/bashrc ]; then | ||
+ | . /etc/bashrc | ||
+ | fi | ||
+ | |||
+ | # User specific environment | ||
+ | PATH=" | ||
+ | export PATH | ||
+ | |||
+ | # Uncomment the following line if you don't like systemctl' | ||
+ | # export SYSTEMD_PAGER= | ||
+ | |||
+ | # User specific aliases and functions | ||
+ | |||
+ | # Django : 2024-05-25 | ||
+ | # Definition des SSH_AUTH_SOCK für den Zugriff des SSH-Schlüssels auf dem Nitrokey Start | ||
+ | unset SSH_AGENT_PID | ||
+ | if [ " | ||
+ | export SSH_AUTH_SOCK=" | ||
+ | fi</ | ||
+ | |||
+ | Damit unsere Änderungen aktiv werden, müssen wir nun zum Schluss noch den **pgp-agent** restarten bzw. einen Neustart des Clients erwirken. Wir entscheiden uns der Einfachheit halber von einen Neustart des Agenten mit Hilfe des Befehls '' | ||
+ | $ pkill gpg-agent | ||
+ | |||
+ | Ein Blick in die Prozessliste zeigt, dass der Agent nicht mehr läuft. | ||
+ | $ ps aux | grep gpg-agent | ||
+ | |||
+ | django | ||
+ | |||
+ | Nun stecken wir unseren Nitrokey Start an den USB-Port und fragen den Kartenstatus ab. | ||
+ | $ gpg2 --card-status | ||
+ | < | ||
+ | Application ID ...: D276000124010200FFFE432437110000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 2.0 | ||
+ | Manufacturer .....: unmanaged S/N range | ||
+ | Serial number ....: 43243711 | ||
+ | Name of cardholder: Michael Nausch | ||
+ | Language prefs ...: de | ||
+ | Salutation .......: Mr. | ||
+ | URL of public key : [not set] | ||
+ | Login data .......: [not set] | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 3 2 | ||
+ | Signature counter : 23 | ||
+ | KDF setting ......: off | ||
+ | UIF setting ......: Sign=off Decrypt=off Auth=off | ||
+ | Signature key ....: 2C08 2445 CDFB 72DE CD65 0350 610E D9AE E553 353F | ||
+ | created ....: 2024-01-03 21:17:32 | ||
+ | Encryption key....: 9533 C548 589F F00B 8FFF C93B B5E5 4345 BDA2 92A0 | ||
+ | created ....: 2024-01-03 21:17:32 | ||
+ | Authentication key: D5AF 3627 1220 7A2A 54BD 6C47 C72E 74B8 1A5C 4549 | ||
+ | created ....: 2024-01-03 21:17:32 | ||
+ | General key info..: pub ed25519/ | ||
+ | sec> | ||
+ | card-no: FFFE 43243711 | ||
+ | ssb> | ||
+ | card-no: FFFE 43243711 | ||
+ | ssb> | ||
+ | card-no: FFFE 43243711 | ||
+ | </ | ||
+ | |||
+ | Ein erneuter Blick in die Prozessliste zeigt nun den neu gestarteten Agenten. | ||
+ | $ ps aux | grep gpg-agent | ||
+ | |||
+ | django | ||
+ | django | ||
+ | |||
+ | === Public-Key des ED25519 SSH exportieren === | ||
+ | Für den Zugriff auf unser Ziel-System mit Hilfe der SSH benötigen wir noch den öffentlichen Schlüssel unseres Authentication Keys, den wir nun exportieren werden. | ||
+ | Zunächst besorgen wir uns die betreffende Schlüsselkennung des Authentication Keys, genauer gesagt die 4 letzten Zahlenreihen des nachfolgenden Aufrufs. | ||
+ | $ gpg2 --card-status | grep Authentication\ key | ||
+ | |||
+ | Authentication key: D5AF 3627 1220 7A2A 54BD 6C47 C72E 74B8 1A5C 4549 | ||
+ | In diesem Konfigurationsbeispiel ist die Schlüssel-ID des Autentication Keys also die Nummer '' | ||
+ | |||
+ | Nun exportieren wir den öffentlichen Schlüssel und schreiben diesen in eine separate Datei. | ||
+ | $ gpg2 --export-ssh-key C72E74B81A5C4549 >> ~/ | ||
+ | |||
+ | Der Öffentliche Schlüssel in diesen Konfigurationsbeispiel lautet also: | ||
+ | $ cat ~/ | ||
+ | |||
+ | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHMD4OSvbbTRAs88C5jQeUX7HOR0TYd+EIQLcKmGCBll openpgp: | ||
+ | |||
+ | Diesen Schlüssel kopieren wir nun auf das entsprechende Zielsystem an Ort und Stelle '' | ||
+ | $ scp ~/ | ||
+ | |||
+ | === SSH-Verbindung aufbauen === | ||
+ | Nun können wir wie gewohnt eine Verbindung zu unserem entfernten System aufbauen, sofern der GPG-Agent am laufen ist. Wir können dazu entweder erst einmal abfragen, ob dieser gestartet wurde, mit Hilfe des folgenden Aufrufs: | ||
+ | $ ps -aux | grep gpg-agent | ||
+ | |||
+ | django | ||
+ | |||
+ | Oder wir fragen einfach den Karten-Status ab, was unweigerlich den Neustart des GPG-Agenten nach sich zieht. | ||
+ | $ gpg2 --card-status | ||
+ | |||
+ | Nun können wir die gewünschte Verbindung zum Zielsystem aufbauen. | ||
+ | $ ssh zielhost.dmz.nausch.org | ||
+ | |||
+ | Da der SSH-Key zur Authentication nicht im Dateisystem liegt, sondern auf der SmartCard des Nitrokey werden wir nun nach der User-PIN gefragt, damit auf den privaten Schlüssel der Karte zugegriffen werden kann. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Der entsperrte Schlüssel der SmartCard des Nitrokey Start wird nun im Speicher gehalten solange wir den USB-Hardwareschlüssel nicht abziehen. | ||
+ | |||
+ | <WRAP center round important 90%> | ||
+ | **WICHTIG: | ||
+ | Da wir den Schlüssel **__nicht__** aus einer Datei geladen hatten, können wir diese auch nicht mit Hilfe von '' | ||
+ | $ pkill gpg-agent | ||
+ | |||
+ | </ | ||
+ | |||
+ | Anschliessend lassen sich Verbindungen zu unseren Remote-Systemen erst wieder aufbauen, wenn der GPG-Agent geladen und die Karte nach Eingabe der PIN entsperrt wurde! | ||
+ | |||
+ | ==== Nitrokey Start und Git/Gitlab ==== | ||
+ | |||
+ | <WRAP center round important 90%> | ||
+ | Git ist an sich kryptographisch sicher, so dass Änderungen sicher nachprüfbar nachverfolgt werden können. Was damit aber noch nicht sichergestellt werden kann, stammt die Änderung auch wirklich von der Person, der wir vertrauen! Git unterstützt hier ein paar Möglichkeiten die Arbeiten an einem Repository zu unterschreiben und auch zu überprüfen. | ||
+ | </ | ||
+ | |||
+ | === GPG Key-ID ermitteln === | ||
+ | Zunächst holen wir uns die Key-ID unseres Users. | ||
+ | $ gpg2 -K | ||
+ | < | ||
+ | ------------------------------- | ||
+ | sec> | ||
+ | 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | Card serial no. = FFFE 43243711 | ||
+ | uid | ||
+ | ssb> | ||
+ | ssb> | ||
+ | |||
+ | Die Key-ID unseres Adminusers **''< | ||
+ | |||
+ | === Git konfigurieren === | ||
+ | |||
+ | Nun können wir Git konfigurieren, | ||
+ | $ git config --global user.signingkey 610ED9AEE553353F! | ||
+ | |||
+ | Am besten aktivieren wir zusätzlich auch noch die Option, dass automatisch __alle__ Commits automatisch signiert werden. | ||
+ | $ git config --local commit.gpgsign true | ||
+ | |||
+ | |||
+ | === Unterzeichnung von Commits === | ||
+ | Wir sind nun in der Lage einzelne Commits zu unterschreiben, | ||
+ | < | ||
+ | <font style=" | ||
+ | 20:13 $ git commit -S -m "AIDE 19.0 - auf konfigurierbaren Timer umgestellt" | ||
+ | [AIDE-19.0 4c03596] AIDE 19.0 - auf konfigurierbaren Timer umgestellt | ||
+ | 6 files changed, 11 insertions(+), | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | === Unterschrift von Commits anzeigen === | ||
+ | Zum Anzeigen der Signaturen verwenden wir die Option **'' | ||
+ | < | ||
+ | <font style=" | ||
+ | 21:01 $ git log --show-signature -1 | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | gpg: using EDDSA key 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | gpg: Good signature from " | ||
+ | Author: django < | ||
+ | Date: Sun Apr 13 20:14:51 2025 +0200 | ||
+ | |||
+ | AIDE 19.0 - auf konfigurierbaren Timer umgestellt | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Optional kann man mit der Option **'' | ||
+ | < | ||
+ | <font style=" | ||
+ | 21:18 $ git log --pretty=" | ||
+ | 4c03596 G django | ||
+ | 8f04a39 N Django BOfH Merge branch ' | ||
+ | cdff19c N django | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Hier sehen wir, dass __**nur**__ der Commit mit der ID **'' | ||
+ | |||
+ | === PGP-Public-Key und GitLab === | ||
+ | Damit die signierten Commits nun auch in Gitlab überprüft werden können, ist es nötig dass der öffentliche Schlüssel beim Gitlab-Konto hinterlegt wird. Hierzu speichern wir den PGP-Public-Key beim Menüpunkt | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Bei der Anzeige der Commits in der GitLab Web-UI wird nun mit der Anzeige **Verfied Commit** entsprechend angezeigt, wenn der Commit entsprechend signiert wurde. Somit können wir zweifelsfrei feststellen, | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | == Zusammenfassung == | ||
+ | |||
+ | <WRAP center round tip 90%> | ||
+ | Ja, Commits oder auch Tags mit einer PGP-Signatur zu versehen, ist sicherlich eine gute und valide Idee. Allerdings nutzt dies wenig wenn nicht alle Beteiligten verstanden und verinnerlicht haben, warum dies in den Standardworkflows zu integrieren und umzusetzen ist. Hierzu ist es wichtig dass zum einen **alle Team-Mitglieder** über einen aktuellen und benutzbaren PGP-Schlüssel verfügen und ihre lokale Git-Umgebung entsprechend konfiguriert haben, dass eben **alle** Commits entsprechend automatisch signiert werden. | ||
+ | </ | ||
+ | |||