Los pasos más importantes a seguir para hacer que un servidor Apache sea más seguro

Generalidades

Apache es el servidor web de código abierto más popular disponible para servidores Linux modernos. Ofrece una configuración flexible que permite una amplia variedad de usos, desde servir sitios HTML básicos, aplicaciones complejas de PHP/Passenger, hasta solicitudes de proxy como puerta de enlace de proxy inverso. Dada su popularidad y facilidad de uso, es fundamental instalar y mantener un entorno seguro para las instalaciones de Apache.

Este artículo asume que has instalado y configurado Apache en una instancia de Debian o Ubuntu:

Este artículo solo aplica para servidores dedicados con un usuario administrador o DreamCompute ya que solo estos planes permiten privilegios de sudo.

Mantén Apache actualizado

Apache tiene un buen historial de seguridad y rara vez se encuentran errores de seguridad dentro del propio servidor web. Aún así, es importante mantener Apache actualizado para aprovechar las últimas funciones de seguridad, estabilidad y características disponibles. En general, esto es simplemente una cuestión de mantener actualizado el paquete Apache proporcionado por el sistema operativo de la distribución (por ejemplo, a través de apt, yum, etc). También se recomienda que los operadores del servidor Apache sigan la lista de correos de anuncios de servidor Apache para mantenerse al día con las últimas noticias del equipo de desarrollo de Apache. Puedes suscribirte a la lista aquí:

Asegurar las configuraciones

Apache está construido para ser estable y seguro, pero solo será tan seguro como el usuario que lo configure. Una vez que se crea e instala Apache, es importante configurar el servidor para que sea lo más mínimo posible.

Ejecutar con un usuario sin privilegios

En seguridad, el principio de privilegio mínimo establece que a una entidad no se le debe dar más permiso del necesario para lograr sus objetivos dentro de un sistema dado. En el contexto de tu servidor web, esto significa bloquear Apache para que se ejecute solo con los permisos necesarios para ejecutar. Un primer paso en este proceso es configurar Apache para que se ejecute como un usuario del sistema sin privilegios (por ejemplo, no root). Esto se hace al configurar las variables APACHE_RUN_USER y APACHE_RUN_GROUP en el archivo /etc/apache2/envvars:

Edita el archivo y cambia las siguientes líneas:

[user@instance]$ sudo vim /etc/apache2/envvars
# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=apache
export APACHE_RUN_GROUP=apache

Los servidores Apache distribuidos como un paquete de sistema operativo común también pueden usar un nombre de usuario y grupo como www-data o nobody. Independientemente de la elección del nombre de usuario, asegúrese de que la selección de usuario/grupo tenga los menos derechos necesarios para ejecutarse correctamente.

Deshabilitar ServerTokens

La especificación HTTP recomienda (pero no requiere) que los servidores web se identifiquen mediante el encabezado del Server. Históricamente, los servidores web han incluido su información de versión como parte de este encabezado. La divulgación de la versión de Apache en ejecución puede ser indeseable, especialmente en entornos sensibles a la divulgación de información. Configura Apache para que no muestre su versión en el encabezado del Server editando el siguiente archivo:

[user@instance]$ sudo vim /etc/apache2/conf-available/security.conf

En ese archivo verás varios 'ServerTokens'. Asegúrate de que estén todos comentados y que solo aparezca ProductOnly.

#ServerTokens 
#ServerTokens Minimal
#ServerTokens OS
#ServerTokens Full
ServerTokens ProductOnly;

Reinicia Apache para actualizar los cambios.

[user@instance]$ sudo service apache2 reload

Deshabilitar los archivos .htaccess

Los archivos .htaccess son una característica poderosa que permite a Apache extender su configuración fuera de su archivo de configuración principal. Si bien esto puede ser conveniente, presenta un riesgo de seguridad, ya que Apache leerá cualquier archivo .htaccess en su ruta — incluso los colocados por un atacante que podrían comprometer el servidor. Puede ser conveniente bloquear la configuración de Apache desactivando los archivos .htaccess por completo. Esto se puede hacer al editar la directiva AllowOverride en el archivo /etc/apache2/apache2.conf:

[user@instance]$ sudo vim /etc/apache2/apache2.conf
AllowOverride None

Además, el control detallado de qué directivas de Apache se pueden usar dentro de los archivos .htaccess también puede ser controlado por AllowOverride:

AllowOverride AuthConfig Indexes

En el ejemplo anterior, todas las directivas que no están ni en el grupo AuthConfig ni en los índices provocan un error interno del servidor. Visita el siguiente sitio para obtener más detalles:

Restringir acceso por IP

Las áreas sensibles de los sitios web, como los paneles de control de administración, deben tener controles de acceso estrictos. Apache hace que sea fácil incluir en la lista blanca el acceso IP a ciertas ubicaciones de tu sitio web y denegar el tráfico a todas las demás direcciones IP. Puedes agregar lo siguiente a tu archivo /etc/apache2/apache2.conf.

<Directory /PATH/TO/WEBDIR/wp-admin>
    # allow access from one IP and an additional IP range,
    # and block everything else
    Require ip 1.2.3.4
    Require ip 192.168.0.0/24
</Directory>

En este ejemplo, el uso de la directiva Require le indica a Apache que permita el acceso a la ruta especificada si las solicitudes provienen de cualquiera de las direcciones IP enumeradas y que denegue el resto del tráfico.

Restringir acceso por Contraseña

El acceso a determinadas ubicaciones también se puede configurar mediante credenciales basadas en contraseña, utilizando la utilidad htpasswd. Consulta el siguiente artículo para obtener más detalles:

Prevenir ataques DoS

El modelo predeterminado en el que Apache procesa las solicitudes (llamado modo prefork) está sujeto a un ataque conocido como un ataque Slowloris. Un ataque Slowloris es una forma de ataque DoS (Denegación de servicio) en el que el servidor Apache se ve obligado a esperar solicitudes de clientes maliciosos que tardan mucho en enviar tráfico, lo que obliga a que las solicitudes legítimas caduquen o se ignoren por completo. Afortunadamente, los servidores Apache modernos son capaces de mitigar esta amenaza con algunas directivas de configuración adicionales.

Habilitar mod_reqtimeout

mod_reqtimeout es un módulo de Apache diseñado para cerrar las conexiones de los clientes que tardan demasiado en enviar su solicitud, como se ve en un ataque de Slowloris. Este módulo proporciona una directiva que permite a Apache cerrar la conexión si detecta que el cliente no está enviando datos con la suficiente rapidez. Por ejemplo, agrégale esto a tu archivo /etc/apache2/apache2.conf:

RequestReadTimeout header=10-20,MinRate=500 body=20,MinRate=500

En este ejemplo, Apache cerrará la conexión si el cliente tarda más de 10 segundos en enviar sus encabezados HTTP, o si el cliente tarda más de 20 segundos en enviar encabezados a una velocidad de 500 bytes por segundo.

Apache también cerrará la conexión si el cliente tarda más de 20 segundos en enviar el cuerpo de su solicitud, pero permitirá que la solicitud continúe siempre que el cliente envíe más de 500 bytes por segundo.

Esta configuración permite a los clientes con mala calidad de conexión TCP (como clientes remotos con alta latencia, o aquellos en redes celulares o satelitales de baja calidad) enviar solicitudes, mientras sigues protegiendo contra huellas digitales conocidas del ataque Slowloris. Las configuraciones de RequestReadTimeout pueden ser complejas, por lo que se recomienda que revises más información sobre esta directiva en la página de documentación del módulo.

Asegurar SSL/TLS

Asegúrate de que todos los sitios de tu servidor tengan instalado un certificado SSL. Puedes instalar un certificado gratuito 'Let's Encrypt' siguiendo las siguientes instrucciones:

Forzar todas las conecciones a través de TLS

Si has instalado un certificado 'Let's Encrypt' como se muestra arriba, ya tuviste la opción de forzar todo el tráfico a través de SSL. Si no estás utilizando un certificado 'Let's Encrypt', también puedes hacerlo agregando lo siguiente al archivo de configuración de ru sitio ubicado en /etc/apache2/sites-available/example.com.conf.

Primero, asegúrate de que el módulo de headers esté activo.

[user@instance]$ sudo a2enmod headers
[user@instance]$ sudo service apache2 restart

Luego puedes agregar lo siguiente al archivo .conf de tu sitio .

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</IfModule>

Para todas las conexiones de texto sin formato, configura Apache para enviar un redireccionamiento 301 para solicitudes a la versión TLS del sitio:

<VirtualHost 192.168.1.1:80>
    [...]
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

Medidas adicionales de seguridad

Más allá de los conceptos básicos de instalar un Apache seguro binario, bloquear el acceso a áreas sensibles de tu sitio y brindar un servicio adecuado a las conexiones TLS, existen algunos pasos adicionales que el usuario consciente de la seguridad adicional puede tomar:

Instala un WAF

Un WAF (firewall de aplicaciones web) es un software diseñado para inspeccionar el tráfico HTTP/HTTPS, rechazar solicitudes maliciosas y en general, actuar como una capa adicional de seguridad en un stack web HTTP. Un WAF configurado correctamente puede proteger tu sitio de ataques SQLi, XSS, CSRF y DDoS, además de proporcionar mitigación de ataques de fuerza bruta y parches de amenazas de día cero. El WAF más popular y estable para Apache es ModSecurity. Ve la página de GitHub de proyectos para más información sobre instalaciones y configuraciones.

Análisis y supervisión de registros automatizados

Los programas como Fail2Ban se pueden utilizar para monitorear el acceso de Apache y los registros de errores, buscando patrones de ataque y tomando acciones contra el cliente atacante (como eliminar direcciones IP, reportar comportamiento malicioso al propietario de la IP, etc.). Fail2Ban es extensible, lo que permite la creación de patrones de búsqueda y comportamientos de respuesta únicos. Para obtener más información y detalles sobre la instalación y configuración, consult la página de GitHub del proyecto:

Limitar el tráfico de entrada a través de IPTables

Más allá de proteger el propio Apache, es importante proteger el entorno de host utilizado para alojar el servidor web. Bloquear el acceso a cosas como SSH puede aumentar en gran medida la seguridad del host al evitar intentos de intrusión. Un enfoque común es incluir en la lista blanca las IP conocidas que accederán al host a través de SSH y denegar el resto del tráfico del puerto 22, o utilizar un cuadro de salto que filtre estrictamente el acceso al shell. También puedes hacer esto configurando un grupo de seguridad personalizado para tu instancia. Consulta el siguiente artículo para obtener más información:

 

¿Este artículo ha respondido sus preguntas?

Última actualización el PST.

¿Aún no encuentra lo que busca?