Wie kann ich die serverweite Cross-Realm-Authentifizierung auf einem OpenSSH-Server mithilfe von Kerberos konfigurieren, ohne Prinzipien für beide Bereiche in der .k5login-Datei hinzufügen zu müssen?
Wie kann ich die serverweite Cross-Realm-Authentifizierung auf einem OpenSSH-Server mithilfe von Kerberos konfigurieren, ohne Prinzipien für beide Bereiche in der .k5login-Datei hinzufügen zu müssen?
Antworten:
Wenn die Kerberos-Bibliothek einen Kontonamen (von SSH bereitgestellt) und einen Principal-Namen erhält, verwendet sie diese krb5_kuserok()
Funktion, um den Zugriff zuzulassen oder zu verweigern.
krb5_kuserok()
Ermöglicht standardmäßig den Zugriff, wenn der Principal-Name in aufgeführt ist ~/.k5userok
. Wenn diese Datei nicht vorhanden ist, wird geprüft, ob die Funktion krb5_aname_to_localname () denselben Kontonamen zurückgibt.
Standardmäßig wird jetzt krb5_aname_to_localname()
der Principal-Name (ohne Realm) zurückgegeben, wenn der Principal genau eine Namenskomponente hat und sein Realm genau mit dem Standard-Realm des Systems übereinstimmt. Andernfalls wird der gesamte Prinzipalname mit Realm zurückgegeben.
Der einfachste Weg, dies zu ändern, besteht darin, zu lehren, krb5_aname_to_localname()
wie ausländische Hauptnamen übersetzt werden . Es gibt verschiedene Methoden:
Wenn Sie eine einfache Eins-zu-Eins-Zuordnung für den gesamten Bereich wünschen, können Sie eine Übersetzungsregel schreiben krb5.conf
, die den Bereich einfach entfernt. (Beachten Sie, dass diese Beispiele für MIT Kerberos gelten; Sie müssen sie für Heimdal etwas anpassen.)
[Reiche] NULLROUTE.EU.ORG = { auth_to_local = REGEL: [1: $ 1 @ $ 0] (. * @ BEISPIEL \ .COM) s /@.*// auth_to_local = RULE: [1: $ 1 @ $ 0] (. * @ ATHENA \ .MIT \ .EDU) s /@.*/@ athena / auth_to_local = DEFAULT }
In diesem Beispiel wird [1:...]
überprüft, ob die "lokale" (linke) Seite genau eine Komponente hat. [1:$1@$0]
konstruiert eine einzelne Zeichenkette aus der 1. Komponente + einem @ + dem Bereichsnamen (im Wesentlichen resultierend aus dem ursprünglichen Hauptnamen); (.*@EXAMPLE\.COM)
vergleicht den erstellten String mit einem regulären Ausdruck, um sicherzustellen, dass er mit einem angegebenen Bereichsnamen endet; s/@.*//
Ersetzt den regulären Ausdruck @.*
(alles nach dem @
Vorzeichen) durch eine leere Zeichenfolge. Das Ergebnis wird als Systemkontoname verwendet.
Die zweite Regel funktioniert genauso, ersetzt jedoch den Realm durch "@athena", was zu Benutzernamen wie "@athena" führt root@athena
. Ich füge es nur als Beispiel hinzu, da der SSSD LDAP / AD-Client diese Syntax verwenden kann und mehrere Bereiche pro Host zulässt.
Die dritte Regel genau das, was ich am Anfang beschrieben habe.
Wenn Sie nur bestimmte Namen zuordnen möchten, können Sie einen auth_to_local_names
Abschnitt hinzufügen . Die Konfiguration würde folgendermaßen aussehen: (Hinweis: Heimdal verwendet auth_to_local
)
[libdefaults] default_realm = NULLROUTE.EU.ORG [Reiche] NULLROUTE.EU.ORG = { auth_to_local_names = { grawity/admin@EXAMPLE.COM = grawity root@ATHENA.MIT.EDU = root } }
Dies übersetzt nur zwei Hauptnamen in ein einziges lokales Konto.
Wenn Sie nach einer automatisierten Methode suchen, verfügen neuere Versionen von MIT Kerberos über eine API für "localauth" -Plugins, die ihre eigenen Implementierungen sowohl für die Berechtigungsprüfung als auch für die Principal / Account-Übersetzung bereitstellen können.
Zum Beispiel hat der SSSD IPA / AD-Client vor kurzem (vor ungefähr einem Monat) damit begonnen, ein eigenes Plug-In für die Übersetzung von Prinzipalnamen von FreeIPA- und Active Directory-Benutzern bereitzustellen.
RULE:[1:$1@$0]
, die mit RFC in Verbindung funktioniert tools.ietf.org/html/rfc6806.html