Kerberos desde Java - conseguir un perjuicio para el usuario autenticado actualmente

StackOverflow https://stackoverflow.com/questions/979910

  •  13-09-2019
  •  | 
  •  

Pregunta

Tenemos un dominio Kerberos en mi empresa y me estoy quedando algunos de los Java / Kerberos ejemplos . La pregunta que tengo es todo el mecanismo de inicio de sesión desde la perspectiva del servidor. Cuando se ejecuta el ejemplo del servidor GssServer.java, necesito conseguir un javax.security.auth.Subject; en el código suministrado esto es a través de un LoginContext así:

// Create a LoginContext with a callback handler and login
LoginContext context = new LoginContext(name, new TextCallbackHandler());
context.login();

Subject subject = context.getSubject();

Esto es todo bien y cuando corro el ejemplo veo un aviso de la conexión preciosa. Sin embargo, mi problema es que esto es no realmente cómo mi servidor se ejecutará y ni cómo me han llevado a entender la forma en que debería estar presentando los servicios dentro de un dominio Kerberos. En el ejemplo GssServer, el problema es mi servidor (es decir: el servicio) debe no es necesario que se autentifique a la KDC con el fin de presentar su servicio a los clientes. El acceso al archivo keytab del lado del servidor debe ser suficiente para hacer esto. Así que para el ejemplo de configuración:

//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";
};

Y en el código Java:

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);

El problema con esto es que la información en el archivo server jaas-krb5.conf no está disponible a menos que autentico mí mismo a través de la línea:

Jaas.loginAndAction("server", action);     

No debería tener que pasar por esta autentificación! Pero si no se autentican a mí mismo, termino con:

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

No es de extrañar que hay un problema. Después de todo, a menos que tenga una manija en el tema server, ¿cómo puedo saber dónde está mi keytab es, o qué servicios les proporciono?

Así que mi pregunta es:? ¿Cómo puedo saber el GSS API acerca de la tabla de claves / servicio sin autenticar a mí mismo en el código

¿Fue útil?

Solución

OK. Así que esto resulta ser extremadamente fácil suponiendo que conoce que el archivo keytab se puede utilizar en lugar de la autenticación. Esto se describe un poco en el Javadoc para Krb5LoginModule

Básicamente, si

loginAndAction("anything", action)

Entonces mi configuración debe ser similar a:

//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";
};

El bit importante es la adición de doNotPrompt=true . Cuando se establece esta propiedad, el código de servidor utiliza la información de la tabla de claves

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top