kerberos von Java - immer ein Thema für die aktuell authentifizierten Benutzer
Frage
Wir haben eine Kerberos-Domäne in meiner Firma und ich bin ein paar der Java / Kerberos Beispiele . Die Frage, die ich habe, ist um den Login-Mechanismus aus der Perspektive des Servers. Wenn der Server Beispiel GssServer.java
läuft, ich brauche eine javax.security.auth.Subject
zu bekommen; in dem mitgelieferten Code ist dies über eine LoginContext
so:
// Create a LoginContext with a callback handler and login
LoginContext context = new LoginContext(name, new TextCallbackHandler());
context.login();
Subject subject = context.getSubject();
Das ist alles in Ordnung, und wenn ich das Beispiel laufen sehe ich ein schönes Login-Prompt. Aber mein Problem ist, dass diese nicht wirklich, wie mein Server läuft und auch nicht, wie ich habe geführt worden zu verstehen, wie ich Dienste präsentiert von innen einer Kerberos-Domäne werden soll. Im GssServer
Beispiel ist das Problem, mein Server (sprich: Service) sollte nicht braucht, sich zu authentifizieren auf die KDC
um den Service für Kunden zu präsentieren. Der Zugriff auf die serverseitige keytab
Datei sollte ausreichend sein, dies zu tun. So zum Beispiel config:
//jaas-krb5.conf
server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/home/myusr/my-server.keytab"
principal="myserv/mymachine.some.domain";
};
Und in dem Java-Code:
GSSManager manager = GSSManager.getInstance();
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
GSSName gssName = manager.createName("myserv/mymachine.some.domain@THE.REALM.COM",
GSSName.NT_HOSTBASED_SERVICE);
GSSCredential serverCreds = manager.createCredential(gssName,
GSSCredential.DEFAULT_LIFETIME,
krb5Mechanism,
GSSCredential.ACCEPT_ONLY);
Das Problem dabei ist, dass die server
Informationen in der jaas-krb5.conf
Datei nicht verfügbar ist es sei denn, ich mich authentifizieren über die Leitung:
Jaas.loginAndAction("server", action);
Ich soll nicht durch diese Authentifizierung gehen! Aber wenn ich mich nicht authentifizieren, ich am Ende mit:
Exception in thread "main" GSSException: No valid credentials provided (Mechanism level: Attempt to obtain new ACCEPT credentials failed!)
at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:188)
at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:73)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:77)
at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:149)
at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:389)
at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:45)
at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:102)
at gsa.hk.GssServer$GssServerAction.run(GssServer.java:79)
at gsa.hk.GssServer.main(GssServer.java:57)
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.sun.security.jgss.accept
at javax.security.auth.login.LoginContext.init(LoginContext.java:256)
at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
at sun.security.jgss.LoginUtility.login(LoginUtility.java:72)
at sun.security.jgss.krb5.Krb5Util.getKeysFromSubject(Krb5Util.java:205)
at sun.security.jgss.krb5.Krb5AcceptCredential$1.run(Krb5AcceptCredential.java:184)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:181)
... 8 more
Es ist nicht verwunderlich, dass es ein Problem gibt. Immerhin, es sei denn ich einen Griff auf dem server
Thema haben, wie kann ich wissen, wo mein keytab
ist, oder welchen Dienst ich sende?
Also meine Frage ist: Wie kann ich sagen, das GSS API
über die keytab / Leistung ohne mich Authentifizierung im Code
Lösung
OK. So dies erweist sich als extrem einfach vorausgesetzt, Sie wissen, dass die keytab
Datei statt Authentifizierung verwendet werden kann. Das ist ein bisschen in der JavaDoc für Krb5LoginModule
Grundsätzlich, wenn ich
loginAndAction("anything", action)
Dann sollten meine Config wie folgt aussehen:
//jaas-krb5.conf
anything {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
doNotPrompt=true
keyTab="/home/myusr/my-server.keytab"
principal="myserv/mymachine.some.domain";
};
Das wichtige Bit ist die Zugabe von doNotPrompt=true
. Wenn diese Eigenschaft gesetzt ist, verwendet der Server-Code die Informationen in der keytab