Portál AbcLinuxu, 1. května 2025 01:23

YubiKey NEO

Identifikace pod Linuxem

lsusb: Bus 008 Device 030: ID 1050:0116 Yubico.com

 

dmesg

[25846.452294] usb 8-2: new full speed USB device using uhci_hcd and address 31
[25846.615643] usb 8-2: New USB device found, idVendor=1050, idProduct=0116
[25846.615652] usb 8-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[25846.615660] usb 8-2: Product: Yubikey NEO OTP+U2F+CCID
[25846.615665] usb 8-2: Manufacturer: Yubico
[25846.615670] usb 8-2: SerialNumber: 0003675889
[25846.615890] usb 8-2: configuration #1 chosen from 1 choice
[25846.623854] input: Yubico Yubikey NEO OTP+U2F+CCID as /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input40
[25846.624169] generic-usb 0003:1050:0116.0039: input,hidraw0: USB HID v1.10 Keyboard [Yubico Yubikey NEO OTP+U2F+CCID] on usb-0000:00:1d.2-2/input0
[25846.629204] generic-usb 0003:1050:0116.003A: hiddev0,hidraw1: USB HID v1.10 Device [Yubico Yubikey NEO OTP+U2F+CCID] on usb-0000:00:1d.2-2/input1

Postup zprovoznění pod Linuxem

Pro zprovoznění přihlašování - openssh klíč je schovaný v tokenu:

 

1. Instalace balíčků

Debian Sqeeze nebo Jessie:

gnupg2, gnupg-agent, pinentry-gtk2, pinentry-curses, gpgsm, pcscd, libccid, gpgv, yubikey-personalization

Neinstalovat openct a opensc.

 

CentOS 6 nebo CentOS 7:

gnupg2, gnupg2-smime, pinentry-gtk, pinentry, pcsc-lite, ccid, ykpers

Neinstalovat openct a opensc.

 

2 Skript pro přístup obyčeného uživatele pro Yubiko Neo pro Debian Sqeeze a CentOS 6.

V Debianu Jessie nebo CentOS 7 není potřeba

Skript /etc/udev/rules.d/100-yubikeys.rules v Debian Sqeeze:


ACTION!="add|remove", GOTO="yubico_end"

# Udev rules for letting the console user access the Yubikey USB
# device node, needed for challenge/response to work correctly.
# idVendor and idProduct are from "lsusb" or "dmesg"

# Yubico Yubikey II
#ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0010|0110|0111|0114|0116|0401|0403|0405|0407|0410", OWNER="petr", MODE="0600"
ATTRS{idVendor}=="1050", ATTRS{idProduct}=="0010|0110|0111|0114|0116|0401|0403|0405|0407|0410"
RUN+="udev-acl --action=$env{ACTION} --device=$env{DEVNAME}"

# New rules - now I can push-pull Yubiko token from USB port
# Just works!
# Sometimes, better never start gpg-agent this way. :-)

#ACTION=="remove", ENV{ID_VENDOR_ID}="1050", ENV{SUBSYSTEM}=="usb", RUN+="/opt/token/yubiko-stop"
#ACTION=="add", ENV{ID_VENDOR_ID}="1050", ENV{SUBSYSTEM}=="usb", RUN+="/bin/su petr -c '/opt/token/yubiko-start'" LABEL="yubico_end"

3. Změna módu Yubikey NEO

Aby se hlásil jako "[Yubico Yubikey NEO OTP+U2F+CCID]", přihlásit se to terminálu/konzole jako root, připojit token a vložit příkaz:

root@HPPC:~# ykpersonalize -m82

Pro uskutečnění změn je potřeba token odpojit z USB portu, odhlásit se z grafického prostředí a znovu se přihlásit. Nebo tuto změnu provést v nejmenovaném OS. Adresa ke stažení: https://www.yubico.com/support/downloads/

 

4. Zkontrolovat, jestli neběží seahorse, gnome-keyring ("GPG Password Agent" a "SSH Key Agent"), zkontrolovat, jestli běží pcscd:

petr@debian-jessie:~$ gpg --card-status

gpg: pcsc_list_readers failed: unknown PC/SC error code (0x8010002e) gpg: čtečka karet není dostupná gpg: OpenPGp karta není dostupná: obecná chyba :-)

4.1 Debian Sqeeze, CentOS 6

gconf-editor -> /apps/gnome-keyring/daemon-components -> zrušit pkcs11, ssh, secrets

4.2 CentOS 7

Pro prostředí Gnome3: gnome-session-properties -> zrušit Agent hesel GPG, Agent klíčů SSH

Pro prostředí Mate: Musí se odstranit spouštění gnome-keyring-daemon. Jako root v terminálu:

mv /usr/bin/gnome-keyring-daemon /usr/bin/gnome-keyring-daemon.orig

touch /usr/bin/gnome-keyring-daemon

chmod +x /usr/bin/gnome-keyring-daemon

Soubor /usr/bin/gnome-keyring-daemon bude obsahovat:

#!/bin/sh

exit 0

4.3 Debian Jessie

petr@mypc:~$ mkdir ~/.config/autostart
petr@mypc:~$ cp /etc/xdg/autostart/gnome-keyring-gpg.desktop ~/.config/autostart/
petr@mypc:~$ echo 'Hidden=true' >> ~/.config/autostart/gnome-keyring-gpg.desktop 
petr@mypc:~$ cp /etc/xdg/autostart/gnome-keyring-ssh.desktop ~/.config/autostart/
petr@mypc:~$ echo 'Hidden=true' >> ~/.config/autostart/gnome-keyring-ssh.deskto

4.4 Odhlásit se z grafického prostředí, vytáhnout token z USB portu, přihlásit, vložit token, a zkusit znovu:

petr@debian-jessie:~$ gpg --card-status

can't connect to `/home/petr/.gnupg/S.gpg-agent': Adresář nebo soubor neexistuje
Výše uvedená hláška nejspíše znamená, že neběží gpg-agent, což v tuto chvíli nevadí.

Application ID ...: K2580501131108092705055281910604
Version ..........: 2.0
Manufacturer .....: unknown
Serial number ....: 15441218
Name of cardholder: Petr Pokorny
Language prefs ...: [není nastaven]
Sex ..............: muž
URL of public key : 
Login data .......: pavel
Signature PIN ....: vyžadováno
Key attributes ...: 2048R 2048R 2048R
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 2
Signature key ....: 0F23 95CD A41F F9BH AD81  3VB7 258J 4518 087J 12II
	  created ....: 2015-10-07 17:00:38
Encryption key....: 123B 2895 22CD ABB7 E221  2A24 18AB B084 7ASC ASD0
	  created ....: 2015-10-07 17:01:26
Authentication key: A3B8 FR5C 51AF 127A 12A6  12H3 D5KN V1A5 NV54 A41A
	  created ....: 2015-10-07 17:02:09
General key info..: [none]

5. --enable-ssh-support, use-agent

Po instalaci balíčku gnupg-agent se vytvoří soubor /etc/X11/Xsession.d/90gpg-agent, který automaticky spustí gpg-agent při přihlášení do grafického prostředí. Bohužel bez volby "--enable-ssh-support".

5.1 --enable-ssh-support

Vytvořit soubor ~/.gnupg/gpg-agent.conf (pokud neexistuje) s řádkem:

enable-ssh-support

5.2 use-agent

Vytvořit soubor ~/.gnupg/gpg.conf (pokud neexistuje) s řádkem:

use-agent

 

6. Vytvořit soubor ~/.bashrc (pokud neexistuje) a přidat níže uvedené řádky

# Smart card K30 and Yubiko Neo - GnuPG -> openssh login  

GPG_TTY=$(tty)
export GPG_TTY

if [ -f "${HOME}/.gpg-agent-info" ]; then
  . "${HOME}/.gpg-agent-info"
  export GPG_AGENT_INFO
  export SSH_AUTH_SOCK
  export SSH_AGENT_PID
fi

alias sshg='gpg-agent --enable-ssh-support --daemon --use-standard-socket ssh'
alias sshh='echo UPDATESTARTUPTTY | gpg-connect-agent; ssh'

 

7. Spuštění gpg-agent

 

7.1 Debian Sqeeze

Tento bod (7.1.x) platí pro Debian Sqeeze.

 

7.1.1 Během práce na mém PC nebudu nikdy token vytahovat.

Pro přihlašování v grafickém prostředí i terminálu (tty x) je nutné použít bod 7.1.2.

Jednou jej zasunu do USB portu a používám pro přihlašování/openssh, elektronickému podepisování dokumentů atd. Pokud token vytáhnu z USB portu, musím se odhlásit z grafického prostředí, znovu přihlásit a zasunout token do USB portu.

Tento bod platí pro grafické prostředí.

Pro přihlašování v terminálu (tty x) je nutné použít bod 7.1.2.

Pokud nefunguje - není vidět v "htop" "gpg-agent --enable-ssh-support ...", upravit soubor /etc/X11/Xsession.d/90gpg-agent, aby vypadal nějak takto:

: ${GNUPGHOME=$HOME/.gnupg}

GPGAGENT=/usr/bin/gpg-agent
PID_FILE="$GNUPGHOME/gpg-agent-info-$(hostname)"

if grep -qs '^:space:*use-agent' "$GNUPGHOME/gpg.conf" "$GNUPGHOME/options" &&
   test -x $GPGAGENT &&
   { test -z "$GPG_AGENT_INFO" || ! $GPGAGENT 2>/dev/null; }; then

   if [ -r "$PID_FILE" ]; then
	   . "$PID_FILE"
   fi

   # Invoking gpg-agent with no arguments exits successfully if the agent
   # is already running as pointed by $GPG_AGENT_INFO
   if ! $GPGAGENT 2>/dev/null; then
   # old
   #STARTUP="$GPGAGENT --daemon --sh --write-env-file=$PID_FILE $STARTUP"   
   # new for openssh support and when I kill gpg-agent, I will not see "defunc" in htop
   STARTUP="$GPGAGENT --daemon --enable-ssh-support --display :0 --sh --write-env-file=$PID_FILE"
   fi
fi

 

7.1.2 Během práce na mém PC budu token často vytahovat nebo se chci přihlašovat i přes terminál (tty x)

Kvůli bezpečnosti - chodím na oběd, záchod, jsem paranoik a každou chvíli čekám URNU. Nechce se mi odhlašovat a znovu přihlašovat do grafického prostředí jen proto, že jsem vytáhnul token (i přesto, že je možné token nastavit/použít pro přihlašování). Aplikace, které vyžadují gpg-agent (jako seahorse) budu spouštět extra skriptem.

V tom případě se nesmí gpg-agent spouštět při přihlašování do grafického prostředí, nýbrž "ručně" nebo přes udev.

Soubor /etc/X11/Xsession.d/90gpg-agent bude vypadat nějak takto:

: ${GNUPGHOME=$HOME/.gnupg}

GPGAGENT=/usr/bin/gpg-agent
PID_FILE="$GNUPGHOME/gpg-agent-info-$(hostname)"

if grep -qs '^:space:*use-agent' "$GNUPGHOME/gpg.conf" "$GNUPGHOME/options" &&
   test -x $GPGAGENT &&
   { test -z "$GPG_AGENT_INFO" || ! $GPGAGENT 2>/dev/null; }; then

   if [ -r "$PID_FILE" ]; then
	   . "$PID_FILE"
   fi

   # Invoking gpg-agent with no arguments exits successfully if the agent
   # is already running as pointed by $GPG_AGENT_INFO
   if ! $GPGAGENT 2>/dev/null; then
   # old
   #STARTUP="$GPGAGENT --daemon --sh --write-env-file=$PID_FILE $STARTUP"   
   # new, why start gpg-agent?
   echo "Hellow world" >/dev/null
   fi
fi

Spouštění gpg-agent přes udev.

Obsah souboru udev je v bodě 2, stačí odkomentovat řádky začínající na #ACTION=="remove" a #ACTION=="add".

Skripty jsou uvedeny níže.

Problém ve skriptu přes udev je v tom, že:

- Při spuštění (strčím token do USB) gpg-agent vyžaduje nastavit proměnnou, na kterém displeji/tty se má spustit pinentry (dialog pro zadání hesla tokenu).

- Při ukončení (vytáhnu token z USB) je někdy potřeba ukončit proces gpg-agent, scdaemon a restartovat pcscd.

Je ovšem možné i tyto skripty spouštět "ručně".

Soubor /opt/token/yubiko-start spouštěný přes udev - viz výše:

#!/bin/bash

#exit 0

killall gpg-agent 2>/dev/null
#killall scdaemon  2>/dev/null

# Varianta 1
# Funguje jen v grafickem prostredi, ne v terminalu (--display :0)
# Prihlasuje se prikazem:
# petr@HPPC:~$ ssh vzdaleny@IP-adresa
exec /usr/bin/gpg-agent --enable-ssh-support --daemon --display :0 --use-standard-socket --sh --write-env-file "${HOME}/.gpg-agent-info"

# Varianta 2
# Funguje v terminalu (tty) i v grafickem prostredi
# Prihlasuje se prikazem: 
# petr@HPPC:~$ sshh vzdaleny@IP-adresa
# do souboru ~/.bashrc pridat radek s alias:
# alias sshh='echo UPDATESTARTUPTTY | gpg-connect-agent; ssh'
# Po pridani radku provest v terminalu: 
# petr@HPPC:~$ source ~/.bashrc
#exec /usr/bin/gpg-agent --enable-ssh-support --daemon --use-standard-socket --sh --write-env-file "${HOME}/.gpg-agent-info"

gpg --card-status

gpg-connect-agent learn /bye
SSH_AUTH_SOCK="/home/petr/.gnupg/S.gpg-agent.ssh"
export SSH_AUTH_SOCK

echo UPDATESTARTUPTTY | gpg-connect-agent 
gpg-connect-agent /bye

Soubor /opt/token/yubiko-stop spouštěný přes udev - viz výše:

#!/bin/bash 

 #exit 0

 killall gpg-agent

 killall scdaemon

 /etc/init.d/pcscd stop

 killall pcscd

 /etc/init.d/pcscd start

 

7.2 Debian Jessie

Tento bod (7.2.x) platí pro Debian Jessie.

GnuPG (gpg-agent) nemá žádný problém s vytáhnutím a opětovném zastrčením tokenu do USB portu.

Pro grafické prostředí není třeba provádět jakékoliv úpravy.

Pro použití v terminálu (tty x) platí bod 7.1.2.

 

7.3 CentOS 6

Tento bod (7.3.x) platí pro CentOS 6 a grafický správce přihlášení KDM (K Display Manager).

 

7.3.1 Během práce na mém PC nebudu nikdy token vytahovat a přihlašuji se z grafického prostředí.

Pro přihlašování v grafickém prostředí i terminálu (tty x) je nutné použít bod 7.3.2.

Jednou jej zasunu do USB portu a používám pro přihlašování/openssh, elektronickému podepisování dokumentů atd. Pokud token vytáhnu z USB portu, musím se odhlásit z grafického prostředí, znovu přihlásit a zasunout token do USB portu.

Pokud nefunguje - není vidět v "htop" "gpg-agent --enable-ssh-support ...", upravit soubor /etc/KDE/env/gpg-agent-startup.sh, aby vypadal nějak takto:

#!/bin/sh


GPG_AGENT=/usr/bin/gpg-agent
## Run gpg-agent only if not already running, and available
if [ -x "${GPG_AGENT}" ] ; then

  # check validity of GPG_SOCKET (in case of session crash)
  GPG_AGENT_INFO_FILE=${HOME}/.gpg-agent-info
  if [ -f "${GPG_AGENT_INFO_FILE}" ]; then
    GPG_AGENT_PID=`cat ${GPG_AGENT_INFO_FILE} | cut -f2 -d:`
    GPG_PID_NAME=`ps -p ${GPG_AGENT_PID} -o comm=`
    if [ ! "x${GPG_PID_NAME}" = "xgpg-agent" ]; then
      rm -f "${GPG_AGENT_INFO_FILE}" 2>&1 >/dev/null
    else
       GPG_SOCKET=`cat "${GPG_AGENT_INFO_FILE}" | cut -f1 -d: | cut -f2 -d=`
       if ! test -S "${GPG_SOCKET}" -a -O "${GPG_SOCKET}" ; then
         rm -f "${GPG_AGENT_INFO_FILE}" 2>&1 >/dev/null
       fi
    fi
    unset GPG_AGENT_PID GPG_SOCKET GPG_PID_NAME
  fi

  if [ -f "${GPG_AGENT_INFO_FILE}" ]; then
    eval "$(cat \"${GPG_AGENT_INFO_FILE}\")"
    eval "$(cut -d= -f 1 < \"${GPG_AGENT_INFO_FILE}\" | xargs echo export)"
    export GPG_TTY=$(tty)
  else
    # old
    #eval "$(${GPG_AGENT} -s --daemon --write-env-file ${GPG_OPTIONS})"
    # new
    eval "$(${GPG_AGENT} -s  --enable-ssh-support --display :0 --daemon --write-env-file ${GPG_OPTIONS})"
  fi

fi

 

7.3.2 Během práce na mém PC budu token často vytahovat nebo se chci přihlašovat i přes terminál (tty x)

V tom případě se nesmí gpg-agent spouštět při přihlašování do grafického prostředí, nýbrž "ručně" nebo přes udev.

Smazat soubor /etc/KDE/env/gpg-agent-startup.sh nebo jej upravit nějak takto:

#!/bin/sh

exit 0

GPG_AGENT=/usr/bin/gpg-agent
## Run gpg-agent only if not already running, and available

## pokracovani zbytku souboru
#############################
#############################

Spouštění gpg-agent přes udev.

Obsah souboru udev je v bodě 2, stačí odkomentovat řádky začínající na #ACTION=="remove" a #ACTION=="add".

Skripty jsou uvedeny níže.

Problém ve skriptu přes udev je v tom, že:

- Při spuštění (strčím token do USB) gpg-agent vyžaduje nastavit proměnnou, na kterém displeji/tty se má spustit pinentry (dialog pro zadání hesla tokenu).

- Při ukončení (vytáhnu token z USB) je někdy potřeba ukončit proces gpg-agent, scdaemon a restartovat pcscd.

Je ovšem možné i tyto skripty spouštět "ručně".

Soubor /opt/token/yubiko-start spouštěný přes udev - viz výše:

#!/bin/bash

#exit 0

killall gpg-agent 2>/dev/null
#killall scdaemon  2>/dev/null

# Varianta 1
# Funguje jen v grafickem prostredi, ne v terminalu (--display :0)
# Prihlasuje se prikazem:
# petr@HPPC:~$ ssh vzdaleny@IP-adresa
exec /usr/bin/gpg-agent --enable-ssh-support --daemon --display :0 --use-standard-socket --sh --write-env-file "${HOME}/.gpg-agent-info"

# Varianta 2
# Funguje v terminalu (tty) i v grafickem prostredi
# Prihlasuje se prikazem: 
# petr@HPPC:~$ sshh vzdaleny@IP-adresa
# do souboru ~/.bashrc pridat radek s alias:
# alias sshh='echo UPDATESTARTUPTTY | gpg-connect-agent; ssh'
# Po pridani radku provest v terminalu: 
# petr@HPPC:~$ source ~/.bashrc
#exec /usr/bin/gpg-agent --enable-ssh-support --daemon --use-standard-socket --sh --write-env-file "${HOME}/.gpg-agent-info"

gpg --card-status

gpg-connect-agent learn /bye
SSH_AUTH_SOCK="/home/petr/.gnupg/S.gpg-agent.ssh"
export SSH_AUTH_SOCK

echo UPDATESTARTUPTTY | gpg-connect-agent 
gpg-connect-agent /bye

Soubor /opt/token/yubiko-stop spouštěný přes udev - viz výše:

#!/bin/bash 

 #exit 0

 killall gpg-agent

 killall scdaemon

 /etc/init.d/pcscd stop

 killall pcscd

 /etc/init.d/pcscd start

 

7.4 CentOS 7

Tento bod (7.4) platí pro CentOS 7.

GnuPG (gpg-agent) nemá žádný problém s vytáhnutím a opětovném zastrčením tokenu do USB portu.

Pro grafické prostředí není třeba provádět jakékoliv úpravy.

Pro použití v terminálu (tty x) platí bod 7.3.2.

 

8. Vygenerovat klíče a přenést je do tokenu

 

9. gpgkey2ssh

Pomocí příkazu gpgkey2ssh muj-gpg-klic >tecka-ssh-authorized_keys-na-vzdalenem-PC převést na open-ssh formát veřejného klíče a ten přenést do authorized_keys do PC, kam se chci přihlašovat.

 

10. Přihlášení na vzdálený počítač

 

10.1 gpg-agent není automaticky spuštěn při přihlášení

Přihlášení je možné v grafickém prostředí i terminálu (tty x).

petr@HP:~$ gpg-agent --enable-ssh-support --daemon --use-standard-socket ssh vzdaleny@IP-adresa

Nebo pomocí alias:

petr@HPPC:~$ sshg vzdaleny@IP-adresa

 

10.2 gpg-agent je automaticky spuštěn při přihlášení do grafického prostředí

Přihlášení je možné pouze v grafickém prostředí.

petr@HPPC:~$ ssh vzdaleny@IP-adresa

 

10.3 gpg-agent je automaticky spuštěn přes udev při vložení tokenu po přihlášení do grafického prostředí

Přihlášení je možné pouze v grafickém prostředí.

Varianta 1  v souboru /opt/token/yubiko-start (bod 7.1.2 nebo 7.3.2, spuštění přes udev).

petr@HPPC:~$ ssh vzdaleny@IP-adresa

 

10.4 gpg-agent je automaticky spuštěn přes udev při vložení tokenu po přihlášení

Přihlášení je možné v grafickém prostředí i terminálu (tty x).

Varianta 2  v souboru /opt/token/yubiko-start (bod 7.1.2 nebo 7.3.2, spuštění přes udev).

petr@HPPC:~$ echo UPDATESTARTUPTTY | gpg-connect-agent; ssh vzdaleny@IP-adresa

Spouštění přes alias v ~/.bashrc:

petr@HPPC:~$ sshh vzdaleny@IP-adresa


Prostě je to brnkačka... :-)

Dokument vytvořil: 00000, 13.10.2015 23:11 | Poslední úprava: 00000, 26.11.2015 10:13 | Historie změn | Zobrazeno: 1401×

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.