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 :