«CASificación» de Apache Web Server 2.4 «dockerizado»

0
3507

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:

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.


5. Conclusiones.

CASificado!

Un saludo.

Jose

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