En este curso de seguridad en aplicaciones web en cinco entregas se explicarán algunos de los conceptos más importantes para protegerse frente a los ataques más frecuentes y las amenazas más graves.

Conocer la identidad de los visitantes a un sitio web puede resultar crucial en muchas aplicaciones. Este mes repasamos las técnicas más utilizadas para autenticar a los usuarios, discutiendo sus fortalezas y debilidades relativas.

Nivel de dificultad: Medio

Objetivo: Asegurar la identidad de los visitantes al sitio web

Herramientas: Las herramientas incluidas con el software del servidor web

Toda aplicación web que desee restringir el acceso a los usuarios se enfrenta al problema de cómo decidir cuál es la identidad del visitante y qué acciones le están permitidas. Se trata por tanto de obtener alguna certeza acerca de la identidad digital del visitante, para lo cual éste deberá presentar una serie de evidencias acerca de sí mismo. Este proceso consta de tres pasos: 1) Identificación, durante la cual el sujeto anuncia su identidad; 2) Autenticación, durante la cual se validan las credenciales presentadas por el sujeto para cerciorarse de su identidad; y finalmente, 3) Autorización, mediante la cual se comprueban los privilegios del usuario autenticado para decidir a qué recursos puede acceder.

Tradicionalmente, las distintas formas de autenticar a los usuarios que intentan acceder a un recurso o servicio han girado en torno a tres métodos: 1) Restringir el acceso en función de algo que el usuario conoce, como por ejemplo una contraseña o un PIN; 2) en función de algo que el usuario posee, como una tarjeta inteligente o una de banda magnética, un certificado digital o un token; o 3) en función de algo que el usuario es, esto es, de sus características fisiológicas, como el iris de su ojo o su huella dactilar, lo que se conoce como identificación biométrica. Estas modalidades de autenticación pueden combinarse: por ejemplo, posesión de una tarjeta de crédito y conocimiento de un PIN, como ocurre a la hora de sacar dinero de los cajeros, lo que se denomina autenticación multifactor.

En esta entrega se tratarán los dos primeros métodos, pasándose repaso a la autenticación mediante contraseñas a través de formularios y de la autenticación básica, así como la autenticación mediante certificados digitales.

Autenticación mediante formularios

La autenticación mediante formularios web presenta varias ventajas frente a otras formas de autenticación. Por un lado, al recogerse las credenciales a través del formulario de una página web, la interfaz de usuario es totalmente personalizable. En segundo lugar, no existen restricciones respecto al lugar de almacenamiento de las credenciales de los usuarios: un archivo de configuración del servidor, un archivo de texto o XML, una tabla en una base de datos, cualquier almacén que se pueda imaginar. En tercer lugar, resultan ideales para escenarios en Internet con millones de usuarios potenciales y funciona con cualquier tipo de navegador. Por último, es muy sencillo incorporar una función de desconexión de los usuarios o cierre de sesión.

Esta forma de autenticación también presenta sus limitaciones, que hay que combatir. En primer lugar, y más importante, las credenciales viajan en claro, por lo que su transporte debe protegerse mediante SSL (véase el mes anterior). En segundo lugar, gestionar las sesiones mediante testigos de sesión puede resultar una tarea complicada, tanto que de hecho será tratada en el próximo mes. Por último, siempre que no se utilicen las herramientas proporcionadas por las plataformas de desarrollo (.NET, J2EE), se obliga al desarrollador de la aplicación web a escribir código de seguridad para el que generalmente no está preparado.

Los pasos necesarios para habilitar la autenticación mediante formularios dentro de una aplicación .NET o J2EE son muy sencillos: 1) En primer lugar, debe configurarse adecuadamente el archivo de configuración de la aplicación para indicar que utilizará autenticación mediante formularios; 2) a continuación, debe configurarse el acceso a los directorios a proteger; y 3) por último, debe crearse una página de inicio de sesión, en la que los usuarios puedan introducir sus credenciales.

En el caso de ASP.NET, el archivo de configuración se llama Web.Config, al que se le añade una sección authentication de la siguiente manera:

<authentication mode=”Forms”>

<forms

name=”Usuario”

loginUrl=”/Tienda/Entrar.aspx”

protection=”All”

timeout=”10”

path=”/Tienda/” />

</authentication>

donde name es el nombre de la cookie que contiene el ticket de autenticación, siendo el valor predeterminado .ASPXAUTH; loginUrl es la dirección de la página de inicio de sesión a la que será redirigido un usuario sin autenticar que intente acceder a una página protegida, siendo el nombre predeterminado Login.aspx; protection indica el nivel de protección utilizado para la información de la cookie, a elegir entre None (ningún tipo de protección), Validation (sólo se valida que la cookie no ha sido modificada), Encryption (la cookie está cifrada) o All (cifrado y validación de los contenidos de la cookie), siendo el valor predeterminado All; path representa la ruta de acceso utilizada por la cookie, siendo el valor predeterminado /; y timeout es el tiempo de caducidad de las cookies de sesión, que no persisten en el disco duro al cerrar la sesión con el navegador, siendo el valor predeterminado de 30 minutos.

A continuación, se debe prohibir el acceso a todos los usuarios que no se hayan autenticado. Para ello se emplea la sección authorization, que puede contener dos tipos de elementos: 1) allow: Permite el acceso a los usuarios especificados por su nombre, separados por comas (,), usándose opcionalmente el símbolo * para denotar todos los usuarios y el símbolo ? para los usuarios anónimos (sin autenticar); y 2) deny: Deniega el acceso a los usuarios especificados, usándose la misma convención de símbolos.

Si lo que se pretende es denegar el acceso a los usuarios no autenticados a un directorio particular, se puede crear un archivo Web.Config en dicha carpeta, con la siguiente sección authorization:

<authorization>

<deny users=”?” />

</authorization>

En el caso de J2EE, se modifica el archivo web.xml añadiendo una sección login-config para indicar que se utilizará autenticación mediante formularios, así como la ruta de acceso de la página de petición de credenciales y de la página de error con el mensaje a mostrar en caso de que el usuario las introduzca incorrectamente:

<login-config>

<auth-method>FORM</auth-method>

<form-login-config>

<form-login-page>/login.html</form-login-page>

<form-error-page>/login-error.html</form-error-page>

</form-login-config>

</login-config>

A continuación, se configura la autorización añadiendo una sección <security-constraint> en la que se indica los recursos web y métodos HTTP a proteger, el uso o no de SSL para proteger el envío de las credenciales y los roles a los que les está permitido el acceso:

<security-constraint>

<web-resource-col