En muchas ocasiones, además de la importancia de dar a conocer nuestro negocio a través de internet, existe la necesidad de que esa imagen transmita, no sólo nuestra filosofía, sino que lo haga de un modo eficaz y robusto. En esta ocasión vamos a abordar las principales técnicas de protección que podemos aplicar en uno de los servidores más utilizados en internet, Apache.

Como complemento a las técnicas que repasamos en la entrega del mes pasado, en esta ocasión vamos a detallar cómo podemos configurar los sistemas de cifrado de comunicaciones con SSL/TLS en nuestros sitios web; en segundo lugar, abordaremos la configuración de los registros de actividad para su posterior análisis (los logs); también repasaremos los sistemas de autenticación de usuarios y, por último, explicaremos cómo configurar mod_security, que nos permitirá filtrar las URL de acceso a nuestros sitios.

Mod_SSL

El protocolo de comunicaciones SSL/TLS se utiliza para cifrar la comunicación entre dos equipos y autenticar a los participantes de la misma. Este artículo no pretende mostrar el funcionamiento del sistema SSL, ampliamente descrito en numerosos artículos desde su aparición, sino simplemente cómo se debe configurar en un servidor Apache, con el fin de obtener comunicaciones cifradas y, en caso de necesitarlo, también autenticadas.

Siempre que se utilice SSL/TLS estamos cifrando las comunicaciones extremo a extremo; sin embargo, el proceso de autenticación requiere una configuración más específica. Si se desea autenticar al servidor, es decir, que los clientes tengan la certeza de que se están comunicando con el servidor que ellos desean, es necesario utilizar un certificado emitido por una Entidad Emisora de Certificados (CA) contrastable por los usuarios de nuestro sistema, o lo que es lo mismo, una entidad en la que los clientes confíen, y además tengan su clave pública instalada en su máquina. Si esto no se produce, el uso de SSL todavía ayudará a cifrar las comunicaciones, pero no podrá detectar un certificado falso (fake) emitido por un atacante. Por lo tanto, a pesar de que en el presente artículo se utiliza un certificado emitido por nosotros mismos (con fines didácticos), se recomienda utilizar un certificado de servidor emitido por una CA de confianza para nuestros usuarios.

Además de autenticar el servidor, con SSL se pueden autenticar a los clientes mediante certificados digitales a la hora de iniciar la conexión con SSL, aunque esta no es una práctica muy extendida, debido a la complejidad en el despliegue y mantenimiento de los certificados de los clientes.

Para realizar un ejemplo de configuración, en éste caso hemos utilizado un Certificado Digital para servidores web creado por nosotros mismos. Para ello, como se puede apreciar en la captura 1, hemos utilizado la utilidad OpenSSL (www.openssl.org).

El proceso que hay que seguir para la creación del certificado es sencillo: primero hay que instalar la herramienta siguiendo los pasos de configuración (./configure), construcción (make) e instalación (make install). Una vez instalado en nuestro sistema, podremos crear el certificado con el comando que se ve en la imagen 2.

Con el comando ./openssl reg -new -x509 -days 1000 -newkey rsa:1024 estamos diciendo a la herramienta que nos cree un certificado X.509 con una caducidad de 1.000 días. Por lo tanto, pasados estos 1.000 días será necesario renovarlo. Este certificado va a ser creado con una clave de 1.024 bytes y se van a generar dos ficheros, uno el del certificado propiamente dicho, y otro el de la petición (ninguno va a estar protegido por contraseña).

Con el certificado digital emitido ya tenemos lo necesario para configurar el soporte SSL en nuestro servidor web. Lo primero que hemos de preparar es que el servidor Apache cargue el módulo SSL y para ello, como vimos en el artículo del mes pasado, realizamos una configuración inicial (podemos utilizar la opción de preparar el servidor con soporte para el mod_ssl usando configure -prefix=ruta -enable-ssl. Algunas distribuciones de Linux, como Debian, ofrecen una versión de Apache acompañada de algunas herramientas que ayudan en la gestión de módulos, como a2enmod que permite agregar módulos a Apache. Como vimos el mes pasado, con el comando httpd -l se puede comprobar la lista de módulos que están activos.

Con esto ya estaría cargado el modulo SSL en el servidor Apache. Ahora deberemos configurar una serie de parámetros para dar soporte a SSL a nivel de servidor, o de Virtual Host. Para ello se deben configurar las opciones en el archivo httpd.conf. SSL viene acompañado de muchas opciones y es recomendable, para ajustes especiales, consultar la documentación de mod_ssl, que está disponible en http://httpd.apache.org/docs/2.2/en/mod/mod_ssl.html. No obstante, en la Tabla A: Configuraciones mod_ssl mostramos las configuraciones que se deben realizar para que nuestro servidor esté funcionando correctamente.

Además de esto, en la captura 3 tenemos una configuración válida del archivo httpd.conf que levanta los demonios httpd con soporte SSL. Como se puede ver, se ha habilitado la escucha por el puerto 443, que es el utilizado por defecto para el protocolo https-s. También se han configurado los parámetros SSLEngine on para levantar los servicios SSL, SSLCertificateFile y SSLCertificateKeyFile con las rutas a los ficheros creados con el comando openssl; hemos activado el soporte para TLSv1 y SSLv3 en exclusividad y hemos configurado la suite de cifrado con soporte Medio y Alto, así como el uso de protocolos de firma SHA1 y MD5. Después, en la ruta de acceso a los documentos, se ha exigido el uso de SSL con el parámetro SSLRequireSSL.

Con esta configuración, cuando se levanta el servicio http y se intenta acceder a la ruta por defecto de nuestro servidor se obtendrá un mensaje de error (ver captura 4), que puede ser personalizado como se explicó en el capítulo anterior, en el que nos avisa de que es estrictamente necesario el uso de httpd-s.

Por el contrario, si nos conectamos al servidor mediante el uso de una conexión http-s el acceso será concedido y se podrá consultar toda la información sobre el certificado digital que se está utilizando el servidor (captura 5).

Gestión de Logs

La configuración de los registros de acceso y los eventos que ser producen en un servidor web son de especial importancia, pues pueden ayudar a detectar preventivamente un ataque al sistema, una debilidad que está siendo explotada o simplemente un fallo en la configuración o en el sistema. Para ello, Apache dispone de herramientas flexibles que nos permiten una selección flexible sobre los elementos que queremos guardar registro, dónde y en qué formato.

Apache gestiona, por defecto, tres tipos de registros: registro de errores, registro de acceso y registro del identificador del proceso (PID) del demonio del servicio. El registro de errores se guarda en un fichero que es marcado por la directiva errorlog. Esta directiva también puede utilizarse para, en lugar de guardar la información en ficheros, utilizar el servicio syslog para registrar los eventos a través de la red y de forma centralizada. El uso de syslog será de especial utilidad cuando tenemos sistemas de análisis de log centralizados o de correlación de eventos.

ErrorLog /ruta/ficheros/log/error_log O ErrorLog syslog:user

El nivel de info