Wie konfiguriere ich eine GPG-Smartcard zur SSH-Authentifizierung?
Eine GPG-Smartcard für die SSH-Authentifizierung unter Linux zu konfigurieren ist nicht trivial.
Dieses Dokument umfasst das Verfahren, eine GPG-Smartcard für die SSH- Authentifizierung zu konfigurieren. Dies ist eine geeignete Lösung für die Zwei-Faktor-Authentifizierung: In diesem Fall wird ein Hardware-Token (der Yubikey) und das Passwort zum Entsperren einer Sitzung erforderlich.
Die folgenden Beispiele werden mit Fedora 23 x86_64 und Ubuntu 15.04 x86_64 gezeigt. Es gibt noch weitere Tutorials für andere Betriebssysteme und Schlüssel, s. Danksagungen.
Anforderungen
Der Gemalto-USB-Shell-Token
Um einen Gemalto-USB-Shell-Token (v2) zu erhalten besuchen Sie http://shop.kernelconcepts.de/.
- Gemalto USB Shell Token (v2)
- OpenPGP Smartcard V2
Der YubiKey Neo
Obwohl dieses Dokument geschrieben wurde für den YubiKey NEO, arbeiten diese Anweisungen auch für den Yubikey 4 als auch (sowohl in der Standard- wie auch in der Nano-Größe). Sofern Sie planen, die NFC-Funktionalität des Yubikey NEO zu verwenden, empfehlen wir den Yubikey 4, der 4096-Bit-PGP- Schlüssel unterstützt. Der NEO ist hingegen begrenzt auf 2048-Bit-Schlüssel.
Konfigurieren der Authentifizierung mit der GNOME-Shell
Zum Konfigurieren der Authentifizierung mit einem zuvor generierten GnuPG- Schlüssel, muss die GNOME-Shell angepasst werden. Mit Hilfe mehrerer Ressourcen kann das Sstem so konfiguriert werden, dass die SSH-Authentifizierung mit dem gpg-agent erfolgt.
Bestimmte Software muss installiert sein: gnupg2 (das wahrscheinlich bereits installiert ist), gnupg2-smime (gpgsm auf Ubuntu), pcsc-lite-ccid und pcsc-lite (pcscd und libpcsclite1 auf Ubuntu).
Fedora:
$ sudo dnf install gnupg gnupg2-smime pcsc-lite pcsc-lite-ccid
Ubuntu:
$ sudo apt-get install gnupg-agent gnupg2 pinentry-gtk2 scdaemon \ libccid pcscd libpcsclite1 gpgsm
YubiKey
Für den YubiKey kommen zusätzlich noch dessen Utility-Pakete hinzu: libyubikey (libyubikey-dev auf Ubuntu).
Fedora:
$ sudo dnf install ykpers libyubikey
Ubuntu:
$ sudo apt-get install yubikey-personalization libyubikey-dev libykpers-1-dev
Note
Optional können Sie das Yubikey NEO Manager GUI installieren. Falls Sie Ubuntu verwenden, können Sie den Yubikey-NEO-Manager und andere Yubikey- Software von Yubico PPA verwenden.
Aktiviert eure YubiKey-NEO-Smartcard-Schnittstelle (CCID)
Dies wird den Smartcard-Teil eures YubiKey-NEO aktivieren:
$ ykpersonalize -m82
Wenn ihr einen Dev-Key habt, startet euren YubiKey neu (entfernen und erneut einschieben), so dass ykneomgr funktioniert.
Konfigurieren der GNOME-Shell für gpg-agent
Konfigurieren Sie GPG um diesen Agenten zu verwenden (nur für Smartcard):
$ echo "use-agent" >> ~/.gnupg/gpg.conf
Aktivieren Sie gpg-agent als ssh-agent-Ersatz:
$ echo "enable-ssh-support" >> ~/.gnupg/gpg-agent.conf
Note
Lasst Admin-Aktionen auf eurem YubiKey zu (wenn eure GnuPG-Version <2.0.11 ist):
$ echo "allow-admin" >> ~/.gnupg/scdaemon.conf
Ersetzen des GNOME Schlüsselbund durch gpg-agent für die SSH-Authentifizierung
Ubuntu:
Öffnen Sie Autostart
Deaktivieren Sie GPG Password Agent und SSH-Key Agent
Bearbeiten Sie /usr/share/upstart/sessions/gpg-agent.conf, so dass das Pre-Start-Skript folgendes enthält:
eval "$(gpg-agent --daemon --enable-ssh-support --sh)" >/dev/null initctl set-env --global GPG_AGENT_INFO=$GPG_AGENT_INFO initctl set-env --global SSH_AUTH_SOCK=$SSH_AUTH_SOCK initctl set-env --global SSH_AGENT_PID=$SSH_AGENT_PID
Fügen Sie die folgenden Zeilen an dem Post-Stopp-Skript Abschnitt hinzu:
initctl unset-env --global SSH_AUTH_SOCK initctl unset-env --global SSH_AGENT_PID
Kommentieren Sie die use-ssh-agent-Zeile in der /etc/X11/XSession.options-Datei aus.
Deaktivieren Sie den anderen gpg-agent des Systems:
mv /etc/X11/Xsession.d/90gpg-agent ~/bak/90gpg-agent
Note
Wir könnten den gpg-agent der Xsession verwenden aber es gibt einen offenen Bug-Report für 90gpg-agent. Auch hat das Start-Skript die Möglichkeit , die Umgebungsvariablen global mit initctl set-env --global zu exportieren.
Fedora:
Wenn Gnome läuft, müssen Sie gnome-keyring von Autostart seiner ssh-agent-Implementierung hindern, da wir diejenige von GPG verwenden wollen:
sed -e '$aX-GNOME-Autostart-enabled=false' -e '$aHidden=true' /etc/xdg/autostart/gnome-keyring-ssh.desktop > $HOME/.config/autostart/gnome-keyring-ssh.desktop
Für Gnome 3.16 oder früher machen Sie dasselbe mit der fehlerhaften gpg-agent -Implementierung, die keine Smart Cards unterstützt:
sed -e '$aX-GNOME-Autostart-enabled=false' -e '$aHidden=true' /etc/xdg/autostart/gnome-keyring-gpg.desktop > $HOME/.config/autostart/gnome-keyring-gpg.desktop
Als nächstes legen Sie folgendes in ~/.bashrc an um sicherzustellen, dass gpg-agent mit --enable-ssh-support startet:
if [ ! -f /run/user/$(id -u)/gpg-agent.env ]; then killall gpg-agent; eval $(gpg-agent --daemon --enable-ssh-support > /run/user/$(id -u)/gpg-agent.env); fi . /run/user/$(id -u)/gpg-agent.env
Nun gehen Sie zum nächsten Schritt (Neu laden der Gnome-Shell)
Ansonsten gibt es noch eine weitere Option:
Ein ziemlich schwieriger Teil dieser Konfiguration ist in einem Wrapper-Skript zusammengefasst, dem sogenannten gpg-agent-wrapper. Vielen Dank an Diego E. Pettenò für dieses Skript:
wget -O ~/.gnupg/gpg-agent-wrapper https://github.com/lfit/ssh-gpg-smartcard-config/raw/master/gpg-agent-wrapper && chmod +x ~/.gnupg/gpg-agent-wrapper
Note
Der obige Code wurde geändert um zu ermöglichen, dass gpg-agent-info nach SSH_AUTH_SOCK ausgeführt wird. Bitte beachten Sie den Abschnitt Danksagungen weiter unten.
Das obige gpg-agent-wrapper-Skript wird mit X und bash (oder eurer Lieblingsshell) aufgerufen. Bitte legt hierfür die folgenden Dateien an:
für die X-Session:
$ cat /etc/X11/xinit/xinitrc.d/01-xsession [ -f ${HOME}/.xsession ] && source ${HOME}/.xsession $ ls -l /etc/X11/xinit/xinitrc.d/01-xsession -rwxr-xr-x. 1 root root 53 Nov 23 10:54 /etc/X11/xinit/xinitrc.d/01-xsession $ cat ~/.xsession source ${HOME}/.gnupg/gpg-agent-wrapper
für die Shell-rc-Datei:
$ cat ~/.bashrc # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi … # ssh authentication component source ${HOME}/.gnupg/gpg-agent-wrapper …
Neu laden der Gnome-Shell
Das Neustarten der Maschine funktioniert am besten.
PINs setzen
Es gibt eine reguläre PIN, die verwendet wird, um die Token für das Signieren, Verschlüsselung oder Authentifizierung zu entsperren. Darüber hinaus gibt es eine Admin-PIN, die verwendet wird um die PIN und/oder den Reset-Code für den Schlüssel selbst zurückzusetzen.
Führen Sie diese Schritte für die PIN und die Admin-Pin durch
- Gemalto USB Shell Token V2 und OpenPGP SmartCard V2
- Im Lieferumfang sollte ein Dokument mit der Beschreibung der Standard- PIN-Werte sein. Es gibt eine reguläre PIN, die verwendet wird, um den Token für das Signieren, Verschlüsseln oder Authentifizieren zu entsperren. Darüber hinaus gibt es eine Admin-PIN, die die PIN und/oder den Reset- Code für den Schlüssel zum Zurücksetzen erlaubt.
- YubiKey
- Die Standard-Pins sind 123.456 beziehungsweise 12.345.678.
$ gpg2 --card-edit … gpg/card> admin Admin commands are allowed gpg/card> passwd gpg: OpenPGP card no. D27600012401020000050000158A0000 detected 1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? 3
Geben Sie die aktuelle Admin-PIN ein:
Geben Sie dann die neue Admin-PIN ein:
PIN
1 - change PIN 2 - unblock PIN 3 - change Admin PIN 4 - set the Reset Code Q - quit Your selection? 1
Geben Sie die aktuelle PIN ein:
Geben Sie dann die neuePIN ein:
Note
Wenn die Admin-PIN nicht eingegeben wurde, kann sie erforderlich werden, bevor die Änderungen angewendet werden.
Generieren eines SSH-Schlüssel mit GnuPG
Es gibt mehrere Möglichkeiten, einen SSH-Schlüssel mit GnuPG zu generieren. Üblich ist, die neuen Authentifizierungsschlüssel mit einem bereits vorhandenen Schlüssel zu verknüpfen:
$ gpg2 --edit-key 8A8F1D53 gpg (GnuPG) 1.4.12; Copyright (C) 2012 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. Secret key is available. pub 3072R/8A8F1D53 created: 2012-10-06 expires: never usage: SC trust: ultimate validity: ultimate sub 3072R/2F15E06B created: 2012-11-23 expires: 2022-11-21 usage: S sub 3072R/EB8B4EBD created: 2012-11-24 expires: 2022-11-22 usage: E sub 3072R/6BB325E9 created: 2012-11-24 expires: 2022-11-22 usage: A [ultimate] (1). Clint Savage <herlo1@gmail.com> [ultimate] (2) Clint Savage <herlo@fedoraproject.org> [ultimate] (3) Clint Savage <csavage@linuxfoundation.org> gpg>
In diesem edit-key-Dialog können Sie nun einen Schlüssel auf der Karte erstellen:
gpg> addcardkey Signature key ....: 91BC 60CC B9EC 8E73 923A FC6D 58CD 88A6 2F15 E06B Encryption key....: 0CC3 DC3E 0D17 6111 A62B F656 63C6 4DA9 EB8B 4EBD Authentication key: 9EBF A9FE 8AE1 0FEB 1699 CE9A 779F 43D5 EC6F CC13 Please select the type of key to generate: (1) Signature key (2) Encryption key (3) Authentication key Your selection? 3 IT WILL PROMPT YOU TO ENTER THE ADMIN PIN, AND THEN THE REGULAR PIN. Don't fat finger this part! gpg: WARNING: such a key has already been stored on the card! Replace existing key? (y/N) y What keysize do you want for the Authentication key? (3072) Key is protected. You need a passphrase to unlock the secret key for user: "Clint Savage <herlo1@gmail.com>" 3072-bit RSA key, ID 8A8F1D53, created 2012-10-06 Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 10y Key expires at Mon 21 Nov 2022 05:29:00 PM MST Is this correct? (y/N) y Really create? (y/N) y gpg: Note that the key does not use the suggested creation date pub 3072R/8A8F1D53 created: 2012-10-06 expires: never usage: SC trust: ultimate validity: ultimate sub 3072R/2F15E06B created: 2012-11-23 expires: 2022-11-21 usage: S sub 3072R/EB8B4EBD created: 2012-11-24 expires: 2022-11-22 usage: E sub 3072R/6BB325E9 created: 2012-11-24 expires: 2022-11-22 usage: A [ultimate] (1). Clint Savage <herlo1@gmail.com> [ultimate] (2) Clint Savage <herlo@fedoraproject.org> [ultimate] (3) Clint Savage <csavage@linuxfoundation.org>
Nachdem Sie den Schlüssel generiert haben, müssen Sie sicherstellen, dass er auf der Karte gespeichert wird:
gpg> save $
Stellen Sie sicher, dass der SSH-Schlüssel über den GPG-Agent verwaltet wird
Unter der Annahme, dass das oben beschriebene richtig konfiguriert ist, sollte ein einfacher Test wird mit der Smartcard ausgeführt werden:
:
$ ssh-add -L ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDL/XmU…BL0luE= cardno:00050000158A
Dateien
Das Repository github.com/herlo/ssh-gpg-smartcard-config enthält alle Dateien, die für die obigen Änderungen notwendig sind. Bitte fühlen Sie sich frei diese zu lesen.
Danksagungen
Ein besonderer Dank geht an die folgenden Personen und/oder Links:
Lizenz
Diese Arbeit ist lizenziert unter der Creative Commons Attribution-ShareAlike 4.0 International License.