Wie konfiguriere ich eine GPG-Smartcard zur SSH-Authentifizierung?

Konfiguration zur Verwendung von GPG-Smartcards 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

  1. 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.

  2. 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

  1. Konfigurieren Sie GPG um diesen Agenten zu verwenden (nur für Smartcard):

    $ echo "use-agent" >> ~/.gnupg/gpg.conf
    
  2. 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
    
  3. Ersetzen des GNOME Schlüsselbund durch gpg-agent für die SSH-Authentifizierung

    Ubuntu:

    1. Öffnen Sie Autostart

    2. Deaktivieren Sie GPG Password Agent und SSH-Key Agent

      Autostart
    3. 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
      
    4. 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
      
    5. Kommentieren Sie die use-ssh-agent-Zeile in der /etc/X11/XSession.options-Datei aus.

    6. 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:

    1. 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
      
    2. 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
      
    3. 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:

GPG-Admin-PIN

Geben Sie dann die neue Admin-PIN ein:

Neue GPG-Admin-PIN

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:

GPG-PIN

Geben Sie dann die neuePIN ein:

Neue GPG-PIN

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.

Lizenz

Diese Arbeit ist lizenziert unter der Creative Commons Attribution-ShareAlike 4.0 International License.