Versuch, SSH mit öffentlichem Schlüssel (kein Passwort) + Google Authenticator auf Ubuntu 14.04.1 zu bekommen

20

Ich verwende Ubuntu 14.04.1 (mit OpenSSH 6.6 und libpam-google-authenticator 20130529-2).

Ich versuche, SSH-Anmeldungen einzurichten, bei denen sich der öffentliche Schlüssel authentifiziert (ohne Kennwort) und ein Benutzer aufgefordert wird, einen Code vom Google-Authentifikator einzugeben.

Durch das Befolgen / Anpassen dieser Anweisungen erhalte ich eine Aufforderung zur Passworteingabe sowie eine Aufforderung zur Google-Authentifizierung:

Ich habe das Paket installiert, meine /etc/ssh/sshd_configund /etc/pam.d/sshDateien bearbeitet

In /etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

und am unteren Rand von /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")

Ich weiß, dass PAM auftragsabhängig ist, aber sshd_configauch?

Was mache ich falsch? Jede Hilfe wäre dankbar.

JT.
quelle

Antworten:

28

Habe es gut gemacht, habe zuerst gemacht:

apt-get install libpam-google-authenticator

In habe /etc/pam.d/sshdich die folgenden Zeilen (oben) geändert / hinzugefügt:

# @include common-auth
auth required pam_google_authenticator.so

Und in /etc/ssh/sshd_config:

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

Funktioniert gut und ich erhalte jetzt nach der Authentifizierung mit dem öffentlichen Schlüssel die Aufforderung "Bestätigungscode". Ich bin nicht sicher, wie ich die Authentifizierung mit Kennwort + Token ODER Schlüssel + Token zulassen würde, da ich die Kennwortauthentifizierungsmethode jetzt effektiv aus PAM entfernt habe.

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

Linus Kendall
quelle
Der Nachwelt zuliebe habe ich mein Problem erkannt. Ich hatte es auch versucht PasswordAuthentication no, aber das war es nicht. Das Problem ist / war, dass ich / habe ControlMaster autound ControlPathAnweisungen in meiner ~ / .ssh / config-Datei. Ich wollte sicherstellen, dass ich mich nicht aussperre, damit ich immer eine SSH-Sitzung offen lasse. Da mein Computer sie nur wiederverwendete, stieg ich immer ein, ohne dass das System nach einem Token fragte. Ich habe Ihre Antwort als richtig markiert, da jemand, der sie befolgt, tatsächlich ein funktionierendes Setup erhalten würde. Vielen Dank!
JT.
2
Ich bin mit CentOS 7. Ich habe PasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactive, und UsePAM yesin sshd_config. Es überprüft meinen Schlüssel und fragt mich dann nach meinem Google Authenticator-Token und fragt mich dann auch nach meinem Passwort. Ich mache alle drei - kann keinen von ihnen überspringen. Ich habe es auch versucht, AuthenticationMethods publickey,keyboard-interactive:pamwie in der Manpage vorgeschlagen, aber das hat nichts geändert. Irgendwelche Ideen?
Nick Williams
6
@ NickWilliams Ich hatte das gleiche Problem. Was es für mich reparierte, war, dass ich die @include common-authLinie auszeichnen musste, die die Antworten zeigt. pam_google_authenticatorAnfangs dachte ich nur, es wäre ein Kommentar für die Zeile in /etc/pam.d/sshd.
Freitag,
5
Vielen Dank! Meine Lösung war nicht genau dieselbe (ich musste sie auskommentieren auth substack password-auth), aber Ihr Kommentar hat mein Problem gelöst!
Nick Williams
7

Ich war endlich in der Lage, dies zum Laufen zu bringen, indem ich auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullokoben auf platzierte /etc/pam.d/sshd.

Laut der pam.d-Manpage :

  • success=done Wenn sich Google Authenticator abmeldet, wird keine weitere Authentifizierung durchgeführt, was bedeutet, dass keine zusätzliche Passwortabfrage erfolgt.
  • default=die Wenn Google Authenticator den Anmeldeversuch ablehnt, schlägt die Authentifizierung sofort fehl und die Passwortabfrage wird übersprungen.

Es [success=done new_authtok_reqd=done default=die]ist also eine Art Mischung zwischen den Werten sufficientund den requisiteKontrollwerten, da wir Verhalten von beiden wollen: Bei Erfolg sofort beenden (ausreichend) und bei Misserfolg auch sofort beenden (erforderlich).

Beachten Sie, dass das nullokArgument für pam_google_authenticator.so bedeutet, dass die ~/.google_authenticatorAuthentifizierung mit öffentlichem Schlüssel normal fortgesetzt wird, wenn eine Datei für einen Benutzer nicht gefunden wird. Dies ist nützlich, wenn ich nur einen Teil meiner Konten bei 2FA sperren möchte.

bluegate010
quelle
6

Die Antwort von Linus Kendall sollte auf älteren Systemen funktionieren, aber auf neueren Linux-Computern ist sie problematisch. auf meinem arch linux-basierten webserver führt diese konfiguration dazu, dass pam nach erhalt meines ssh-schlüssels nach meinem authentifizierungscode und meinem passwort fragt (dh ich brauche alle 3).

Eine einfachere Lösung, die dieses Problem verhindert und auf jedem System funktionieren sollte, besteht darin, den Eintrag in /etc/pam.d/sshdzu ändern :

auth sufficient pam_google_authenticator.so

Und um dann die gleichen Änderungen an `` / etc / ssh / sshd` vorzunehmen, die Linus erwähnt hat:

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

Das sollte Sie nach Ihrem Authentifizierungstoken fragen, nachdem der Server Ihren öffentlichen Schlüssel akzeptiert hat. Es sollte nicht nach Ihrem Passwort fragen.

Nebenbei bemerkt, wenn Sie ein SFTP-Benutzerkonto haben möchten, müssen Sie wahrscheinlich den Google-Authentifikator umgehen, damit es funktioniert. Hier ist ein Vorschlag, wie dies mit einem SFTP-Jail sicher gemacht werden kann. In etc/ssh/sshd_config:

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

Sie müssen die Berechtigungen für / path / to / ftp / dir root Schreib nur (zB machen chown root:root /path/to/ftp/dir, chmod 755 /path/to/ftp/dir. Alle Eltern über das Verzeichnis auch sichere Berechtigungen benötigen. So wie ich dies in der Regel tun , ist durch die chroot - Verzeichnis zu machen /home/shared/user, eine Erstellung Verzeichnis dort hinein (zB 'Daten') und dann das Verzeichnis einhängen, das ich teilen möchte, wie folgt:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

Wenn Sie alle diese Schritte ausführen, verfügen Sie über einen öffentlichen Schlüssel + eine Google-Authentifizierung für Ihre SSH-Benutzer sowie ein funktionsfähiges passwortgeschütztes SFTP-Konto für die Datenübertragung.

Mike Dacre
quelle
Das funktioniert super. Und da ich es aus irgendeinem Grund nicht mag, common-auth zu kommentieren, war dies idealer als die Lösung von Linus.
Luke Sapan
Vielen Dank! Ich habe eine Nacht mit dem Debuggen von ssh verbracht und mich gefragt, warum ich nach pubkey + authcode noch ein Passwort eingeben muss ...
felix021