OpenSSH-Zwei-Faktor-Authentifizierung kombiniert mit Kerberos/öffentlichem Schlüssel

OpenSSH-Zwei-Faktor-Authentifizierung kombiniert mit Kerberos/öffentlichem Schlüssel

Ich versuche, eine Zwei-Faktor-Authentifizierung für OpenSSH zu implementieren. Die Umgebung ist Centos 7 (Kernel: 3.10.0-229.1.2.el7.x86_64) mit OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11. Februar 2013. Wir haben Active Directory (LDAP) + Kerberos bereitgestellt. Die Spezifikation lautet wie folgt:

  • Ein Benutzer mit einem bestehenden, gültigen Kerberos-Ticket muss nur nach dem zweiten Faktor gefragt werden
  • Ein Benutzer ohne bestehendes, gültiges Kerberos-Ticket muss sowohl nach seinem Passwort als auch nach einem zweiten Faktor gefragt werden
  • Lokale Benutzer (kein LDAP-Zugang) sollten sich mit ihren lokalen Passwörtern authentifizieren können
  • Der zweite Faktor darf nicht vor dem ersten angeboten werden
  • Neben Kerberos sollte auch die Public-Key-Authentifizierung als erster Faktor akzeptiert werden, sofern verfügbar
  • Die Funktion sollte auf eine bestimmte Gruppe von Benutzern beschränkt werden können - andere erhalten nur Zugriff mit ihren Passwörtern

Für die Durchführung des Authentifizierungsprozesses des zweiten Faktors gibt es ein PAM-Modul eines Drittanbieters, das nichts über Kerberos weiß. Also habe ich Folgendes getan:

Fügen Sie diese Zeilen in /etc/ssh/sshd_config ein:

# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes

# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes

# Enable public key authentication
PubkeyAuthentication yes

# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes

# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)

Der Auth-Abschnitt der PAM-Konfiguration für sshd (/etc/pam.d/sshd)

auth       [success=ignore default=1] pam_localuser.so
auth       substack     password-auth
auth       [success=1 default=ignore] pam_localuser.so
auth       required     pam_2fa.so [...some arguments...]
auth       include      postlogin

Für die Abfrage und Validierung des zweiten Faktors ist das Modul pam_2fa.so zuständig.

Für Kerberos funktioniert das nun fast alles, was ich erreichen wollte. Bei lokalen Konten führt es jedoch zu zwei aufeinanderfolgenden Passwortabfragen. Das ist hier mein Hauptproblem. Das liegt daran, dass in diesem Fall wie erwartet der Pfad „password,keyboard-interactive:pam“ verwendet wird. (Ich brauche diesen Authentifizierungspfad, damit jemand mit einem Kerberos-Konto, aber ohne gültiges Ticket ein Ticket erhalten kann, indem er das Passwort und dann das OTP eingibt.) Wenn ich den Unterstapel für die Passwortauthentifizierung vollständig aus der PAM-Konfiguration entferne, funktionieren Kerberos-Konten weiterhin und lokale Konten funktionieren weiterhin nicht. Mir scheint, dass die Anweisung „KerberosOrLocalPasswd yes“ ignoriert wird, da auch „UsePAM yes“ vorhanden ist. Allerdings verwendet sshd weiterhin KDC zur Passwortüberprüfung, da es sonst auch für LDAP-Konten nicht funktionieren würde.

Um noch einmal klarzustellen, was ich implementieren möchte, hier der Pseudocode, der die gewünschte Authentifizierungslogik beschreibt:

if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
  return second_factor_auth(user, read_otp())
else:
  if is_local_account(user):
    if local_passwd_auth(user, read_password()):
      return second_factor_auth(user, read_otp())
    else:
      return AUTH_ERR
  else:
    if krb5_auth(principal, read_password()):
      return second_factor_auth(user, read_otp())
    return AUTH_ERR

Mein Szenario ist meiner Meinung nach weder zu komplex noch in irgendeiner Weise zu anspruchsvoll, aber ich konnte trotz tagelanger Recherche und Experimente immer noch keine klare Möglichkeit zur Umsetzung finden. Können Sie mir bitte bei der Lösungsfindung helfen?

Vielen Dank im Voraus!

Antwort1

Ich kenne keine Möglichkeit, mit PAM das zu tun, was Sie wollen, ohne ein neues PAM-Modul zu schreiben. PAM ist relativ komplex und die Art und Weise, wie SSHD mit PAM und Kerberos interagiert, ist meiner Erfahrung nach so, dass es immer einen Grenzfall gibt, der einfach nicht funktioniert.

Was Sie wollen, ist vielleicht möglich, ich weiß nur nicht, wie ich es machen soll. Wenn Sie nur SSH sichern müssen, würde ich vorschlagen,

ForceCommand  /path/to/2fa_executable 

in Ihrer sshd_config. Dadurch könnten Sie die gewünschte Logik implementieren. Der Nachteil besteht darin, dass die 2fa_executable auf setuid gesetzt werden muss, um 2fa-Geheimnisse lesen zu können.

Auf der Duo Security-Website finden Sie ein Beispiel und einen Code. Sie können den Duo-Setuid-Wrapper und den von Ihnen verwendeten 2FA-Code verwenden.

Duo Unix-Konfiguration

Antwort2

  • Bei einem Benutzer mit bestehendem, gültigem Kerberos-Ticket muss lediglich der zweite Faktor abgefragt werden.

Dies kann durch PAM nicht erreicht werden.

Eine erfolgreiche schlüsselbasierte Authentifizierung gegenüber sshd umgeht den authPAM-Stapel. Dies schließt GSSAPI ein, das für die ticketbasierte Kerberos-Authentifizierung erforderlich ist. Es besteht keine andere Wahl, als dies zu tun, da PAM einfach nicht für diese Art der Authentifizierung konzipiert wurde.

Die Einstellung UsePAM yesbewirkt Folgendes:

  • ChallengeResponseAuthenticationund PasswordAuthenticationwird den Stapel von PAM einhängen auth, um das Passwort zu validieren. Jede andere Form der Authentifizierung als diese beiden Methoden wirdnichtBerühren Sie den authStapel.
  • Bei erfolgreicher Authentifizierung accountwird der PAM-Stapel aufgerufen, um zu bestimmen, ob dem authentifizierten Benutzer der Zugriff gestattet ist. (immer)
  • Der sessionPAM-Stapel wird aufgerufen, um Aufgaben zur Sitzungseinrichtung zu verarbeiten.

Zusammenfassung: Es gibt absolut keine Möglichkeit, eine Zwei-Faktor-Authentifizierungsaufforderung im authStapel für jemanden auszulösen, der sich mit einem GSSAPI- oder SSH-Schlüssel authentifiziert hat. Sie können Stapel in Verbindung mit diesen Authentifizierungsmethoden verwenden account, sessionaber weiter geht PAM nicht.

Antwort3

Hier ist eine Erklärung, wie es gehthttps://cern-cert.github.io/pam_2fa/

  • Die Basis: 2-Faktor-Authentifizierung mit pam
  • Ein PAM-Modul, das mehr über SSH-Authentifizierungsmethoden versteht:

    auth [Erfolg=2 ignorieren=ignorieren Standard=sterben] pam_ssh_user_auth.so

  • Aktuelles oder gepatchtes OpenSSH, um dies für Pam verfügbar zu machen

    Authentifizierungsmethoden gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam keyboard-interactive:pam

verwandte Informationen