Seguridad en Apache Tomcat

Seguridad en aplicaciones web con Apache Tomcat

Apache Tomcat permite añadir seguridad a un proyecto mediante la denominada seguridad basada en contenedores (Container Managed Security). Debido a la coincidencia de sus siglas (CMS) es preciso mencionar que este tipo de seguridad no guarda ninguna relación con los conocidos Content Management System (Sistemas de gestión de contenido) también llamados popularmente gestores de contenido (Wordpress, Blogger, Joomla, etc...).

Esta seguridad permite la configuración de usuarios, contraseñas y roles en una base de datos, definida en el archivo web.xml. Esta configuración de seguridad se basa en dos etiquetas:  La primera (security-constraint), que permite proteger un conjunto de directorios y su contenido, y la segunda (login-config), que permite asignar el tipo de autenticación de los usuarios. Este tipo de autenticación se clasifica generalmente en dos modelos: La configuración con BASIC, que dispone de un formulario predefinido por el navegador y la configuración con FORM que requiere de un formulario diseñado previamente por el desarrollador.

La base de datos, denominada Realm, permite identificar el acceso que dispone un usuario en una aplicación o un conjunto de aplicaciones web.

Existen 6 tipos de Realm, de los que destacan 2 por ser los más utilizados.

UserDatabaseRealm: La base de datos y los distintos roles se encuentran en un archivo xml (conf/tomcat-users.xml). Es recomendable para aplicaciones web con una cantidad pequeña de usuarios.

JDBCRealm: Los usuarios y roles se almacenan en una base de datos relacional. El acceso a la base de datos se puede realizar mediante JDBC y es recomendable para aplicaciones web con una gran cantidad de usuarios.

USERDATABASEREALM

La configuración de un Realm de tipo UserDatabase se realiza mediante archivos de tipo XML. La creación de roles y usuarios se realizan en el archivo ya incluido, con el nombre de tomcat-users.xml y que se encuentra en la carpeta conf del directorio de Apache Tomcat.  Mediante las etiquetas role y user se pueden crear los distintos roles y a continuación asignarlos a un usuario.

  1. <role rolename="role1"/>
  2. <role rolename="role2"/>
  3. <user username="user1" password="pass1" roles="role1"/>
  4. <user username="user2" password="pass2" roles="role1,role2"/>

A continuación se realiza la restricción de las rutas asociando los roles ya definidos mediante el archivo web.xml

  1. <security-constraint>
  2. <display-name>Ruta protegida</display-name>
  3. <web-resource-collection>
  4. <web-resource-name>Nombre de la ruta</web-resource-name>
  5. <url-pattern>/directorio1/*</url-pattern>
  6. <url-pattern>/users.jsp</url-pattern>
  7. </web-resource-collection>
  8. <auth-constraint>
  9. <role-name>role1</role-name>
  10. </auth-constraint>
  11. </security-constraint>

Es necesario tener en cuenta algunos aspectos para este tipo de configuración:

  • Es necesario reiniciar Apache Tomcat cada vez que se asignen nuevos datos en los archivos de configuración.
  • Los roles son asignados por primera vez cuando el usuario accede a un ruta restringida.

 AUTENTICACIÓN EN BASIC

Los datos de autenticación en BASIC se introducen en una ventana que proporciona el propio navegador. El tipo de autenticación se indica con la palabra BASIC mediante la etiqueta login-config en el archivo web.xml.

  1. <login-config>
  2. <auth-method>BASIC</auth-method>
  3. </login-config>

AUTENTICACIÓN EN FORM

La autenticación en FORM precisa de la creación de un formulario que debe realizar el desarrollador y que debe permitir introducir los datos necesarios para autenticarse. En el archivo web.xml se deben indicar los archivos (jsp,html,...) del formulario en la etiqueta login-config.

  1. <login-config>
  2. <auth-method>FORM</auth-method>
  3. <form-login-config>
  4. <form-login-page>/login.jsp</form-login-page>
  5. <form-error-page>/error.jsp</form-error-page>
  6. </form-login-config>
  7. </login-config>

Las etiquetas form-login-page y form-error-page permiten indicar los archivos de login y de error de formulario de autenticación. Este formulario exige incluir los siguientes atributos y sus valores  para que el servlet interno de Java identifique y permita realizar la validación correctamente.

  1. <form action='j_security_check' method='POST'>
  2. <input name='j_username'>
  3. <input type='password' name='j_password'>
  4. <input type='submit' >
  5. </form>

Un ejemplo de un formulario de autenticación genérico basado en la estructura anterior podría ser similar al siguiente código. 

  1. <form name="form" action="j_security_check" method="POST">
  2. <div class="form-group">
  3. <label for="j_username">Usuario</label>
  4. <input name="j_username" type="text" class="form-control" placeholder="Nombre">
  5. </div>
  6. <div class="form-group">
  7. <label for="j_password">Contraseña</label>
  8. <input type="password" name="j_password" class="form-control" placeholder="Contraseña">
  9. <button type="submit" class="btn btn-success">Acceder</button>
  10. </div>
  11. </form>

El archivo de error solamente se diferencia del archivo de login en que debe contener algún mensaje que indique un error de autenticación en el formulario.

  1. <div class="bg-danger">
  2. El usuario o la contraseña no son correctos
  3. </div>
  4. <form name="form" action="j_security_check" method="POST">
  5. <div class="form-group">
  6. <label for="j_username">Usuario</label>
  7. <input name="j_username" type="text" class="form-control" placeholder="Nombre">
  8. </div>
  9. <div class="form-group">
  10. <label for="j_password">Contraseña</label>
  11. <input type="password" name="j_password" class="form-control" placeholder="Contraseña">
  12. <button type="submit" class="btn btn-success">Acceder</button>
  13. </div>
  14. </form>

JDBCREALM

La configuración de un Realm tipo JDBC se realiza también en un archivo de tipo XML pero, a diferencia del UserDataBaseRealm que usa el archivo tomcat-users.xml, JDBCRealm utiliza el archivo context.xml, ubicado en el directorio META-INF de la aplicación y los datos para la autenticación son almacenados en una base de datos relacional. Esta base de datos debe constar, como mínimo, de dos tablas y, a su vez, estas tablas deben estar compuestas, al menos, por dos campos cada una (independientemente del campo identificador), algo similar a la imagen siguiente.



El archivo context.xml debe configurarse añadiendo los datos de conexión, el nombre de la base de datos, de las tablas y los campos para poder relacionarlas. El código siguiente permite el acceso a una ruta especificando los datos de conexión, la base de datos y los datos requeridos de las dos tablas anteriores, además, encriptando con MD5 la contraseña introducida  al enviar el formulario.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context path="/home">
  3. <Realm className="org.apache.catalina.realm.JDBCRealm"
  4. connectionName="admin" connectionPassword="admin"
  5. connectionURL="jdbc:mysql://localhost/sistemaJDBC"
  6. driverName="com.mysql.cj.jdbc.Driver"
  7. digest="MD5"
  8. roleNameCol="role"
  9. userCredCol="password"
  10. userNameCol="user"
  11. userRoleTable="role_user"
  12. userTable="user">
  13. <CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler"
  14. algorithm="MD5"
  15. iterations="1"
  16. saltlength="0"/>
  17. </Realm>
  18. </Context>

Este tipo de configuración omite otras configuraciones como las de tipo UserDatabase y permite, mediante el conector JDBC, trabajar con distintos tipos de bases de datos(MySQL,PostgreSQL,...). De la misma forma que la autenticación del tipo UserDataBase, el archivo web.xml permite indicar las rutas restringidas y las vistas del formulario.

  • El driver JDBC debe siempre estar instalado en el directorio WEB-INF/lib de la aplicación y en el directorio lib de Apache Tomcat para evitar errores.


Comentarios: 0

Para poder comentar es necesario iniciar sesión



Este dominio utiliza cookies de terceros para crear estadísticas y publicidad personalizada. Si continúa navegando está aceptando su uso