Erstellen von Keytabs und Dienstprinzipalnamen

7

Ich versuche, eine Keytab für einen Java-Server einzurichten, um die Kerberos-Authentifizierung in einem Windows-Netzwerk zu unterstützen. Ich habe Mühe, es auch auf der Ebene der Befehlszeilentools zum Laufen zu bringen, bin noch nicht einmal so weit wie das Server-Setup! Mein Plan ist gerade, es auf meinem Entwicklungs-PC zum Laufen zu bringen, da ich Entwicklungsarbeit und Debugging zu erledigen habe. Mein Ziel ist es also, dass der Java-Server auf meinem PC ausgeführt wird und der Client auf demselben Computer ausgeführt wird, der eine Verbindung zu ihm herstellt.

Folgendes habe ich bisher getan: Ich mache mir wirklich einen Fehler, damit ich alle möglichen falschen Sachen machen kann!

Erstellt einen Dienstprinzipalnamen

Ich habe einen unserer Domänenadministratoren beauftragt, diesen Befehl auszuführen:

setspn -A TEST/pc-name.mydomain.com my-user-name

Dies schien erfolgreich zu sein und ich kann diesen SPN erfolgreich auflisten

setspn -L my-user-name

Erstellt eine Keytab-Datei

Ich habe mit diesem Befehl eine Keytab erstellt:

ktpass /princ TEST/[email protected] /pass <my-password> /ptype KRB5_NT_SRV_HST /out <keytab-filename>

Dies scheint eine Keytab erfolgreich zu erstellen, obwohl es warnt, dass Ptyp und Kontotyp nicht übereinstimmen (aber was auch immer ich für Ptyp wähle, ich bekomme die gleiche Warnung). Wenn ich diesen Befehl ausführe:

klist -k file:/<keytab-filename>

Dann listet es den SPN auf, den ich erwarten würde, nämlich TEST/[email protected]

Das Problem!

Jetzt möchte ich überprüfen, ob das Keytab für diesen SPN funktioniert, also laufe ich

kinit -t <keytab-filename> TEST/[email protected]

Ich erhalte dann die Fehlermeldung "krb_error 6 Client nicht in Kerberos-Datenbank gefunden".

Was mache ich falsch?

user21693
quelle

Antworten:

4

Ich bin mir nicht ganz sicher, ob sich mein Benutzername auf ein Computerobjekt oder ein Benutzerobjekt in Active Directory bezieht. Ich gehe davon aus, dass es sich um ein Benutzerobjekt handelt. In diesem Fall halte ich setspn für nicht angemessen. Dies soll die SPNs vorhandener Computerkonten ändern. Für ein Benutzerkonto bin ich skeptisch, dass SRV_HST richtig ist.

Anscheinend ist die Unterstützung für SPNs, die Benutzerobjekten zugeordnet sind, etwas eingeschränkt. Ich habe irgendwo gelesen, dass dies wirklich auf einen Benutzer beschränkt ist. Ich konnte es auch nicht schaffen, dass Ihr ktpass-Aufruf für mich funktioniert, da er darauf bestand, a) ein Benutzerkonto (über Mapuser) anzugeben, das dem SPN zugeordnet werden soll, und b) das SPN-Kennwort festzulegen. Ich denke, letzteres ist unvermeidlich, um ein Keytab über ktpass zu erstellen.

Ich habe es geschafft, ein Keytab auf "Standard" zu erstellen, dh indem ich ein dediziertes Benutzerkonto eingerichtet und es einem SPN zugeordnet habe:

ktpass /princ TEST/host@DOMAIN /mapuser user@DOMAIN /pass *  /out foo.keytab /ptype KRB5_NT_PRINCIPAL

Diese Operation hat (erwartungsgemäß) die Anmeldung für den Benutzer unterbrochen, aber ich konnte mich dann damit abfinden

 kinit -k -t /tmp/foo.keytab  TEST/host@DOMAIN
Martin v. Löwis
quelle
Danke für die Antwort. Also ja, in meiner ursprünglichen Frage war mein Benutzername ein Benutzerobjekt. Abgesehen davon bin ich jetzt allerdings verwirrt: Wollen Sie damit sagen, dass Sie setspn überhaupt nicht verwenden? Nachdem ich den Thread durch alles verfolgt hatte, was ich versucht habe, brauchte ich einen SPN, damit der Client-Code Kerberos für NegotiateStream verwenden konnte. Wie erhalte ich den SPN in Ihrem Szenario? Erstellt ktpass den SPN?
user21693
Wir haben versucht, setspn-A TEST / host @ DOMAIN host, das und der ktpass-Aufruf haben funktioniert, aber kinit sagt nicht "Identifier stimmt nicht mit dem erwarteten Wert überein".
user21693
Sie benötigen ein Active Directory-Konto, dem ein Dienstname zugeordnet ist. Es gibt zwei Möglichkeiten, dies zu erreichen: Setzen Sie entweder den userPrincipalName auf den SPN; Dies ist, was ktpass tut (IIUC), andernfalls wird AD auch den servicePrincipalName untersuchen. Ich ging davon aus, dass ktpass das Passwort immer ändern wird. es scheint, dass es nicht so ist, wie Sie es benutzt haben. Können Sie MIT-Kinit ausprobieren (ich nehme an, Sie verwenden Java-Kinit)?
Martin v. Löwis
Ich habe auch das gleiche Problem in Windows Server 2008, sogar MIT Kinit zeigt den gleichen Fehler "Client nicht gefunden"
Kumar
Ich benutze dies, um das Keytab zu überprüfen: java com.ibm.security.krb5.internal.tools.Klist -f -e -a -k FILE:D:\IBM\IBMSSO\SvcP8SSOAPP-FNTD101.keytab (mit IBM JAVA)
Tilo