Inicio > Apache, Linux, Seguridad > Instalar un Servidor Web Seguro (Linux + Apache + PHP + Joomla + Tomcat/JBOSS) : P3 – Securizando Apache.

Instalar un Servidor Web Seguro (Linux + Apache + PHP + Joomla + Tomcat/JBOSS) : P3 – Securizando Apache.

jueves, 23 de junio de 2011 Dejar un comentario Ir a comentarios

Hoy vamos a empezar securizando, o al menos intentar convertirlo en algo más seguro, a nuestro tan querido y aclamado servidor HTTP Apache,. Quizás el escritorio se le resista al pinguino, pero donde si puede sacar pecho y estar orgullo es el la parte de los servidores.

Como punto de partida vamos a tratar de evitar el que ofrezca mucha información a los amigos de lo ajeno. Aunque resulta complicado el ocultar su identidad, hemos de intentar ofuscar información que pueda ayudar a los atacantes.

– Empezamos por redirigir los errores a la pagina inicial de nuestro site, evitando así mostrar información no deseada.

ErrorDocument 403 /inicio/
ErrorDocument 404 /inicio/

– Evitar que nuestro servidor revele información relativa a su versión modificando los siguientes parámetros :

#vi /etc/apache2/apache2.conf

ServerTokens Prod: Eliminar información relativa a la versión del Apache.
ServerSignature Off: Evitar el envio de información sobre la versión del servidor en las páginas de error.
ErrorDocument numError errores/paginaError.html: Esta directiva permite cambiar las páginas de respuesta de errores.

Limitar el tamaño del BODY para que los usuarios suban ficheros con mucho peso. (¿verdad que suena a frase veraniega?)

LimitRequestBody 512000

Limitar el número de campos que puede tener una petición en el HEADER

LimitRequestFields 50
LimitRequestFieldSize 8190
LimitRequestLine 8190

Debemos comprobar la presencia de estos mismo parámetros en  los sites activos evitando que los valores por defecto sean sobreescritos.

#ls /etc/apache2/sites-enabled/*.

Desactivar HTTP TRACE y TRACK en los VirtualHost que tengamos definidos

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* – [F]

Es interesante saber los módulos que se han cargado y comprobar si son todos necesarios

#apache2 -l

Compiled in modules:
core.c
mod_log_config.c
mod_logio.c
prefork.c
http_core.c
mod_so.c

Si el apache ha sido instalado a través de sus fuentes, ver las opciones utilizadas en su compilación.

#apache2 -V

Tal y como hemos comentado anteriormente solo debemos cargar lo que vayamos realmente a necesitar.

Activamos el modulo ‘mod_rewrite’ (reescribir peticiones) y reiniciamos el servicio:

#a2enmod rewrite
#/etc/init.d/apache2 restart

Bloquear la descarga de todos los archivos que comiencen con .ht :

AccessFileName .httpdoverride

<Files ~ “^\.ht”>
Order allow,deny
Deny from all
Satisfy All
</Files>

Desactivar el uso de FollowSymLinks evitando asi que los usuarios puedan crear  enlaces simbólicos hacia directorios que no deseamos que estén expuestos – Options None.

Si lo deseamos podemos desactivar únicamente algunas opciones (All, None,ExecCGI,Indexes,Includes,IncludesNOEXEC, FollowSymLinks…).

Indicar al Apache en que IPs queremos que escuche.

#vi /etc/apache2/ports.conf
Listen ip_maquina:80

Empezar a protegernos un poco de los ataques de denegación de servicio (DOS).

#vi /etc/apache2/apache2.conf

Timeout 300
KeepAliveTimeout 15
MaxKeepAliveRequests 100

Ahora deberemos instalar el modulo mod_evasive.

#apt-get install libapache2-mod-evasive

Generamos un fichero de configuración dentro de conf.d

#vi /etc/apache2/conf.d/mod_evasive.conf

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>

Otro de los módulos que no debemos de perdernos es mod_security (Firewall a nivel de aplicación).

Vamos a proceder a instalarlo y realizar una instalación básica.

#apt-cache search mod_security
#libapache-mod-security – Tighten web applications security for Apache
#mod-security-common – Tighten web applications security – common files

También me descargo todas las reglas de la pagina mod_security.

Generamos el directorio donde vamos a almacenar las reglas:

#mkdir /etc/apache2/modsecurity2

Y las descomprimimos en el directorio previamente generado.

Generamos un fichero de configuración para el modulo.

#vi /etc/apache2/conf.d/mod_security.conf

Un ejemplo básico podría ser:

<IfModule mod_security2.c>

# Basic configuration options
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess Off

# Handling of file uploads
# TODO Choose a folder private to Apache.
# SecUploadDir /opt/apache-frontend/tmp/
SecUploadKeepFiles Off

# Debug log
SecDebugLog /var/log/apache2/modsec_debug.log
SecDebugLogLevel 0

# Serial audit log
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus ^5
SecAuditLogParts ABIFHZ
SecAuditLogType Serial
SecAuditLog /var/log/apache2/modsec_audit.log

# Maximum request body size we will
# accept for buffering
SecRequestBodyLimit 131072

# Store up to 128 KB in memory
SecRequestBodyInMemoryLimit 131072

# Buffer response bodies of up to
# 512 KB in length
SecResponseBodyLimit 524288

</IfModule>

#mkdir /etc/apache2/modsecurity2
#chmod 600 /etc/apache2/modsecurity2

En este directorio que hemos generado, copiamos las reglas que anteriormente nos hemos descargado y procedemos a activar el módulo

#a2enmod mod-security

Y si no queremos realizar cambios en las rutas generamos un enlace simbólico.

ln -s /var/log/apache2 /etc/apache2/logs

Ya solo nos quedaría reiniciar el servicio del Apache.

#/etc/init.d/apache2 restart

Para comprobar si está funcionando, añadimos la siguiente regla:

SecRule ARGS «\.\./» «t:normalisePathWin,id:99999,severity:4,msg:’Acceso Disco'»

Y realizamos una llamada a la siguiente Url para comprobar que nos pinta algo en el log.

http://www.xxxx.com/?abc=../../

A partir de aquí jugamos con la configuración hasta dejarla como deseemos.

Para comprobar que es lo que está pasando deberemos comprobar nuestros logs.

# vi /var/log/apache2/modsec_audit.log

Cuidadín con no bloquear tráfico legítimo. Se trata de un módulo muy potente, pero como muy bien se comenta la potencia sin control puede terminar no siendo buena consejera.

Otro dato a tener en cuenta y que ya hemos comentado, es que Apache se encuentra programado con funciones residentes en módulos independientes al core de la aplicación, lo que nos permite activar únicamente aquellas características que vamos a utilizar para minimizar riesgos.

Para desactivar módulos:

#a2dismod alias
#a2dismod auth_basic
#a2dismod authn_file
#a2dismod authz_default
#a2dismod authz_groupfile
#a2dismod authz_host
#a2dismod authz_user
#a2dismod autoindex
#a2dismod cgi
#a2dismod dir
#a2dismod env
#a2dismod mime
#a2dismod negotiation
#a2dismod php5
#a2dismod rewrite
#a2dismod setenvif
#a2dismod ssl
#a2dismod status

Activar algunos módulos:

# Default page (e.g. index.html)
#a2enmod dir
#a2enmod mime
# Language preference
#a2enmod negotiation
#a2enmod php5
#a2enmod rewrite
# Workarounds for certain browser bugs
#a2enmod setenvif
# Allows access rules based on hosts (allow from…)
#a2enmod authz_host
#a2enmod authn_file
#a2dismod auth_basic
#a2dismod authz_default
#a2dismod authz_user

Como alguna vez ya se ha comentado no es una buena política de seguridad el activar todo por defecto. Debemos ser conscientes de cuales son los servicios necesarios. Aquí volvemos a decir aquello «de mejor prevenir que curar». A pesar de tener que dedicarle algo mas de tiempo al principio, nos puede ayudar a evitar algún disgustillo que otro.

Generalmente vamos a usar apache2-mpm-prefork, y una configuración podría ser la siguiente:

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>

Debemos proteger aquellos archivos en los que se almacene información sensible o aquellos que utilicemos para tareas administrativas. Para ello podemos usar el famoso .htaccess para forzar que a que cuando se quiera acceder a ellos nos obligue a introducir un usuario / pass. Aunque sabemos que no es la panacea, ya que si la Web tiene alguna vulnerabilidad este archivo podría ser recuperado y descifrada la contraseña.

Para generar la pareja user / pass podemos hacer uso de la consola, o por comodidad hacer uso de alguna web para que esta nos la genere por nosotros.

Un ejemplo de configuración:

<Directory /var/www/nuestra_pagina/admin>

Allow from 10.XXX.1 10.XXX.XXX.
AuthUserFile /etc/apache2/passw/.vhtlpasswd
AuthName «Acceso restringido»
AuthType Basic
Require valid-user
require user adm
order deny,allow
deny from all
</Directory>

<Files .htaccess>
order allow,deny
deny from all
</Files>

Para enlaces que manejen información sensible deberiamos de instalar el soporte SSL y hacer uso de los certificados, que nos van a ayudar a identificar nuestra Web como propia, asi como permitir que la información viaje «en principio» a través de un canal seguro .

Restringir los comandos disponibles a GET, POST y HEAD, añadiendo esto dentro de las opciones de mod_rewrite:

#vi /etc/apache2/conf.d/mod_rewrite.conf

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond % {REQUEST_METHOD}!^(GET|POST|HEAD)$
RewriteRule .* â [F]
</IfModule>

Si vamos a introducir aplicaciones que puedan comprometer la seguridad de nuestro servidor, debemos de estar seguros de que estas no estén accesibles desde el exterior. Para ello podemos utilizar las directivas:

order allow, deny

Allow from XX.XX.XX.XX

deny from all

Para comprobar que no nos hemos confundido en la sintaxis y que la configuración esta OK

#apache –t

Y por último reiniciamos el servicio del Apache.

#/etc/init.d/apache2 restart

La verdad es que no se cuantos errores habré cometido en este artículo, pero el señor del mazo….

Nos vemos en la próxima!!

Enviar a un amigo: Share this page via Email
Categories: Apache, Linux, Seguridad Tags:
  1. elfozi
    viernes, 9 de noviembre de 2012 a las 17:26 | #1

    Opaa me fue de mucha utilidad gracias!!!

  2. luis
    lunes, 22 de abril de 2013 a las 22:34 | #2

    un consulta, soy nuevo en esto y he instalado apache 2.22.22 y en este no me salen los valores para setearlos, por ejemplo no me sale ServerTokens ni ninguno de los nombrados mas abajo, entonces mi pregunta es, si este tutorial es para una version en específica de apache o, hay que agregar las variables y sus valores,,,

    Gracias y saludos

  1. Sin trackbacks aún.

*