Guía de consejos prácticos de seguridad en un servidor web Apache

Actualizado el 27 de septiembre, 2016. Por BlueHosting.

Apache se ha mantenido como el servidor web más utilizado desde finales de los años 90 hasta la actualidad. Esto lo hace una herramienta robusta que aloja, para la fecha de publicación de este tutorial, más de 70 millones de sitios web a nivel mundial. Al ser una herramienta de tan amplio desarrollo y que ofrece tantas prestaciones y características, también aumentan los riesgos de seguridad y debemos estar muy atentos al configurar correctamente nuestro servidor web para prevenir ataques en distintos niveles. La "cantidad" de seguridad necesaria para su sitio web viene determinada por muchos factores; en esta guía incluimos un enfoque conciso, pero completo, para que usted pueda hacer un despliegue —o mejora— en un sitio web que tiene como base el servidor Apache.

Actualizar Apache frecuentemente

Puede parecer un consejo algo repetido, pero en realidad es una práctica importante. A pesar de que Apache tiene mucho tiempo en el mercado y su nivel de seguridad es bastante sólido, siempre existen riesgos de que se descubran nuevos problemas cuya solución puede ser implementada en nuevas actualizaciones. También recuerde instalar las actualizaciones de su sistema operativo y del software instalado allí.

  1. Puede comprobar cuál versión de Apache tiene instalada con el siguiente comando:

    httpd -v
    

    Este primer comando funcionará para sistemas con RHEL/CentOS/Fedora. Ejecute el siguiente comando si utiliza Debian o Ubuntu:

    apache2 -v
    

    Se imprimirá algo similar a lo siguiente:

    Server version: Apache/2.2.22 (Ubuntu)
    Server built:   Jul 15 2016 15:32:46
    
  2. Para actualizar Apache a su última versión utilice los siguientes comandos de acuerdo con su sistema:

    yum update httpd
    

    Para RHEL, CentOS o Fedora.

    apt-get install apache2
    

    Para Ubuntu o Debian.

Ocultar información de la página predeterminada

Al instalar Apache y conectarse usando su navegador favorito, usted podrá observar la página predeterminada de Apache indicando que el servidor está funcionando (It works!). Pero, ¿qué ocurre si trata de visitar una dirección como sudominio.com/paginadesconocida.php? Si su configuración no es la adecuada, encontrará algo similar a lo siguiente:

Anexo 1 Información Apache

Evidentemente, esta página representa una gran brecha de seguridad. Un atacante podría saber que usted utiliza un servidor web Apache, sabría la versión exacta del mismo, el puerto sobre el cual lo está utilizando, su sistema operativo y la dirección IP del servidor. Con esta información un usuario malintencionado tendría la mesa servida para atacar su servidor.

Para evitar esto, siga los siguientes pasos:

  1. Utilice su editor de preferencia (como vi o nano) para abrir el archivo de configuración de Apache. Este archivo de configuración estará ubicado en /etc/httpd/conf/httpd.conf para sistemas RHEL, CentOS y Fedora. Si su servidor tiene un distro Ubuntu o Debian entonces este archivo estará ubicado en /etc/apache2/apache2.conf o en la ruta /etc/apache2/conf.d/security.
  2. Ubique y edite las siguientes líneas:

    • ServerSignature: este parámetro configura la información que se muestra al fondo de las páginas o documentos que son generados por el servidor. Por defecto está en on, pero para evitar que se muestre la información anterior debe cambiarlo al valor off:

      ServerSignature Off
      
    • ServerTokens: configura la cabecera de respuesta HTTP. Si asignamos el valor prod entonces solo devolverá cuál es el servidor (Apache), sin incluir la versión específica y el sistema operativo. La línea debe quedar así:

      ServerTokens Prod
      

      Con estos cambios, evitará que se muestre información que solo usted debería saber.
      Nota: si las líneas no aparecen en su archivo de configuración, puede agregarlas al final de este archivo.

  3. Finalmente, reinicie el servidor Apache. Para RHEL, CentOS, Fedora:

    service httpd restart
    

    Para Ubuntu/Debian:

    service apache2 restart
    
  4. Vuelva a intentar acceder al enlace que vimos al principio, si siguió los pasos correctamente podrá ver algo similar a:
    Anexo 2 Información Apache Eliminada
    ¡Ahora no se muestra información relevante sobre su servidor!

Lenguaje SSI y ejecución CGI

El lenguaje SSI (Server Side Include, o inclusiones del lado del servidor) es un lenguaje de scripts que se utiliza para generar páginas HTML de forma dinámica. Análogamente, la ejecución CGI (Common Gateway Interface, o Interfaz de Entrada Común) es una tecnología que define la interacción entre un cliente y un servidor, este último interactuando con generadores de contenido llamados CGI o CGI scripts. En otras palabras, es otra forma de crear contenido dinámico.

SSI representa varios riesgos potenciales de seguridad; sim embargo, hay varias formas de mejorar la seguridad de los archivos SSI aun tomando ventaja de los beneficios que ofrece.

Habilitar el uso de SSI para archivos con extensiones .html o .htm puede ser peligroso. Más aún en un entorno con alto tráfico y de intercambio de contenido. Los archivos SSI deberían tener entonces una extensión separada como .shtml. Esto ayuda a mantener la carga del servidor en un nivel mínimo y permite un manejo más simple de los riesgos.

Para aislar los daños que podría producir un archivo SSI, el administrador puede usar la opción suEXEC. Por otra parte, todos los scripts CGI se ejecutarán con el mismo usuario, por lo que tienen el potencial de tener conflictos accidentales o deliberados con otros scripts. Para evitar esto, puede permitir que los scripts sean ejecutados bajo usuarios distintos usando la opción suEXEC de la cual puede encontrar mayor información en el sitio web de Apache.

Nota: Recuerde que siempre debe confiar en la fuente de los archivos CGI que vaya a ejecutar. De ser posible, revise y entienda los scripts para descartar líneas de código maliciosas. Además debe confiar en que sus usuarios no escribirán scripts que puedan exponer su sistema a un ataque.

Si no necesitamos o usaremos archivos CGI o archivos SSI simplemente podemos deshabilitarlos en el archivo de configuración principal de Apache:

Options -Includes
Options -ExecCGI

Si queremos deshabilitar estas opciones en un directorio en específico, lo podemos hacer asignando estas opciones a una directiva Directory particular, por ejemplo:

<Directory "/var/www/html/ejemplo.com">
Options -Includes -ExecCGI
</Directory>

Nota: Cuando se configura contenido dinámico con módulos como mod_php, mod_perl o mod_python, hay muchas consideraciones de seguridad que se escapan del alcance de httpd por lo que tendrá que consultar la documentación propia de esos módulos.

Creación de directorios ServerRoot

Esta directiva indica el directorio en el cual vive su instalación de Apache. Por defecto, se encuentra ubicada en etc/apache2 o etc/httpd. En condiciones normales, Apache es iniciado por el usuario root y cambia al usuario definido en la directiva User. Si usted ha de cambiar la ubicación del ServerRoot, entonces tendrá que cambiar los permisos correspondientes a este directorio para que solo root pueda hacer cambios.

  1. Digamos que decide ubicar su directorio ServerRoot en /usr/local/apache, este directorio contendrá los subdirectorios bin, conf y logs.
  2. Se recomienda que cree dichos directorios como root usando comandos similares a los siguientes:

    mkdir /usr/local/apache 
    cd /usr/local/apache 
    mkdir bin conf logs 
    chown 0 . bin conf logs 
    chgrp 0 . bin conf logs 
    chmod 755 . bin conf logs
    
  3. Se asume que /, /usr y /usr/local son modificables únicamente por el usuario root. Cuando usted instala el ejecutable httpd, debe asegurarse de que también esté protegido:

    cp httpd /usr/local/apache/bin 
    chown 0 /usr/local/apache/bin/httpd 
    chgrp 0 /usr/local/apache/bin/httpd 
    chmod 511 /usr/local/apache/bin/httpd
    

Uso de archivos .htaccess

Otra buena práctica recomendada por Apache, es hacer que los usuarios no configuren archivos .htaccess que puedan anular o sobrescribir las características de seguridad (y otros ajustes) que ha establecido en los archivos de configuración en el servidor Apache. Puede seguir el siguiente método para lograrlo:

  1. Abra el archivo de configuración de Apache (httpd.conf o apache2.conf según su sistema) con su editor de preferencia.
  2. Agregue la siguiente directiva general:

    <Directory /> 
    AllowOverride None 
    </Directory>
    
  3. En caso de que algún directorio específico pueda ser sobrescrito por un archivo .htaccess entonces agregue la siguiente línea después de la directiva general especificada arriba:

    <Directory Un/Directorio/Específico/> 
    AllowOverride All
    </Directory>
    

Deshabilitar el acceso predeterminado en los archivos del servidor

A menos que se hagan los cambios necesarios, el servidor Apache puede encontrar la ruta a un archivo y mostrarlo a los clientes a través de las reglas de mapeo URL. Esto representa un riesgo, ya que un cliente podría tener acceso completo a su sistema de archivos (por ejemplo http://localhost/~root). Para solventar esta brecha de seguridad:

  1. Abra el archivo de configuración de Apache (tal como se explica en pasos anteriores) y agregue el siguiente bloque:

    <Directory "/">
        Require all denied
    </Directory>
    
  2. Esto prohibirá el acceso predeterminado a ubicaciones en su filesystem. Agregue bloques Directory para permitir el acceso solo en las áreas que lo desee. Por ejemplo:

    <Directory "/usr/users/*/public_html">
        Require all granted
    </Directory>
    <Directory "/usr/local/httpd">
        Require all granted
    </Directory>
    

Registro de eventos o logs de Apache

Apache provee dos archivos logs principales para el registro de eventos: el log de error y el log de acceso (access.log y error.log). En general, estos archivos estarán ubicados en la ruta /var/log/apache2 (Debian/Ubuntu), /var/log/httpd (RHEL, CentOS, Fedora). Estos son los valores predeterminados, para comprobar el nombre y la ubicación de sus archivos log:

  • El nombre y ubicación del log de error está dado por la directiva ErrorLog en el archivo de configuración de Apache.
  • El nombre y ubicación del log de acceso está dado por la directiva CustomLog en el archivo de configuración de Apache.
  • También puede comprobar la directiva LogFormat para verificar qué contenido servirán los logs.

El log de error es el registro más importante, en el cual Apache envía la información de diagnóstico y registra cualquier error que encuentre a las solicitudes de procesamiento. Este es el log principal que debemos mirar cuando ocurre un error, ya que probablemente se encuentre registrado allí. Por otro lado, los registros de acceso registran todas las solicitudes procesadas por el servidor.

Para comprobar la información generada en sus logs en tiempo real puede usar (por ejemplo):

tail -f /var/log/apache2/error.log
tail -f /var/log/httpd/error.log

Esto mostrará las últimas líneas de su log de error en tiempo real. Si en cambio quiere revisar sus logs de forma óptima sin abrirlos con un editor de texto, utilice:

less /var/log/apache2/error.log
less /var/log/httpd/error.log

Presione Enter para moverse entre las líneas del archivo. Para salir presione Ctrl + C.

Puede combinar comandos para revisar puntos particulares en sus logs, por ejemplo, digamos que quiere imprimir una lista de los últimos 5 clientes a los cuales se les denegó acceso al servidor:

grep "client denied" error_log | tail -n 5

La interpretación y solución de los problemas presentados en los archivos log se escapa del alcance de este tutorial por lo que recomendamos consultar los recursos adicionales en busca de información útil que pueda complementar lo expuesto aquí.

Recursos adicionales

Este tutorial solo presenta algunos consejos principales para comenzar a asegurar su servidor Apache. Recomendamos consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tenga en cuenta que no podemos certificar la actualidad o precisión de los contenidos externos.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...