SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 29 de noviembre de 2010

Cómo configurar HTTPS en Tomcat utilizando Roles y Privilegios

Introducción
Ya hemos visto en ocasiones anteriores Cómo Instalar Apache Tomcat en Solaris. Además, con los conocimientos que hemos adquirido sobre RBAC, Roles, Privilegios y Seguridad en Solaris, podemos realizar la instalación con un nivel de seguridad muy elevado.

En esta ocasión vamos a ver cómo podemos configurar un conector HTTPS en Apache Tomcat, utilizando un puerto no privilegiado, por ejemplo 8443, y luego, veremos cómo podemos utilizar el puerto privilegiado 443 sin tener que lanzar Apache Tomcat con <root>.

Instalación de Apache Tomcat
Para su instalación seguiremos los pasos del post Cómo Instalar Apache Tomcat en Solaris 10 utilizando SMF para su gestión, aunque haremos algunos cambios -ahora que conocemos RBAC y Roles-

Diferencias en la Instalación
Cuando hablábamos de Cómo Instalar Tomcat en Solaris 10 utilizando SMF, todavía no habíamos mencionado el tema de RBAC, Roles y Privilegios, por lo tanto, no podíamos entrar en mucha complicación. Ahora bien, ya estamos en disposición de poder instalarlo de una forma mucho más segura y eficiente utilizando: roles, privilegios y autorizaciones.


Creación de la Clave RSA
En nuestro ejemplo vamos a generar un clave <auto sellada>, es decir, que seremos nosotros mismos quienes validemos la firma.

Esta funcionalidad nos permite establecer certificados de forma sencilla, aunque no es recomendable para su puesta en producción -sobre todo si es un servicio a terceros-, principalmente porque al estar validado por nosotros mismos, el navegador nos mostrará un mensaje de aviso.

Sin embargo, para pruebas es una forma muy sencilla de trabajar -y barata-. En nuestro caso, queremos crear el keystore en <$TOMCAT_HOME/cert/havoctec-tomcat>
$ cd $TOMCAT_HOME
$ mkdir cert
$ chmod 700 cert
$ chown appserver:root cert
Ahora podemos utilizar la utilidad <keytool> de Java para generar la clave RSA que utilizaremos en Tomcat
$ keytool -keystore /var/sfchildren/appserver/tomcat-6.0/cert/havoctec-tomcat -genkey -keyalg RSA -alias havoctec
Escriba la contraseña del almacén de claves: havoctec 
Volver a escribir la contraseña nueva: havoctec
¿Cuáles son su nombre y su apellido?
  [Unknown]:  Urko Benito
¿Cuál es el nombre de su unidad de organización?
  [Unknown]:  HavocTec S.L.
¿Cuál es el nombre de su organización?
  [Unknown]:  HavocTec S.L.
¿Cuál es el nombre de su ciudad o localidad?
  [Unknown]:  MADRID
¿Cuál es el nombre de su estado o provincia?
  [Unknown]:  SPAIN
¿Cuál es el código de país de dos letras de la unidad?
  [Unknown]:  ES
¿Es correcto CN=Urko Benito, OU=HavocTec S.L., O=HavocTec S.L., L=MADRID, ST=SPAIN, C=ES?
  [no]:  si

Escriba la contraseña clave para
        (INTRO si es la misma contraseña que la del almacén de claves):  havoctec
Esto nos ha creado una nueva clave RSA en el almacén que hemos indicado, en nuestro caso
<$TOMCAT_HOME/cert>, sin embargo, los permisos son muy leves, y es interesante modifcarlos para que sólo el dueño pueda leer y escribir en el él, por ejemplo:
$ ls -ltr
total 4
-rw-r--r--   1 appserver asengine    1381 nov 29 09:18 havoctec-tomcat
$ chmod 600 havoctec-tomcat
$ ls -ltr
total 4
-rw-------   1 appserver asengine    1381 nov 29 09:18 havoctec-tomcat

Creación del Connector HTTPS en puerto NO PRIVILEGIADO (8443)
Por último, definiremos un conector HTTPS en el archivo de configuración <$TOMCAT_HOME/conf/server.xml> donde deberemos indicarle la ubicación del keystore, y su contraseña, por ejemplo, en nuestro caso la ubicación del certificado es <$TOMCAT_HOME/cert/havoctec-tomcat> y su contraseña <havoctec>

$ vi $TOMCAT_HOME/conf/server.xml

    <Connector
        port="8443"
        protocol="HTTP/1.1"
        SSLEnabled="true"
        maxThreads="150"
        scheme="https"
        secure="true"
        clientAuth="false"
        keystoreFile="/var/sfchildren/appserver/tomcat-6.0/cert/havoctec-tomcat"
        keystorePass="havoctec"

        sslProtocol="TLS" />

:wq

Conexión mediante HTTPS a Tomcat
Ya podemos iniciar nuestro servidor Apache Tomcat (si lo tenemos levantado, deberemos reiniciarlo) y con un navegador nos conectaremos al puerto 8443 utilizando HTTPS

Mi servidor de ejemplo está en la IP 192.168.1.13 y, cuando me conecto con Safari al servicio veo el siguiente mensaje de aviso -como ya os he comentado es debido a que hemos "auto firmado" el certificado-

 Si pulso sobre "Mostrar Certificado" puedo ver los datos que he introducido en le comando <keytool> para su generación.


Funciona! No ha sido tan difícil, no? Ahora bien, el puerto para el protocolo HTTPS es el 443, y no el 8443 así que tenemos diferentes opciones para poder hacer una conexión HTTPS utilizando la forma <https:// ....>
  • Utilizamos <ipfilter> para redirigir el tráfico
  • Configuramos el usuario (role) de Apache Tomcat para permitirle utilizar puertos privilegiados
  • Ponemos un <reverse proxy> con soporte SSL
Como veis son muchas las opciones, aunque hoy vamos a ver una muy sencilla -ahora que conocéis RBAC, Roles y Privilegios- vamos a otorgar el privilegio <net_privaddr>


Configuración Privilegios Role o Usuario
Para poder hacer que nuestro <role> o <user> levante el servicio Tomcat en un puerto privilegiado, deberemos añadir el privilegio <net_privaddr>, para ello simplemente deberemos ejecutar (el <role> encargado de levantar el servicio de Tomcat en mi caso es <appserver>)
root@openzooey:/# rolemod -K defaultpriv=basic,net_privaddr appserver

A continuación, modificaremos el conector para que, en vez de escuchar en el puerto 8443 lo haga en le 443 y levantaremos nuestro Tomcat

$ $TOMCAT_HOME/bin/shutdown.sh
$ vi $TOMCAT_HOME/conf/server.xml
    <Connector
        port="443"
        protocol="HTTP/1.1"
        SSLEnabled="true"
        maxThreads="150"
        scheme="https"
        secure="true"
        clientAuth="false"
        keystoreFile="/var/sfchildren/appserver/tomcat-6.0/cert/havoctec-tomcat"
        keystorePass="havoctec"

        sslProtocol="TLS" />
 :wq
$ $TOMCAT_HOME/bin/startup.sh


Conclusiones
En esta ocasión hemos visto como con el uso de privilegios nos permite hacer cosas que antes deberíamos delegar en <root>, además, de esta forma podemos tener un sistema muy seguro y controlado.



Referencias

No hay comentarios:

Publicar un comentario