SSH Two-Factor auth (2FA) z yubikey

12

Mam więc tego zręcznego małego yubikey i chcę dodać dodatkową warstwę bezpieczeństwa podczas uwierzytelniania sesji ssh. Po stronie serwera wyłączyłem już uwierzytelnianie hasłem i zezwalam na używanie kluczy ssh tylko podczas logowania.

Problem polega na tym, że po skonfigurowaniu sshd i PAM dla yubikey auth, sshd wciąż wymaga tylko klucza ssh, nigdy nie jestem proszony o udzielenie odpowiedzi od yubikey.

Jak potrzebuję zarówno klucza ssh, jak i yubikey?

(ubuntu 14.04 - trusty)

/etc/pam.d/common-auth:

auth    required    pam_yubico.so mode=client try_first_pass id=<id> key=<secret>
auth    [success=1 default=ignore]  pam_unix.so nullok_secure try_first_pass
# here's the fallback if no module succeeds
auth    requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth    required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth    optional            pam_cap.so
# end of pam-auth-update config

/etc/ssh/sshd_config:

...

PasswordAuthentication no
ChallengeResponseAuthentication yes
UsePAM yes
Ben Lemasurier
źródło
BTW, jeśli nie dostaniesz zadowalającej odpowiedzi w ciągu kilku dni, zadzwoń do mnie, a ja postawię zdrową nagrodę na pytanie. Mam przedstawiciela do nagrania i jestem również zainteresowany tą odpowiedzią. :)
EEAA,

Odpowiedzi:

4

Ok, trzymałem się tego i myślę, że wpadłem na rozsądne rozwiązanie. Najważniejsze, czego wcześniej mi brakowało, to sshd AuthenticationMethods publickey,password. Wymusza to wymóg zarówno klucza publicznego, jak i hasła - „hasło” jest teraz obsługiwane przez PAM->auth-yubi. Potrzebne były również dodatkowe zmiany, patrz poniżej:

(ubuntu 14.04 - zaufany):

/etc/pam.d/yubi-auth

auth    required pam_yubico.so mode=client try_first_pass id=<id> key=<key>

Uwaga: można uzyskać identyfikator dostępu i tajny klucz tutaj

/etc/pam.d/sshd

# Standard Un*x authentication.
#@include common-auth

# Yubikey auth
@include yubi-auth

/ etc / ssh / sshd_config

UsePAM yes
ChallengeResponseAuthentication no
AuthenticationMethods publickey,password
PasswordAuthentication yes

service ssh restart

Weryfikacja

SSH ze zdalnego hosta bez klucza publicznego

root@0a6442bcb21c:/# ssh [email protected]
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is ea:2a:e3:98:35:72:66:b1:e0:65:6b:3f:60:8a:af:ab.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.20' (ECDSA) to the list of known hosts.
Permission denied (publickey).

SSH ze zdalnego hosta z kluczem publicznym

$ ssh [email protected]
Authenticated with partial success.
[email protected]'s password:
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-33-generic x86_64)

Poprawa

Byłoby miło widzieć „Yubikey Auth:” zamiast „password:” ze zdalnego serwera ssh podczas uwierzytelniania.

Co się stanie, gdy serwer ssh nie będzie mógł skontaktować się z systemem weryfikacji autoryzacji yubico? Idealne rozwiązanie byłoby całkowicie samodzielne.

Doceniamy komentarze i sugestie.

Ben Lemasurier
źródło
2

Konfiguracja 2FA z Yubikey może być trudna (myślałam, że jest łatka openssh dla U2F ), ale najłatwiejszym sposobem jest prawdopodobnie ten opisany na oficjalnej stronie Yubico .

Jest to w zasadzie sposób przechowywania klucza prywatnego na Yubikey i ochrony go za pomocą kodu PIN. To nie jest dokładnie 2fa jesteś opisane (ale to jest coś, co ma i co i wiedzieć ), ale zwiększa bezpieczeństwo nawet więcej (YubiKey zamki Po kilku nieudanych próbach).

TL: DR;

OPENSC_LIBS=`locate opensc-pkcs11.so`
yubico-piv-tool -s 9a -a generate -o public.pem
yubico-piv-tool -a verify-pin -P 123456 -a selfsign-certificate -s 9a \
  -S "/CN=SSH key/" -i public.pem -o cert.pem
yubico-piv-tool -a import-certificate -s 9a -i cert.pem
ssh-keygen -D $OPENSC_LIBS/opensc-pkcs11.so -e
ssh -I $OPENSC_LIBS/opensc-pkcs11.so [email protected]
Jakuje
źródło
Wierzę, że moduł pam może uwierzytelniać tylko lokalnych Yubikeys, a nie te przez ssh ” - nie jestem do końca pewien, co masz na myśli. Czy masz na myśli, że Yubikey nie może zostać użyty do uwierzytelnienia na zdalnym serwerze ssh za pośrednictwem PAM?
MadHatter,
Tak. Ponieważ potrzebuje sposobu komunikowania się z yubikey i prawdopodobnie odbywa się to za pomocą lokalnej biblioteki. W ssh nie ma na to kodu.
Jakuje,
To zdecydowanie źle. Skonfigurowałem moje zdalne serwery, aby akceptowały uwierzytelnianie oparte na yubikey zarówno w rodzimym trybie yubikey, jak i w trybie OATH . Całe sedno yubikey polega na zapewnieniu krótkiego (ish) ciągu do przesłania potencjalnie niepewnym kanałem, aby działał jako jednorazowe hasło. Gdyby yubikey musiał być fizycznie podłączony do systemu, do którego się uwierzytelniał, byłoby to znacznie mniej przydatne. Myślę , że również mylisz się co do blokady yubikey w trybie PKCS.
MadHatter,
Ok masz rację. W trybie OTP jest to możliwe. Ale blokowanie jest częścią standardu PKCS11.
Jakuje,
1
Dziękuję za to - uważam, że twoja odpowiedź jest znacznie lepsza dla ulepszeń i usunę moją opinię.
MadHatter,