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.

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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.