Seguridad en Tomcat

4
78068

Seguridad en Tomcat

Si queremos proteger ciertos recursos (jsps y servlets) podemos utilizar las
características de Tomcat.

Esta restricción es muy básica y solo limita a que usuarios pueden acceder
a que recursos pero no limita lo que esos usuarios pueden hacer cuando ya han
obtenido el acceso. Por eso, llamaremos a esta seguridad … seguridad de acceso
y deberá ir combinada por una seguridad en nuestra aplicación e incluso en la
base de datos, para que la seguridad sea completa.

Creamos una nueva WebApp

Creamos un directorio colgando de webapps, en este caso
.. llamado roberto 

Debemos tocar los ficheros de configuración de apache para que
sea una webapp válida

En el fichero server.xml introducimos un nuevo contexto

En el fichero web.xml, verificamos los ficheros que se buscarán por
defecto en nuestro directorio

Creamos la página index.htm y la probamos

En el mismo directorio podemos ver los usuarios registrados.

Creamos un nuevo usuario. 

Vamos a proteger un directorio que vamos a llamar área protegida

Tendremos que hacer algunos cambios en el fichero /roberto/web.xml

Podemos ver que añadimos un nuevo área donde especificamos el patrón sobre
el que se protegerán las páginas

<url-pattern>/areaprotegida/*</url-pattern>

El rol que esta autorizado a acceder

<role-name>intranet</role-name>

Y el formulario que se mostrará cuando alguien intente acceder a ese área

<form-login-page>/areaprotegida/login.jsp</form-login-page>
<form-error-page>/areaprotegida/error.jsp</form-error-page>

<?xml version=»1.0″ encoding=»ISO-8859-1″?>

<!DOCTYPE web-app
PUBLIC «-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN»
«http://java.sun.com/dtd/web-app_2_3.dtd»>

<web-app>
<display-name>WebApp de Roberto</display-name>
<description>
Esta es la Web app de ejemplo
</description>

<security-constraint>
<display-name>Reglas de Seguridad</display-name>
<web-resource-collection>
<web-resource-name>Área protegida</web-resource-name>
<url-pattern>/areaprotegida/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>intranet</role-name>
</auth-constraint>
</security-constraint>

<!– Default login configuration uses form-based authentication –>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Ejemplo de autentificación por formulario</realm-name>
<form-login-config>
<form-login-page>/areaprotegida/login.jsp</form-login-page>
<form-error-page>/areaprotegida/error.jsp</form-error-page>
</form-login-config>
</login-config>

<!– Security roles referenced by this web application –>
<security-role>
<role-name>intranet</role-name>
</security-role>
</web-app>

La página por defecto, index.htm, muestra el nombre del
usuario y ofrece un link para deslogarse 

Tambien podemos ver en negrita el código para procesar la
petición de deslogado

<%
if (request.getParameter(«logoff») != null) {
session.invalidate();
response.sendRedirect(«index.jsp»);
return;
}
%>

<html>
<head>
<title>Home del área protegida</title>
</head>
<body bgcolor=»white»>

Estas conectado como <b><%= request.getRemoteUser() %></b>
con ID de sesión <b><%= session.getId() %></b><br><br>

<br>

Pulse para cerrar la sesión 

<a href='<%= response.encodeURL(«index.jsp?logoff=true») %>’>aquí</a>.
Esto debe forzar la carga de la página de log
</body>
</html>

Creamos la página de error, que tiene un enlace a la página
de login

<html>
<head>
<title>Página de Error</title>
</head>
<body bgcolor=»white»>

<br>
Usuario o contraseña incorrecta.

<a href='<%= response.encodeURL(«login.jsp») %>’>
Reintentar … 

</a>.
<br>
</body>
</html>

Y vemos que la página de login tiene que tener un formulario con unos campos
concretos (en negrita)

<html>
<head>
<title>Página de Ejemplo</title>
<body bgcolor=»white»>
<form method=»POST» action=‘<%= response.encodeURL(«j_security_check») %>’>
<table border=»0″ cellspacing=»5″>
<tr>
<th align=»right»>Usuario:</th>
<td align=»left»><input type=»text» name=»j_username«></td>
</tr>
<tr>
<th align=»right»>Contraseña:</th>
<td align=»left»><input type=»password» name=»j_password«></td>
</tr>
<tr>
<td align=»right»><input type=»submit» value=»Login»></td>
<td align=»left»><input type=»reset» value=»Borrar»></td>
</tr>
</table>
</form>
</body>
</html>

Probamos la página, y metemos un usuario incorrecto.

Vemos que obtenemos la página de error.

Si volvemos a meter los datos correctos …… nos mostrará la
información adecuada.

Recordar que el usuario y rol lo declaramos anteriormente …

Por cierto, si obtenéis un error como éste, es porque os logais cuando ya estais logados. Debéis invalidar la sesión, por ejemplo, antes de mostrar un formulario de login ….

HTTP Status 404 – /areaprotegida/j_security_check


type Status report

message /areaprotegida/j_security_check

description The requested resource (/areaprotegida/j_security_check) is not available.


Apache Tomcat/5.0.12

Esta autentificación es la más simple y a través de fichero …….. en
otros ejemplos os mostraremos como hacerlo con un LDAP.

Sobre el
Autor ..

4 COMENTARIOS

  1. Este tutorial es excelente aprovecho para consultar algo con tomcat en eclipse y es que intento solucionar este error que coloco más abajo, trabajo en una aplicacion con (richfaces, maven, jsf, jsp), ya tengo las librerias de richfaces, y pienso que el problema es por el mismo tomcat de eclipse ya me han dicho que con maven utilizandolo en el proyecto hay que actualizar el dir lib del target pero ya hasta he creado el war de mi proyecto e iniciando manualmente el tomcat y me funciono la aplicacion no sé porque dentro de eclipse no quiere levantar el servidor del jsp que estoy haciendo, y las configuraciones del web.xml y faces-config.xml estan bien, he verificado este filtro en el web.xml y esta correcto mas abajo despues del error se los muestro a ver si alguien me ayuda por favor?

    GRAVE: Excepción arrancando filtro ajax4jsf
    java.lang.ClassNotFoundException: org.ajax4jsf.Filter
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:269)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
    at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:115)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    07/13/2010 05:13:20 PM org.apache.catalina.core.StandardContext start
    GRAVE: Error filterStart
    07/13/2010 05:13:20 PM org.apache.catalina.core.StandardContext start
    GRAVE: Falló en arranque del Contexto [/MavenJsf] debido a errores previos

    Archivo Web.xml

    org.richfaces.SKIN
    blueSky

    Ajax4jsf Filter
    ajax4jsf
    org.ajax4jsf.Filter

    ajax4jsf
    FacesServlet
    REQUEST
    FORWARD
    INCLUDE

    JsfProject

    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp

    javax.faces.STATE_SAVING_METHOD
    server

    FacesServlet
    javax.faces.webapp.FacesServlet
    1

    FacesServlet
    /faces/*

  2. ¿Porqué usan \\\’\\\’ en lugar de, simplemente \\\»j_security_check\\\» en el ACTION del FORM de la página de login?
    Estoy tratando de usar \\\»security-constraint\\\» en Tomcat detrás de Apache (httpd), con mod_jk como conector, pero no logro hacerlo funcionar.
    Si apunto el navegador a Tomcat, la aplicación funciona bien, pero si paso a través de Apache, el navegador (Firefox) muestra una página en blanco cuando trato de acceder a los recursos protegidos con el usuario y contraseña correctos.
    ¿Alguien me puede ayudar?
    Muchas gracias.

  3. Buenas tardes.

    Resulta que tengo instalado un Apache Tomcat 8.5 sobre un Windows Server 2008.

    Por un tema de seguridad, me pidieron deshabilitar la versión del Apache cuando se produce un mensaje de error:

    https://ibb.co/kuhX1v

    Lo he intentado pero no hay manera, no soy capaz.
    Los archivos de los que dispongo para poder realizar dicha tarea son los siguientes:

    https://ibb.co/ciawTa

    ¿Como tendría que hacer??
    Muchas gracias.

    Un saludo.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad