Securitización de apache
Securitización de apache

Securitización de apache

Apache es el día de hoy uno de los mas populares servidores web, segun las ultimas mediciones alrededor del 50% de las páginas web son servidas por Apache, se encuentra como servidor por defecto en la mayoria de las distribuciones de Linux y es facil de instalar y poner en funcionamiento, por defecto, instala y activa una serie de modulos que no necesariamente utilizaremos y que podrian poner a nuestro sistema en riesgo de ataques.

Aca hay una pequeña guia que nos indica como instalar y configurar varios modulos de Apache, para aumentar la seguridad y disponibilidad de nuestra maquina, por supuesto se deben hacer muchas configuraciones adicionales para aumentar la seguridad y obviamente siempre debemos revisar nuestro código para eliminar potenciales amenzas (Inyeccion SQL, Subida de archivos peligrosos al servidor, etc.).

 

Las configuraciones propuestas fuerón realizadas sobre la ultima versión de Apache de Ubuntu 12.04 LTS (30-03-2016).

Estando como un usuario con privilegios administrativos, realizar los siguientes pasos, para la instalación de los módulos que ayudarán a aumentar la seguridad de Apache 2.x.

Deshabilitar y habilitar módulos de Apache.

Los módulos mínimos para correr apache en mi caso son:

core_module (static)

log_config_module (static)

logio_module (static)

mpm_prefork_module (static)

http_module (static)

so_module (static)

authz_host_module (shared)

deflate_module (shared)

dir_module (shared)

env_module (shared)

mime_module (shared)

negotiation_module (shared)

reqtimeout_module (shared)

setenvif_module (shared)

rewrite_module (shared) / esté en la mayoría de los casos es necesario para esconder valores en las url.

php5_module (shared) / Este es necesario para poder ejecutar los sitios desarrollados por Inpact.

Estos los instalaremos y configuraremos posteriormente (todos relacionados con seguridad).

evasive20_module (shared)

spamhaus_module (shared)

qos_module (shared)

Para habilitar módulos usaremos el comando a2enmod <nombre módulo>, para deshabilitarlos a2dismod <nombre módulo>, para ello no se debe incluir “_module”, por ejemplo,

a2enmod rewrite

a2dismod autoindex

Modulo evasive, permite evitar ataques DDOS

Instalamos con

Apt-get -y install libapache2-mod-evasive

Creamos la carpeta para los logs y le damos permiso al usuario que ejecuta apache

mkdir /var/log/apache/evasive

chown -R www-data:www-data /var/log/apache/evasive

Editamos el archivo de configuración del módulo, en mi caso particular, agregue la configuración en el mismo archivo que carga el módulo (/etc/apache2/mods-available/mod-evasive.load).

DOSHashTableSize 2048

DOSPageCount 20

DOSSiteCount 300

DOSPageInterval 1.0

DOSSiteInterval 1.0

DOSBlockingPeriod 10.0

DOSLogDir “/var/log/apache2/evasive”

DOSEmailNotify xxxxx@xxxx.xxx

Módulo Spamhaus, prevenir ataques de inyección dns

sudo apt-get -y install libapache2-mod-spamhaus

Creamos el archivo de lista blanca, en el cual agregaremos url y direcciones IP que no queremos que el módulo identifique como atacantes.

touch /etc/spamhaus.wl

Luego configuramos el módulo editando el archivo de configuración de este (/etc/apache2/mods-available/mod-spamhaus.conf).

<IfModule mod_spamhaus.c>

#MS_Methods

#    Syntax:  MS_Methods POST,PUT,OPTIONS

#    Default: POST,PUT,OPTIONS

#

#    The values admitted are the httpd’s methods (GET,POST,etc)

#    Module verify remote ip address if the method used by the user is present

#    in the value passed to this variable. Methods must be comma-separated

MS_METHODS POST,PUT,OPTIONS,CONNECT

#MS_WhiteList

#    Syntax:  MS_WhiteList /etc/spamhaus.wl

#    Default: no value

#    Path of whitelist file.

#    After you’ve edit it, you mustn’t reload apache. This file will be read only

#    when ‘data modification time’ change. You can add an individual IP address or

#    subnets with CIDR.

MS_WhiteList /etc/spamhaus.wl

#MS_DNS

#    Syntax:  MS_DNS sbl-xbl.spamhaus.org

#    Default: sbl-xbl.spamhaus.org

#    Name server to use for verify is an ip is blacklisted.

#    Using a local rbldnsd instance of sbl-xbl, you can increase query performance

#MS_Dns local.rbldnsd.instance.of.sbl-xbl

#MS_CacheSize

#    Syntax:    MS_CacheSize 256

#    Default:   512

#    Max value: 8192

#    This directive can manage the number of cache entries.

MS_CacheSize 512

#MS_CustomError

#    Syntax:   MS_CustomError “My custom error message”

#    Default:  “Access Denied! Your address is blacklisted. More information about this error may be available in the server error log.”

#    A custom error message that allows you to replace default error message with one you create

MS_CustomError “Access Denied! Your address is blacklisted. More information about this error may be available in the server error log.”

</IfModule>

Módulo QOS, calidad de servicio (termina conecciones que no tienen actividad y usan recursos).

sudo apt-get -y install libapache2-mod-qos

Editamos el archivo de configuración (/etc/apache2/mods-available/mod-spamhaus.conf)

<IfModule qos_module>

# conecciones desde hasta 200 IP distintas

QS_ClientEntries 200

# minimum request rate (bytes/sec at request reading):

#QS_SrvRequestRate                                 120

# limits the connections for this virtual host:

#QS_SrvMaxConn                                     100

# allows keep-alive support till the server reaches 600 connections:

#QS_SrvMaxConnClose                                600

# allows max 50 connections from a single ip address:

#QS_SrvMaxConnPerIP                                 50

#Cantidad maxima de conecciones TCP

MaxClients 256

#deshabilita mantener conecciones abiertas cuando el 70% estan ocupadas

QS_SrvMaxConnClose 180

</IfModule>

Eliminación de información enviada en las cabeceras de respuesta.

Con esto eliminaremos casi toda la información relativa a sistema operativo, versiones y modulos actualmente instalados.

Si hemos instalado el módulo PHP (php5_module), debemos editar el archivo de configuración de php (/etc/php5/apache2/php.ini), y buscamos la siguiente línea,

expose _php = On

Y la cambiamos por

expose_php = Off

Ahora eliminaremos la información relacionada con apache, para ello editamos el archivo security de apache (/etc/apache2/conf.d/security), Cambiamos la línea.

ServerSignature On

por

ServerSignature Off

Y la línea

ServerTokens Full

por

ServerTokens Prod

Con estos cambios al enviar las cabeceras de respuesta solo informaremos al cliente que estamos ejecutando apache.

Adicionalmente activamos IPTABLEs.

Creamos un archivo con las reglas en etc y le damos permiso de lectura, ejecución y lectura solo al root.

touch /etc/iptables

Y agregamos las siguiente líneas.

iptables -F # limpiamos reglas actuales de iptables

iptables -A INPUT -i lo -j ACCEPT # aceptamos todo tipo de peticiones para la interface loop

iptables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -s 192.168.x.x/24 -p tcp -m tcp –dport 22 -j ACCEPT #permitimos acceso ssh solo desde la LAN

iptables -A INPUT -s 0.0.0.0/0 -p tcp -m tcp –dport 80 -j ACCEPT #aceptamos peticiones al puerto 80 desde cualquier lugar

iptables -A INPUT -j DROP # denegamos el acceso a cualquier puerto que no sea 80 ó 22