13 Consejos de seguridad y refuerzo del servidor web Apache


Todos estamos muy familiarizados con el servidor web Apache, es un servidor web muy popular para alojar sus archivos web o su sitio web en la web. Aquí hay algunos enlaces que pueden ayudarlo a configurar el servidor web Apache en su equipo Linux.

  1. Install Apache Web Server
  2. Setup Your Website in Your Linux Box

Aquí, en este tutorial, cubriré algunos consejos principales para proteger su servidor web. Antes de aplicar estos cambios en su servidor web, debe tener algunos conceptos básicos del servidor Apache.

  1. Document root Directory: /var/www/html or /var/www
  2. Main Configuration file: /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora) and /etc/apache2/apache2.conf (Debian/Ubuntu).
  3. Default HTTP Port: 80 TCP
  4. Default HTTPS Port: 443 TCP
  5. Test your Configuration file settings and syntax: httpd -t
  6. Access Log files of Web Server: /var/log/httpd/access_log
  7. Error Log files of Web Server: /var/log/httpd/error_log

1. Cómo ocultar la versión de Apache y la identidad del sistema operativo de los errores

Cuando instala Apache con la fuente o cualquier otro instalador de paquetes como yum, muestra la versión de su servidor web Apache instalado en su servidor con el nombre del sistema operativo de su servidor en Errores. También muestra la información sobre los módulos Apache instalados en su servidor.

En la imagen de arriba, puede ver que Apache muestra su versión con el sistema operativo instalado en su servidor. Esto puede ser una gran amenaza para la seguridad de su servidor web y también de su sistema Linux. Para evitar que Apache no muestre esta información al mundo, necesitamos realizar algunos cambios en el archivo de configuración principal de Apache.

Abra el archivo de configuración con el editor vim y busque "ServerSignature", que está activado por defecto. Necesitamos desactivar esta firma del servidor y la segunda línea "ServerTokens Prod" le dice a Apache que devuelva solo Apache como producto en el encabezado de respuesta del servidor en cada solicitud de página. Suprime la información del sistema operativo, la versión principal y la secundaria.

# vim /etc/httpd/conf/httpd.conf (RHEL/CentOS/Fedora)
# vim /etc/apache2/apache2.conf (Debian/Ubuntu)
ServerSignature Off
ServerTokens Prod
# service httpd restart (RHEL/CentOS/Fedora)
# service apache2 restart (Debian/Ubuntu)

2. Deshabilitar la lista de directorios

Por defecto, Apache enumera todo el contenido del directorio raíz del documento en ausencia de un archivo de índice. Consulte la imagen a continuación.

Podemos desactivar la lista de directorios usando la directiva Opciones en el archivo de configuración para un directorio específico. Para eso, necesitamos hacer una entrada en el archivo httpd.conf o apache2.conf.

<Directory /var/www/html>
    Options -Indexes
</Directory>

3. Siga actualizando Apache con regularidad

La comunidad de desarrolladores de Apache trabaja continuamente en problemas de seguridad y lanza su versión actualizada con nuevas opciones de seguridad. Por lo tanto, siempre se recomienda utilizar la última versión de Apache como servidor web.

Para verificar la versión de Apache: Puede verificar su versión actual con el comando httpd -v.

# httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Aug 13 2013 17:29:28

Puede actualizar su versión con el siguiente comando.

# yum update httpd
# apt-get install apache2

También se recomienda mantener su Kernel y SO actualizados a las últimas versiones estables si no está ejecutando ninguna aplicación específica que funcione solo en SO o Kernel específicos.

4. Deshabilite los módulos innecesarios

Siempre es bueno reducir las posibilidades de ser víctima de un ataque web. Por lo tanto, se recomienda desactivar todos los módulos que no están en uso actualmente. Puede enumerar todos los módulos compilados del servidor web, usando el siguiente comando.

# grep LoadModule /etc/httpd/conf/httpd.conf

# have to place corresponding `LoadModule' lines at this location so the
# LoadModule foo_module modules/mod_foo.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
....

Arriba está la lista de módulos que están habilitados por defecto pero que a menudo no son necesarios: mod_imap, mod_include, mod_info, mod_userdir, mod_autoindex. Para deshabilitar el módulo en particular, puede insertar un "#" al principio de esa línea y reiniciar el servicio.

5. Ejecute Apache como usuario y grupo independientes

Con una instalación predeterminada, Apache ejecuta su proceso con el usuario nadie o demonio. Por razones de seguridad, se recomienda ejecutar Apache en su propia cuenta sin privilegios. Por ejemplo: http-web.

# groupadd http-web
# useradd -d /var/www/ -g http-web -s /bin/nologin http-web

Ahora necesita decirle a Apache que se ejecute con este nuevo usuario y, para hacerlo, necesitamos hacer una entrada en /etc/httpd/conf/httpd.conf y reiniciar el servicio.

Abra /etc/httpd/conf/httpd.conf con el editor de vim y busque la palabra clave "Usuario" y "Grupo" y allí deberá especificar el nombre de usuario y el nombre de grupo a utilizar.

User http-web
Group http-web

6. Utilice Permitir y Denegar para restringir el acceso a los directorios.

Podemos restringir el acceso a directorios con las opciones "Permitir" y "Denegar" en el archivo httpd.conf. Aquí, en este ejemplo, aseguraremos el directorio raíz, para eso, configuraremos lo siguiente en el archivo httpd.conf.

<Directory />
   Options None
   Order deny,allow
   Deny from all
</Directory>
  1. Options “None” – This option will not allow users to enable any optional features.
  2. Order deny, allow – This is the order in which the “Deny” and “Allow” directives will be processed. Here it will “deny” first and “allow” next.
  3. Deny from all – This will deny request from everybody to the root directory, nobody will be able to access root directory.

7. Utilice los módulos mod_security y mod_evasive para proteger Apache

Estos dos módulos “mod_security” y “mod_evasive” son módulos muy populares de Apache en términos de seguridad.

Donde mod_security funciona como un firewall para nuestras aplicaciones web y nos permite monitorear el tráfico en tiempo real. También nos ayuda a proteger nuestros sitios web o servidor web de ataques de fuerza bruta. Simplemente puede instalar mod_security en su servidor con la ayuda de sus instaladores de paquetes predeterminados.

$ sudo apt-get install libapache2-modsecurity
$ sudo a2enmod mod-security
$ sudo /etc/init.d/apache2 force-reload
# yum install mod_security
# /etc/init.d/httpd restart

mod_evasive funciona de manera muy eficiente, solo se necesita una solicitud para procesarla y la procesa muy bien. Evita que los ataques DDOS hagan tanto daño. Esta característica de mod_evasive le permite manejar la fuerza bruta HTTP y el ataque Dos o DDos. Este módulo detecta ataques con tres métodos.

  1. If so many requests come to a same page in a few times per second.
  2. If any child process trying to make more than 50 concurrent requests.
  3. If any IP still trying to make new requests when its temporarily blacklisted.

mod_evasive se puede instalar directamente desde la fuente. Aquí, tenemos una guía de instalación y configuración de estos módulos que lo ayudará a configurar estos módulos de Apache en su caja de Linux.

  1. Protect Apache using Mod_Security and Mod_evasive

8. Desactive el seguimiento de enlaces simbólicos de Apache

De forma predeterminada, Apache sigue enlaces simbólicos, podemos desactivar esta función con la directiva FollowSymLinks with Options. Y para ello necesitamos realizar la siguiente entrada en el archivo de configuración principal.

Options -FollowSymLinks

Y, si algún usuario o sitio web en particular necesita habilitar FollowSymLinks, simplemente podemos escribir una regla en el archivo ".htaccess" de ese sitio web.

# Enable symbolic links
Options +FollowSymLinks

Nota: Para habilitar las reglas de reescritura dentro del archivo ".htaccess", "AllowOverride All" debe estar presente en la configuración principal globalmente.

9. Desactive las inclusiones del lado del servidor y la ejecución CGI

Podemos desactivar las inclusiones del lado del servidor (mod_include) y la ejecución de CGI si no es necesario y para hacerlo necesitamos modificar el archivo de configuración principal.

Options -Includes
Options -ExecCGI

También podemos hacer esto para un directorio en particular con la etiqueta Directory. Aquí En este ejemplo, estamos desactivando las ejecuciones de archivos Include y Cgi para el directorio “/ var/www/html/web1”.

<Directory "/var/www/html/web1">
Options -Includes -ExecCGI
</Directory>

Aquí hay algunos otros valores que se pueden activar o desactivar con la directiva Opciones.

  1. Options All – To enable All options at once. This is the default value, If you don’t want specify any values explicitly in Apache conf file or .htaccess.
  2. Options IncludesNOEXEC – This option allows server side includes without the execute permission to a command or cgi files.
  3. Options MultiViews – Allows content negotiated multiviews with mod_negotiation module.
  4. Options SymLinksIfOwnerMatch – It’s similar to FollowSymLinks. But, this will follow only when the owner is the same between the link and the original directory to which it is linked.

10. Limitar el tamaño de la solicitud

De forma predeterminada, Apache no tiene límite en el tamaño total de la solicitud HTTP, es decir, ilimitada y cuando permite solicitudes grandes en un servidor web, es posible que pueda ser víctima de ataques de denegación de servicio. Podemos limitar el tamaño de las solicitudes de una directiva de Apache "LimitRequestBody" con la etiqueta de directorio.

Puede establecer el valor en bytes de 0 (ilimitado) a 2147483647 (2 GB) que están permitidos en el cuerpo de una solicitud. Puede establecer este límite de acuerdo con las necesidades de su sitio. Suponga que tiene un sitio en el que permite cargas y desea limitar el tamaño de carga para un directorio en particular.

Aquí, en este ejemplo, user_uploads es un directorio que contiene archivos cargados por los usuarios. Estamos poniendo un límite de 500K para esto.

<Directory "/var/www/myweb1/user_uploads">
   LimitRequestBody 512000
</Directory>

11. Proteger los ataques DDOS y el endurecimiento

Bueno, es cierto que no puede proteger completamente su sitio web de los ataques DDos. Aquí hay algunas directivas que pueden ayudarlo a controlarlo.

  1. TimeOut : This directive allows you to set the amount of time the server will wait for certain events to complete before it fails. Its default value is 300 secs. It’s good to keep this value low on those sites which are subject to DDOS attacks. This value totally depends on kind of request you are getting on your website. Note: It could pose problems with come CGI scripts.
  2. MaxClients : This directive allows you to set the limit on connections that will be served simultaneously. Every new connection will be queued up after this limit. It is available with Prefork and Worker both MPM. The default value of it is 256.
  3. KeepAliveTimeout : Its the amount of time the server will wait for a subsequent request before closing the connection. Default value is 5 secs.
  4. LimitRequestFields : It helps us to set a limit on the number of HTTP request’s header fields that will be accepted from the clients. Its default value is 100. It is recommended to lower this value if DDos attacks are occurring as a result of so many http request headers.
  5. LimitRequestFieldSize : It helps us to set a size limit on the HTTP Request header.

12. Habilite Apache Logging

Apache le permite iniciar sesión independientemente del registro de su sistema operativo. Es aconsejable habilitar el registro de Apache, ya que proporciona más información, como los comandos introducidos por los usuarios que han interactuado con su servidor web.

Para hacerlo, debe incluir el módulo mod_log_config. Hay tres directivas principales relacionadas con el registro disponibles con Apache.

  1. TransferLog: Creating a log file.
  2. LogFormat : Specifying a custom format.
  3. CustomLog : Creating and formatting a log file.

También puede usarlos para un sitio web en particular si está haciendo alojamiento virtual y para eso debe especificarlo en la sección de host virtual. Por ejemplo, aquí está la configuración de host virtual de mi sitio web con el registro habilitado.

<VirtualHost *:80>
DocumentRoot /var/www/html/example.com/
ServerName www.example.com
DirectoryIndex index.htm index.html index.php
ServerAlias example.com
ErrorDocument 404 /story.php
ErrorLog /var/log/httpd/example.com_error_log
CustomLog /var/log/httpd/example.com_access_log combined
</VirtualHost>

13. Protección de Apache con certificados SSL

Por último, pero no menos importante, los certificados SSL, puede proteger todas sus comunicaciones de forma cifrada a través de Internet con un certificado SSL. Suponga que tiene un sitio web en el que las personas inician sesión probando sus credenciales de inicio de sesión o tiene un sitio web de comercio electrónico donde las personas proporcionan sus datos bancarios o detalles de tarjetas de débito/crédito para comprar productos; de forma predeterminada, su servidor web envía estos detalles en texto sin formato formato, pero cuando utiliza certificados SSL en sus sitios web, Apache envía toda esta información en texto cifrado.

Puede comprar certificados SSl de tantos proveedores SSL diferentes como namecheap.com. Si tiene una empresa web muy pequeña y no está dispuesto a comprar un certificado SSL, puede asignar un certificado autofirmado a su sitio web. Apache usa el módulo mod_ssl para admitir el certificado SSL.

# openssl genrsa -des3 -out example.com.key 1024
# openssl req -new -key example.com.key -out exmaple.csr
# openssl x509 -req -days 365 -in example.com.com.csr -signkey example.com.com.key -out example.com.com.crt

Una vez que se haya creado y firmado su certificado. Ahora necesita agregar esto en la configuración de Apache. Abra el archivo de configuración principal con vim editor y agregue las siguientes líneas y reinicie el servicio.

<VirtualHost 172.16.25.125:443>
        SSLEngine on
        SSLCertificateFile /etc/pki/tls/certs/example.com.crt
        SSLCertificateKeyFile /etc/pki/tls/certs/example.com.key
        SSLCertificateChainFile /etc/pki/tls/certs/sf_bundle.crt
        ServerAdmin ravi.[email protected]
        ServerName example.com
        DocumentRoot /var/www/html/example/
        ErrorLog /var/log/httpd/example.com-error_log
        CustomLog /var/log/httpd/example.com-access_log common
</VirtualHost>

Abra su navegador, escriba https://example.com y podrá ver el nuevo certificado autofirmado.

Estos son algunos consejos de seguridad que puede utilizar para proteger la instalación de su servidor web Apache. Para obtener más sugerencias e ideas de seguridad útiles, consulte la documentación oficial en línea de Apache HTTP Server.