Próba uzyskania SSH z kluczem publicznym (bez hasła) + Google Authenticator działający na Ubuntu 14.04.1

20

Używam Ubuntu 14.04.1 (z OpenSSH 6.6 i libpam-google -hentator 20130529-2).

Próbuję skonfigurować logowanie SSH, w którym klucz publiczny uwierzytelnia się (bez hasła), a użytkownik jest monitowany o kod z Google Authenticator.

Po wykonaniu / dostosowaniu tych instrukcji otrzymałem monit o podanie hasła oraz monit o autoryzację Google:

Zainstalowałem pakiet, edytowałem moje /etc/ssh/sshd_configi /etc/pam.d/sshpliki

W /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

i na dole /etc/pam.d/ssh:

auth required pam_google_authenticator.so nullok # (I want to give everyone a chance to set up their 2FA before removing "nullok")

Wiem, że PAM zależy od zamówienia, ale czy jest sshd_configrównież?

Co ja robię źle? Każda pomoc będzie mile widziana.

JT.
źródło

Odpowiedzi:

28

Aby działał dobrze, najpierw:

apt-get install libpam-google-authenticator

W /etc/pam.d/sshdZmieniłem / dodałem następujące linie (u góry):

# @include common-auth
auth required pam_google_authenticator.so

I w /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

Działa dobrze i po uwierzytelnieniu za pomocą klucza publicznego pojawia się komunikat „Kod weryfikacyjny”. Nie jestem pewien, jak zezwoliłbym na uwierzytelnianie za pomocą hasła + tokena LUB klucza + tokena, ponieważ teraz skutecznie usunąłem metodę uwierzytelniania hasła z PAM.

Korzystanie z Ubuntu 14.04.1 LTS (GNU / Linux 3.8.0-19-generic x86_64) z ssh -v: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 stycznia 2014

Linus Kendall
źródło
Tak więc, dla potomności, zdałem sobie sprawę z mojego problemu. Próbowałem też PasswordAuthentication no, ale to nie było to. Problem polega na tym, że miałem / miałem ControlMaster autoi ControlPathdyrektyw w moim pliku ~ / .ssh / config. Chciałem się upewnić, że się nie zamykam, więc zawsze zostawiam otwartą sesję SSH. Ponieważ mój komputer po prostu ich używałby ponownie, zawsze wchodziłem bez systemu proszącego o token. Oznacziłem twoją odpowiedź jako poprawną, ponieważ ktoś podążający za nią rzeczywiście otrzymałby działającą konfigurację. Dzięki!
JT.
2
Używam CentOS 7. Mam PasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactive, i UsePAM yesw sshd_config. Sprawdza mój klucz, a następnie prosi mnie o token Google Authenticator, a następnie prosi mnie o hasło. Sprawia, że ​​robię wszystkie trzy - nie mogę pominąć żadnego z nich. Próbowałem też, AuthenticationMethods publickey,keyboard-interactive:pamjak sugeruje strona podręcznika, ale to nic nie zmieniło. Jakieś pomysły?
Nick Williams
6
@NickWilliams Miałem ten sam problem. To, co mnie naprawiło, to to, że muszę pochwalić @include common-authwiersz, który pokazują odpowiedzi. Na początku myślałem, że to komentarz do pam_google_authenticatorlinii w /etc/pam.d/sshd.
freb
5
Dziękuję Ci! Moje rozwiązanie nie było dokładnie takie samo (musiałem skomentować auth substack password-auth), ale twój komentarz rozwiązał mój problem!
Nick Williams
7

W końcu udało mi się to uruchomić, umieszczając auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullokna górze /etc/pam.d/sshd.

Według strony man pam.d :

  • success=done oznacza, że ​​jeśli Google Authenticator się wyloguje, nie będzie przeprowadzane żadne uwierzytelnianie, co oznacza brak dodatkowego hasła.
  • default=die oznacza, że ​​jeśli Google Authenticator odrzuci próbę logowania, uwierzytelnianie natychmiast się nie powiedzie, pomijając monit o podanie hasła.

Więc [success=done new_authtok_reqd=done default=die]to rodzaj mieszanki pomiędzy sufficienti requisitekontrolnych wartości, ponieważ chcemy zachowanie zarówno: jeśli sukcesem zakończyć natychmiast (wystarczy), a jeśli awarii, również rozwiązać natychmiast (wymagane).

Zauważ, że nullokargument pam_google_authenticator.so oznacza, że ​​jeśli ~/.google_authenticatorplik nie zostanie znaleziony dla użytkownika, uwierzytelnianie za pomocą klucza publicznego przebiega normalnie. Jest to przydatne, jeśli chcę zablokować tylko część moich kont za pomocą 2FA.

bluegate010
źródło
6

Odpowiedź Linusa Kendalla powinna działać na starszych systemach, ale na nowszych komputerach z Linuksem jest problematyczna; na moim serwerze opartym na arch. linuksie konfiguracja ta powoduje, że po otrzymaniu mojego klucza ssh pytam o kod uwierzytelniający i hasło (tzn. potrzebuję wszystkich 3).

Prostszym rozwiązaniem, które zapobiega temu problemowi i które powinno działać w każdym systemie, jest zmiana wpisu /etc/pam.d/sshdna:

auth sufficient pam_google_authenticator.so

Następnie dokonaj tych samych zmian w `` / etc / ssh / sshd`, o których wspomniał Linus:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

To powinno poprosić cię o token uwierzytelniający po tym, jak serwer zaakceptuje twój klucz publiczny. Nie powinien prosić o hasło.

Na marginesie, jeśli chcesz mieć konto użytkownika sftp, prawdopodobnie będziesz musiał ominąć uwierzytelniacz google, aby go uruchomić. Oto sugestia, jak to zrobić bezpiecznie za pomocą więzienia sftp. W etc/ssh/sshd_config:

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp

Trzeba będzie zrobić uprawnienia na / ścieżka / do / ftp / dir zapisu korzeń tylko (np chown root:root /path/to/ftp/dir, chmod 755 /path/to/ftp/dir. Każdy z rodziców powyżej tego katalogu również potrzebują bezpiecznych uprawnień. The way I zazwyczaj to zrobić to poprzez katalog chroot /home/shared/user, tworząc katalog tam (np. „dane”), a następnie podłączenie dowolnego katalogu, który chcę udostępnić w ten sposób:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

Jeśli wykonasz wszystkie te kroki, będziesz mieć klucz publiczny + login uwierzytelniający google dla użytkowników ssh oraz funkcjonalne chronione hasłem konto sftp do przesyłania danych.

Mike Dacre
źródło
To działa świetnie. A ponieważ z jakiegoś powodu po prostu nie czuję się swobodnie komentując autorów, było to bardziej idealne niż rozwiązanie Linusa.
Luke Sapan
Wielkie dzięki! zmarnowałem noc na debugowanie ssh, zastanawiając się, dlaczego wciąż muszę pisać hasło po pubkey + authcode ……
felix021