jueves, septiembre 27, 2007

Fortificando un Servidor Apache (I de IV)

***************************************************************************************
- Fortificando un Servidor Apache (I de IV)
- Fortificando un Servidor Apache (II de IV)
- Fortificando un Servidor Apache (III de IV)
- Fortificando un Servidor Apache (IV de IV)
***************************************************************************************

Muchas son las veces que hemos hecho hincapié en definir la seguridad informática como tres factores complementados, los Procesos, las Personas y la Tecnología. De nada sirve tener la mejor tecnología sin unos buenos procesos de implantación, gestión y actualización que la mantengan segura o sin unos usuarios responsables.
En este artículo vamos a ver algunas recomendaciones para fortificar un servidor Web con Apache. Las recomendaciones de seguridad suelen ser comunes en todos los productos y plataformas y lo que suelen cambiar son las herramientas para conseguir los mismos fines.

Las leyes de la fortificación

La fortificación de sistemas tiene tres principios básicos que dirigen todo el proceso y que debes tener siempre presente en cualquier fortificación que vayas a realizar, así que, para fortificar un servidor web con Apache deberemos seguirlas también:

- Mínimo Punto de Exposición (MPE): Un servidor sólo debe exponerse en lo que sea estrictamente necesario para su rol, es decir, un servidor Web no debe tener cargado el software de impresión y mucho menos ejecutando demonios de servicio de impresión en red. Esta regla ha hecho que las instalaciones de los sistemas operativos hayan dejado de realizarse orientadas a componentes, es decir, instalando módulos, y se realicen orientadas a roles, es decir, instalando módulos absolutamente necesarios para el cumplimiento de un rol.

- Mínimo Privilegio Posible (MPP): Todo componente dentro de un sistema debe ejecutarse con los privilegios necesarios para cumplir con su rol y nada más. Un sitio web nunca debe correr como root porque no es necesario para dar servicio y lo único que puede suceder es que un atacante que consiga vulnerar el sitio obtenga esos privilegios de root en el sistema.

- Defensa en Profundidad (DP): Se deben implementar todas las medidas de seguridad que sean posibles teniendo en cuanta dos factores: Primero: Una medida de seguridad no debe anular a otra. El ejemplo más claro de esto es cifrar las comunicaciones e instalar un Sistema de Detección de Intrusiones de Red (NIDS), ya que el segundo no podría detectar ataques por red si se usan los canales cifrados. Y Segundo: Las medidas de protección no pueden anular la utilidad de un sistema. Si las medidas de protección hacen que el sistema deje de dar servicio en tiempo útil entonces no son medidas viables.

Las fuentes del servidor

Cuando instalas un servidor Apache tienes varias formas de obtener y mantener los ficheros del servidor. El primer camino es ir directamente al proyecto y descargarte la última versión compatible con tu sistema operativo y después realizar las comprobaciones oportunas de los ficheros mediante el hash y la firma, luego lo configuras, lo compilas y listo. Esto es importante sobre todo cuando te descargas ficheros desde otros Servidores Mirror. La otra opción es bajarte los binarios compilados para tu sistema operativo con lo que deberías realizar la comprobación del hash y la firma de los ficheros pero directamente de los binarios. Procura bajarte los ficheros compilados de los servidores que marcan los fabricantes del sistema operativo para evitar problemas. Puede suceder, como le pasó a WordPress no hace mucho que vulneren su servidor y directamente el código que te descargas del propio fabricante venga troyanizado, pero es menor.

El elegir correctamente el lugar de la descarga del fichero evita situaciones que a priori parecen algo paranoicas pero existen formas de atacar sistemas desde las fuentes. Si te interesa estar informado sobre estas técnicas, hay documentos, como “Troyanizando Apache y sus Módulos”, escrito por Sp4rK, disponibles en Internet.
Para este ejemplo he elegido la última versión de Apache disponible de la rama 2.X, la 2.24, como dice en la propia web del proyecto es principalmente una versión bugfix, es decir, correctora de bugs, y es la mejor opción del proyecto Apache. Puedes acceder a los ficheros en la siguiente URL: http://httpd.apache.org/download.cgi y es importante que si estas realizando una actualización de una versión a otra revises el Changelog dónde se indican los principales cambios de cada versión para que no te encuentres con una situación de incompatibilidades con otro software de tu servidor.

Imagen: Anuncio de versión Apache 2.2.4.

No solo hay que descargarse la última versión sino que además, es importantísimo estar suscrito a las actualizaciones de seguridad del producto pues mantener el servidor actualizado es una de las principales cosas de las que preocuparse para mantener segura una infraestructura con Apache.

Una vez que te hayas descargado puedes accede tanto a los fuentes del archivo, como al fichero de hash MD5 y a la firma pública de los códigos fuente y puedes comprobar que el fichero es el mismo que ellos publican realizando, en primer lugar una comprobación del hash y en segundo lugar una comprobación de la firma. Para que puedas realizar la comprobación de la firma es necesario que tengas las firmas de los distribuidores de los ficheros del proyecto que puedes descargar de esta URL: http://www.apache.org/dist/httpd/KEYS

Imagen: Importación de claves con gpg --import KEYS

Y luego verificamos la firma con gpg --verify http-2.2.4.tar.gz.asc que es el fichero con la firma de las fuentes y el hash md5 generando un nuevo hash del fichero con el comando md5 http-2.2.4.tar.gz y comprobando si el valor es el mismo que nos ofrecen en el fichero http-2.2.4.tar.gz.md5.

Imagen: Verificación de firma y hash

Compilación de los archivos fuente

Antes de empezar a configurar los parámetros del servicio debemos configurarlo. En esta parte se deben realizar una serie de acciones que deben ser tenidas en cuenta.

Configuración del banner del servidor Web.

Una de las reglas de oro es dar la menor información posible sobre tu sistema, para reducir el número de atacantes. Muchos escáneres de vulnerabilidades realizan una comprobación del banner que devuelve el servidor web para poder aplicar unos u otros exploits. Una de las recomendaciones es cambiar dicho banner. Para cambiar el banner debemos tocar el archivo ap_release.h antes de configurar el servidor.

Imagen: include/ap_release.h

Como se puede ver en la captura se puede cambiar la versión de Apache, yo le he dejado la 2.2.4.0. Cambiar ese banner ayudaría a que Apache bajara en las estadísticas de Netcraft, tan llevadas y traídas en el mundo de la competición software, así que si no quieres dar ninguna información pero quieres que las estadísticas sigan contando “un Apache más” te recomiendo que pongas un genérico Apache utilizando la clave ServerTokens Prod en el archivo httpd.conf. Yo por mi parte le he bautizado con el nombre de Malignito.

Imagen: Respuesta ante conexión por el puerto 80 una vez que el servidor ya está corriendo

Configuración e Instalación

Una vez que hayas cambiado el banner, podemos pasar a configurar los módulos que quieres habilitar de tu servidor Apache, para ello, antes de realizar la configuración de los fuentes te recomiendo que analices bien qué necesitas tener cargado y qué no necesitas tener cargado. Todos los módulos que hay para Apache están documentados en la siguiente URL: http://modules.apache.org/ y tienes una lista reducida en la siguiente URL: http://httpd.apache.org/docs/2.0/es/mod/. Actualmente hay más de 400 módulos disponibles para Apache, luego es importante que sepas los que quieres tener funcionando y los que no. Algunos módulos que se suelen cargar por defecto y no suelen ser necesarios pueden ser:

- mod_imap: Que ofrece servicio de mapeo automático de ficheros de índice del lado del servidor.
- mod_include: Habilita los includes de ficheros del lado del seridor. Los .shtml.
- mod_info: Da información sobre el servidor. Los escáneres rastrean la información que ofrece. Se suele habilitar en pruebas y desarrollo, pero no en producción.
- mod_userdir: Para mapear los directories personales de los usuarios. También está el mod-ldap-userdir para hacerlo vía árboles ldap.
- mod_status: Para tener estadísticas.
- mod_cgi: Ofrece soporte para ejecución de cgis. Si no tienes programas cgi en tu servidor deshabilítalo.
- mod_autoindex: Listados de directorio para cuando no hay archivo por defecto.

Si ya has realizado tu selección de módulos puedes proceder a su configuración con el siguiente comando:

Imagen: Configurando módulos en Apache.

Como se puede ver basta con usar el comando --disable-modulo para evitar que se cargue un determinado módulo en el sistema. Lógicamente solo podrás habilitar o deshabilitar aquellos módulos que tengas cargados, si deseas agregar nuevos módulos estos deben ser agregados mediante el comando config-status.

Compilación

Una vez que tengas configuradas las listas de módulos que necesitas puedes pasar a la ejecución del comando make y make install para acabar de instalar Apache y cuando lo tengas listo, podrás ver la lista de módulos que tienes cargados con el comando httpd –l.

Imagen: Lista de módulos cargados

El último comando que se debe revisar es httpd –V que nos permitirá ver cuáles son las opciones de compilación con que se ha instalado el servidor.

[Fin de la primera parte]

7 comentarios:

Raul Gimenez Herrada dijo...

Un articulo fantástico!! Muchas grácias!

Veo que madruga te sienta de perlas!!!

Anónimo dijo...

Un buén artículo. Espero los siguientes con ansia :)

shadow.whitehack dijo...

me gusto el articulo tambien, me gusto eso de malignito xD

Anónimo dijo...

dios! no usas sudo!!! :-O

Dj Blue dijo...

Genial el articulo. Esperaré con impaciencia el resto de artículos igual que espero con impaciencia que llegue el 4 de octubre.

PD: Yo quiero chapa :P

Anónimo dijo...
Este comentario ha sido eliminado por el autor.
Anónimo dijo...

Según mi modo de ver lo primero es listar módulos de apache con httpd -V y luego desinstalarlos.

Esto es: Como vas a programar si no sabes que programar.

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares