Asegurando Linux y Apache

En el caso de poseer un equipo en la nube, directamente expuesto a internet o a una red la cual puede ser sujeta a intrusión, se deberá tener en cuenta los siguientes aspectos de seguridad cuando tenemos un equipo con servidores de aplicaciones y apache.

Asegurando SSH

En el caso de SSH se deberán tener en cuenta los siguientes puntos:

  • Dejar que un usuario root pueda loguearse mediante SSH es algo muy sensible, por lo cual deberíamos rechazarlo, por tal motivo se podrá editar el archivo /etc/ssh/ssh_config y agregar el parámetro PermitRootLogin con el parámetro “no”.
  • Si un usuario necesita luego permisos de root deberá ingresar con un usuario diferente a root y luego ejecutar los comandos necesarios con “su” o “sudo”.
  • Otro aspecto importante que podemos modificar dentro del archivo ssh_config es tratar de mover el puerto por default (parámetro Port 22) a cualquier otro tipo de puerto que sea menos frecuentemente escaseado por portscanners. Por ejemplo 222 o 2222.

Limitar el acceso de “su” solo a administradores

En este caso es bastante simple, y sólo los usuarios del grupo “sudo” o “sudores” podrá tener dichos privilegios, para esto dependiendo de la distribución de linux o unix que se posea se deberán ejecutar diferentes comandos, en nuestro caso con una distribución Debian o Ubuntu.

dpkg-statoverride --update --add root sudo 4750 /bin/su

Mejorar la seguridad IP

Para esto se deberán tener ciertas variables en cuenta, sobre todo que tipo de protocolos se están utilizando, pero un buen acercamiento sería el siguiente. En principio modificar el archivo /etc/sysctl.d/10-network-security.conf editando y agregando los siguientes valores.

# Ignore ICMP broadcast requests
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Disable source packet routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# Ignore send redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# Block SYN attacks
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# Log Martians
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# Ignore Directed pings
net.ipv4.icmp_echo_ignore_all = 1

Atención: luego cargar nuevamente las reglas ejecutando el siguiente comando.

service procps start

Asegurando Apache2

En primer lugar, lo mejor que podemos hacer es actualizar la versión de apache a lo máximo que podamos en nuestro caso utilizamos la versión 2.4. Luego editar el archivo /etc/apache2/conf-enabled/security.conf con los siguientes valores: ServerTokens Prod ServerSignature Off TraceEnable Off Header unset ETag FileETag None Para que estos cambios tomen efecto se deberá tener los módulos “header” habilitados. sudo a2enmod headers sudo apachectl restart

Protección DoS

Para protegernos de cualquier tipo de intrusión de denegación de servicios existe un módulo muy completo llamado mod_evasive.

Cómo funciona Básicamente lo que hace es mantener una tabla dinámica con las URIs accedidas por las distintas IPs de los clientes del Apache, y permite ejecutar algunas acciones cuando una misma IP solicita un mismo recurso (una misma URI o elementos de un mismo sitio) más de n veces en m segundos. La acción por default que ejecuta el mod_evasive es, una vez superado el máximo de requests por segundo permitidos, bloquear durante una cantidad de segundos al cliente (la IP) devolviendo un error 403 (Forbidden) a la petición HTTP. Pero lo interesante es que también permite ejecutar un comando de sistema al registrarse un intento de ataque, con lo cual se puede agregar una regla al iptables para bloquear la IP del cliente.

Para instalarlo ejecutar: apt-get install libapache2-mod-evasive Luego configurar el directorio de logging. mkdir /var/log/apache2/mod_evasive chown www-data:www-data /var/log/apache2/mod_evasive Configurar el archivo /etc/apache2/mods-available/evasive.conf

DOSHashTableSize    3097
DOSPageCount        2
DOSSiteCount        20
DOSPageInterval     1
DOSSiteInterval     1
DOSBlockingPeriod   10

DOSEmailNotify      [email protected]
#DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
DOSLogDir           "/var/log/apache2/evasive"

A continuación la descripción de las distintas opciones de configuración:

  • DOSHashTableSize – Establece el número de nodos a almacenar para cada proceso de peticiones de la tabla hash (contenedor asociativo de recuperación de peticiones por medio de claves que agiliza las respuestas del servidor). Si aplicamos un número alto a este parámetro obtendremos un rendimiento mayor, ya que las iteraciones necesarias para obtener un registro de la tabla son menores. Por contra, y de forma evidente, aumenta el consumo de memoria necesario para el almacenamiento de una tabla mayor. Se hace necesario incrementar este parámetro si el servidor atiende un número abultado de peticiones, aunque puede no servir de nada si la memoria de la máquina es escasa.
  • DOSPageCount – Indica el valor del umbral para el número de peticiones de una misma página (o URI) dentro del intervalo definido en DOSPageInterval. Cuando el valor del parámetro es excedido, la IP del cliente se añade a la lista de bloqueos.
  • DOSSiteCount – Cuenta cuántas peticiones de cualquier tipo puede hacer un cliente dentro del intervalo definido en DOSSiteInterval. Si se excede dicho valor, el cliente queda añadido a la lista de bloqueos.
  • DOSPageInterval – El intervalo, en segundos, para el umbral de petición de páginas.
  • DOSSiteInterval – El intervalo, en segundos, para el umbral de petición de objetos de cualquier tipo.
  • DOSBlockingPeriod – Establece el tiempo, en segundos, que un cliente queda bloqueado una vez que ha sido añadido a la lista de bloqueos. Como ya se indicó unas líneas atrás, todo cliente bloqueado recibirá una respuesta del tipo 403 (Forbidden) a cualquier petición que realice durante este periodo.
  • DOSEmailNotify – Un e-mail será enviado a la dirección especificada cuando una dirección IP quede bloqueada. La configuración del proceso de envío se establece en el fichero mod_evasive.c de la forma /bin/mail -t %s, siendo %s el parámetro que queda configurado en este parámetro. Será necesario cambiar el proceso si usamos un método diferente de envío de e-mails y volver a compilar el módulo con apxs (por ejemplo, la opción t ha quedado obsoleta en las últimas versiones del comando).
  • DOSSystemCommand – El comando reflejado se ejecutará cuando una dirección IP quede bloqueada. Se hace muy útil en llamadas a herramientas de filtrado o firewalls. Usaremos %s para especificar la dirección IP implicada. Por ejemplo, podemos establecer su uso con iptables de la forma siguiente: DOSSystemCommand “/sbin/iptables –I INPUT –p tcp –dport 80 –s %s –j DROP"
  • DOSLogDir – Establece una ruta para el directorio temporal. Por defecto, dicha ruta queda establecida en /tmp, lo cual puede originar algunos agujeros de seguridad si el sistema resulta violado.
  • DOSWhitelist – La dirección IP indicada como valor del parámetro no será tenida en cuenta por el módulo en ningún caso. Para cada dirección IP a excluir ha de añadirse una nueva línea con el parámetro. Por ejemplo, dejaremos fuera del chequeo del módulo a un posible bot que use los siguientes rangos de direcciones: DOSWhitelist 66.249.65.* DOSWhitelist 66.249.66.*

Habilitar el módulo y reiniciar el servicio de apache

sudo a2enmod evasive
sudo apachectl restart

Luego se podrá probar el sitio llevando el valor de DOSSiteCount a 1 y desde el navegador ejecutar varios refresh, se deberá ver que el sitio bloquea a la IP cliente durante el período de tiempo configurado.

Otra forma de probarlo es corriendo un test de unidad que viene en el módulo. En mi caso se encuentra en /usr/share/doc/libapache2-mod-evasive/examples/.

# perl test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Y si pusimos la directiva para bloquear la IP por iptables podemos verlo con:

# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp --  anywhere tcp dpt:http

results matching ""

    No results matching ""