Kerberos desde Java - conseguir un perjuicio para el usuario autenticado actualmente
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
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