En este tutorial vamos a comprobar como podemos «CASificar» un servidor web como Apache Web Server para
restringir el acceso a recursos estáticos sin estar autenticado en CAS.
0. Índice de contenidos.
1. Introducción
Ya hemos hablado de CAS en otras ocasiones, este estandar de facto para la implementación de un SSO, esto es,
«me autentico una vez y entro en todos los sites corporativos».
Lo habitual es encontrarse o aplicaciones «CASificadas» o configuraciones de filtros de seguridad con Spring Security
validando los tickets de CAS.
En este tutorial vamos a comprobar como podemos «CASificar» un Apache Web Server para impedir el acceso a los recursos
estáticos (html, css o js) que puede albergar en él. Esa «CASificación» la realizaremos con el soporte del módulo
mod_auth_cas.
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil MacBook Pro 15′ (2.3 GHz Intel Core i7, 16GB DDR3).
- Sistema Operativo: Mac OS Mavericks 10.9.4
- Boot2docker 1.6.2
- Apache Web Server httpd 2.4.12
3. Configuración.
Para realizar la prueba de concepto hemos reutilizado el contenedor docker que ya usamos para el tutorial de
Soporte de Web Sockets en Apache Web Server (httpd) sobre un contenedor Docker
almacenando una imagen en base al mismo:
bash-3.2$ docker commit httpd-ws httpd-cas ... bash-3.2$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE httpd-cas latest 5cb9513d04e1 46 minutes ago 625.1 MB httpd latest de94ed779434 3 months ago 161.8 MB
A continuación creamos un nuevo contenedor en base a dicha imagen para mapear algún puerto adicional:
bash-3.2$docker run -it --name httpd-cas -p 80:80 -p 443:443 httpd-cas bash ... bash-3.2$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73ef20d401df httpd-cas:latest "bash" 23 minutes ago Exited (130) About a minute ago httpd-cas 7329fc1203d5 httpd:latest "bash" 10 weeks ago Exited (137) 47 minutes ago httpd-ws
Una vez estamos dentro del contenedor debemos preparar el entorno de paquetes de linux necesario para compilar y
ejecutar nuestro módulo de Apache.
apt-get update apt-get install build-essential apt-get install libssl-ocaml-dev apt-get install libpcre-ocaml-dev
Una vez tenemos el entorno preparado podemos seguir la siguiente secuencia de comandos:
Creamos un directorio de trabajo:
mkdir -p /var/cache/apache2/mod_auth_cas cd /var/cache/apache2/mod_auth_cas
Clonamos el repositorio de git que contiene el módulo mod_auth_cas y aquí tenemos dos opciones:
- hacer uso del repositorio oficial, pero el código actual solo es compatible con la versión 2.0 y 2.2,
- clonar un repositorio donde, haciendo un fork, un colaborador ha adaptado el código del módulo para adaptarlo a la versión 2.4 de Apache,
git clone https://github.com/Jasig/mod_auth_cas git clone https://github.com/klausdieterkrannich/mod_auth_cas
Nosotros necesitamos compatibilidad con la versión 2.4 y, a continuación, compilamos el módulo:
./configure make make install
Una vez creado lo añadimos al directorio de módulos de apache modificando los permisos para que al arranque pueda leerlo.
cd /usr/lib/apache2/modules chown root:www-data mod_auth_cas.so mv mod_auth_cas.so /usr/local/apache2/modules
Antes de entrar en la configuración de Apache vamos a crear un «área segura» que será la que securizaremos con el soporte de CAS:
/usr/local/apache2/htdocs# mkdir secure /usr/local/apache2/htdocs# cd secure/ /usr/local/apache2/htdocs/secure# vi index.html
Y, por simular algo más, una «página segura»
<html><body><h1>It works! inside Docker!!! In a secure area!!!</h1></body></html>
A continuación editamos la configuración de Apache:
vi /usr/local/apache2/conf/httpd.conf
Primero vamos a habilitar el soporte de SSL, descomentando la siguiente línea:
LoadModule ssl_module modules/mod_ssl.so
Y crearemos un certificado en el siguiente directorio:
cd /etc/ssl/crt openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tnt.demo.cas.key -out tnt.demo.cas.crt Generating a 2048 bit RSA private key .............................................................................+++ ...........................................................................................................................+++ writing new private key to 'tnt.demo.cas.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:ES State or Province Name (full name) [Some-State]:Spain Locality Name (eg, city) []:Madrid Organization Name (eg, company) [Internet Widgits Pty Ltd]:Autentia Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:tnt.demo.es Email Address []:info@autentia.com
Por último, en la misma configuración de Apache (httpd.conf) incluiremos la carga de nuestro módulo:
LoadModule auth_cas_module modules/mod_auth_cas.so
# CAS config CASCookiePath /tmp/mod_auth_cas/ CASVersion 2 CASDebug on CASValidateServer off CASAllowWildcardCert on CASTimeout 86400 CASIdleTimeout 7200 CASSSOEnabled On LogLevel debug <VirtualHost *:80> SSLEngine on SSLCertificateFile /etc/ssl/crt/tnt.demo.cas.crt SSLCertificateKeyFile /etc/ssl/crt/tnt.demo.cas.key CASCookieDomain "tnt.demo.es" CASLoginURL "https://cas.tnt.es:9443/cas/login" CASValidateURL "https://cas.tnt.es:9443/cas/serviceValidate" LogLevel debug ServerName "tnt.demo.es" DocumentRoot "/usr/local/apache2/htdocs" <Location /secure/> Allow from all AuthType CAS require valid-user </Location> </VirtualHost>
Debemos asegurarnos que el siguiente directorio tiene los permisos suficientes para que el proceso de Apache esrciba en él:
/tmp/mod_auth_cas/
Ya solo nos queda reiniciar el servidor…
httpd -k start
4. Referencias.
- https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=66427
- https://wiki.jasig.org/display/casc/mod_auth_cas
5. Conclusiones.
CASificado!
Un saludo.
Jose