Download Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat Elementos
Document related concepts
no text concepts found
Transcript
Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat Elementos necesarios : -‐ Servidor Apache + php -‐ Carpeta apache-‐tomcat-‐6.0.35 (no necesariamente esta versión) 1 : Descargar e instalar Apache Tomcat En primer lugar , nos dirigimos a la pagina oficial del proyecto Apache Tomcat (tomcat.apache.org) y nos descargamos una versión (en nuestro caso hemos escogido la versión 6) . Una vez descargada , la descomprimimos , y copiamos el directorio completo a /opt. Para hacerlo funcionar , nos dirigimos a /opt/apache-‐tomcat-‐6.0.35/bin , y una vez dentro de este directorio , editamos el archivo catalina.sh , dentro de este archivo introducimos al principio la siguiente línea : JRE_HOME="/usr" Ahora , en el mismo directorio donde estábamos situados , (/opt/apache-‐tomcat-‐ 6.0.35/bin) , introducimos el siguiente comando para iniciar el servidor apache tomcat : ./startup.sh De modo que la consola de comandos nos debería mostrar el siguiente resultado : Una vez efectuados estos pasos , ya podemos abrir el navegador i introducir la url : http://localhost:8080 , si todos los pasos anteriores se han ejecutado correctamente , se nos debería mostrar la siguiente pantalla en el navegador : Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat 2 -‐ Configuraciones JAAS Para poder llevar la autenticación y autorización de JAAS al servidor Apache Tomcat , necesitamos introducir el concepto de rol (que en JAAS técnicamente no existe) . En conclusión , necesitaremos un LoginModule para implementar la autenticación , y un Principal que llevara a cabo la identidad el usuario , y un segundo Principal que llevara a cabo la identidad del grupo o rol. Estos 3 ficheros .java serán los siguientes : PlainLoginModule.java Como se aprecia en el siguiente código , la autenticación falla cuando el usuario introduce un usuario distinto de la contraseña , variando este concepto , podemos introducir la lectura de un fichero de contraseñas y establecer nuevos condicionantes para la autenticación import import import import import import import import import import java.io.IOException; java.util.Map; javax.security.auth.Subject; javax.security.auth.callback.Callback; javax.security.auth.callback.CallbackHandler; javax.security.auth.callback.NameCallback; javax.security.auth.callback.PasswordCallback; javax.security.auth.callback.UnsupportedCallbackException; javax.security.auth.login.LoginException; javax.security.auth.spi.LoginModule; public class PlainLoginModule implements LoginModule { /** Callback handler to store between initialization and authentication. */ private CallbackHandler handler; /** Subject to store. */ private Subject subject; /** Login name. */ private String login; /** * This implementation always return false. * * @see javax.security.auth.spi.LoginModule#abort() */ @Override public boolean abort() throws LoginException { return false; } /** * This is where, should the entire authentication process succeeds, * principal would be set. * Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat * @see javax.security.auth.spi.LoginModule#commit() */ @Override public boolean commit() throws LoginException { try { PlainUserPrincipal user = new PlainUserPrincipal(login); PlainRolePrincipal role = new PlainRolePrincipal("tomcat"); subject.getPrincipals().add(user); subject.getPrincipals().add(role); return true; } catch (Exception e) { throw new LoginException(e.getMessage()); } } /** * This implementation ignores both state and options. * * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Sub ject, * javax.security.auth.callback.CallbackHandler, java.util.Map, * java.util.Map) */ @Override public void initialize(Subject aSubject, CallbackHandler aCallbackHandler, Map aSharedState, Map aOptions) { handler = aCallbackHandler; subject = aSubject; } /** * This method checks whether the name and the password are the same. * * @see javax.security.auth.spi.LoginModule#login() */ @Override public boolean login() throws LoginException { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("login"); callbacks[1] = new PasswordCallback("password", true); try { handler.handle(callbacks); String name = ((NameCallback) callbacks[0]).getName(); String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword()); Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat if (!name.equals(password)) { throw new LoginException("Authentication failed"); } login = name; return true; } catch (IOException e) { throw new LoginException(e.getMessage()); } catch (UnsupportedCallbackException e) { throw new LoginException(e.getMessage()); } } /** * Clears subject from principal and credentials. * * @see javax.security.auth.spi.LoginModule#logout() */ @Override public boolean logout() throws LoginException { try { PlainUserPrincipal user = new PlainUserPrincipal(login); PlainRolePrincipal role = new PlainRolePrincipal("tomcat"); subject.getPrincipals().remove(user); subject.getPrincipals().remove(role); return true; } catch (Exception e) { throw new LoginException(e.getMessage()); } } } PlainRolePrincipal.java import java.security.Principal; public class PlainRolePrincipal implements Principal { String roleName; public PlainRolePrincipal(String name) { roleName = name; } public String getName() { Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat return roleName; } public String toString() { return ("RolePrincipal: " + roleName); } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof PlainRolePrincipal) { PlainRolePrincipal other = (PlainRolePrincipal) obj; return roleName.equals(other.roleName); } return false; } } public int hashCode() { return roleName.hashCode(); } PlainUserPrincipal.java import java.security.Principal; public class PlainUserPrincipal implements Principal { String UserName; public PlainUserPrincipal(String name) { UserName = name; } public String getName() { return UserName; } public String toString() { return ("UserPrincipal: " + UserName); } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj instanceof PlainUserPrincipal) { PlainUserPrincipal other = (PlainUserPrincipal) obj; return UserName.equals(other.UserName); } return false; } } public int hashCode() { return UserName.hashCode(); } Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat Una vez tengamos los 3 ficheros .java , los compilamos mediante el comando : javac PlainLoginModule.java PlainRolePrincipal.java PlainUserPrincipal.java Una vez compilados , introducimos todos los archivos compilados en el directorio : /opt/apache-‐tomcat-‐6.0.35/lib Ahora es el momento de crear nuestro fichero de configuración , este será llamado jaas.config , y su contenido será el siguiente : prova{ PlainLoginModule required debug=true; }; En este caso hemos introducido prova , pero podemos introducir el nombre que queramos , en los siguientes pasos donde configuraremos el propio servidor , deberemos tener en cuenta el nombre que hemos introducido aquí. Una vez tengamos el fichero jaas.config creado , tenemos que introducirlo en el directorio : /opt/apache-‐tomcat-‐6.0.35/conf 3 -‐ Configurando el servidor Apache Tomcat Lo primero que tenemos que hacer es decirle al servidor apache tomcat , donde se encuentra nuestro archivo de configuración jaas.config , para ello nos dirigimos al directorio : /opt/apache-‐tomcat-‐6.0.35/bin , y creamos dentro de este directorio un archivo llamado setenv.sh , donde introducimos el siguiente contenido : export CATALINA_OPTS=-‐Djava.security.auth.login.config=$CATALINA_HOME/conf/jaas.config De esta manera le estamos diciendo donde tiene que buscar el fichero jaas.config , hay que tener en cuenta que cada vez que iniciemos el servidor apache tomcat mediante ./startup.sh , también tendremos que ejecutar ./setenv.sh para iniciar la variable de entorno que ejecuta el jaas.config Ahora es el momento de configurar las opciones de seguridad y roles utilizados para Apache Tomcat , para ello tenemos que modificar el fichero web.xml e introducir el siguiente código después de la etiqueta que abre la web-‐app : <security-constraint> <display-name>Example security constraint</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <url-pattern>/jsp/security/protected/*</url-pattern> <http-method>DELETE</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method></http-method> </web-resource-collection> <auth-constraint> Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat <role-name>tomcat</role-name> <role-name>role1</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>exemple</realm-name> <form-login-config> <form-login-page>/jsp/security/protected/login.jsp</formlogin-page> <form-error-page>/jsp/security/protected/error.jsp</formerror-page> </form-login-config> </login-config> <security-role> <role-name>role1</role-name> </security-role> <security-role> <role-name>tomcat</role-name> </security-role> La etiqueta URL-‐Pattern , nos indica la parte que queremos proteger , mediante el form-‐login-‐config podemos introducir la pagina de login así como la pagina de error , en security-‐roles podemos establecer los roles existentes. Ahora nos toca crear nuestro JAASRealm , para ello debemos modificar el fichero server.xml y modificar la parte de código que indica el Realm por defecto (Memory Realm ) e introducirle nuestro JAASRealm que será el siguiente : <Realm className="org.apache.catalina.realm.JAASRealm" appName="prova" userClassNames="PlainUserPrincipal" roleClassNames="PlainRolePrincipal" /> Nota : El nombre de appName debe coincidir con el nombre que hemos dado en el fichero jaas.config Por ultimo , debemos modificar el fichero tomcat-‐users.xml que se encuentra en la carpeta conf , para establecer los usuarios y sus roles (esto es efectivo en Realms de tipo Memory Realm , en el JAAS realm seria conveniente añadir un fichero de roles , usuarios y contraseñas que sea leído desde el LoginModule). 4 -‐ Ejecutando nuestra aplicación Una vez ejecutados todos los pasos anteriores , es el momento de encender el Apache tomcat , mediante el comando startup.sh y setenv.sh que debemos ejecutar en la ruta /opt/apache-‐tomcat-‐6.0.35/bin Abrimos nuestro navegador y nos dirigimos a la siguiente url : http://localhost:8080/examples/jsp/security/protected Mario Hernando Martín -‐ Guia JAAS + Apache Tomcat Nos aparecerá un formulario de login , en el podemos introducir el usuario y la contraseña , si este esta bien autenticado podremos comprobar sus roles (hay que tener en cuenta las configuraciones anteriormente introducidas y el formato del LoginModule para entender el funcionamiento de la aplicación) Pagina de login: Resultado del login iniciándonos como tomcat/tomcat :