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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top