From Seguridad

Introducción a IPTables

Linux Journal: Linux viene con un potente firewall incorporado, aunque su interfaz puede ser un poco intimidante. Este es el primer paso para dominar las funciones básicas y no tan básicas de IPTables para ir creando un Servidor seguro.

Netfilter es un framework disponible en el núcleo Linux que permite interceptar y manipular paquetes de red. Dicho framework permite realizar el manejo de paquetes en diferentes estados del procesamiento. Netfilter es también el nombre que recibe el proyecto que se encarga de ofrecer herramientas libres para cortafuegos basados en Linux.

Prohibir IPs que muestren signos maliciosos

Cabe destacar que:

  • Antes de usar cualquier tipo de programa para gestionar el “Firewall” de un Servidor, hay que hacer el amor con iptables.
  • Al hacer pruebas, es divertido bloquearte a ti mismo.
  • Las IPs son fáciles de suplantar, generar y hasta son compartidas, por lo tanto, es posible que se llegue a bloquear tráfico legítimo.
  • Los falsos positivos existen, por esta razón es necesario estar al pendiente de las pruebas y también de la medición y comparación de los resultados que rechazan IPs probablemente maliciosas.
  • En el contexto de seguridad de la red, un ataque “spoofing” es una situación en la que una persona o un programa se pone una mascara con éxito, falsificando datos que le permiten obtener ventajas ilegítimas.
    • REJECT, el cliente consigue un mensaje de conexión rechazada.
    • DROP, no hay mensaje de error para el cliente, responde como una especie de “black hole”.

Análisis y bloqueo

En servidores Linux, Fail2Ban analiza los archivos de registro (log) y prohibe las IPs que muestren signos maliciosos. Por ejemplo, para prohibir IPs con demasiados fracasos al introducir una contraseña o con muchas peticiones que busquen vulnerabilidades (exploits), etc.

En general Fail2Ban se utiliza para actualizar las reglas del “Firewall”, con las reglas necesarias para rechazar direcciones IP por un periodo de tiempo específico. Fail2Ban también se puede configurar con cualquier otra acción arbitraria (por ejemplo, desde el envío de un correo electrónico de alerta hasta por ejemplo, abrir la  bandeja del CD-ROM). Además el producto Fail2Ban, viene con varios filtros para diversos servicios como: apache, ssh, mysql, entre otros más.

Características principales de Fail2Ban

  • Arquitectura Cliente/Servidor.
  • Multi-hilos.
  • Altamente configurable.
  • Soporta FAM/Gamin/pyinotify.
  • Analiza los archivos de registro log y busca patrones específicos.
  • Ejecuta comandos cuando se detecta un patrón en una misma dirección IP durante más de X veces. X se puede cambiar a la medida.
  • Después de un cierto período de tiempo, se ejecuta otro comando con el fin de eliminar la prohibición sobre la dirección IP.
  • Por defecto utiliza Netfilter/Iptables, pero también puede utilizar TCP Wrapper (/etc/hosts.deny) y muchos otras “firewalls/actions”.
  • Gestiona la rotación de los archivos de log.
  • Puede manejar múltiples servicios (sshd, apache, vsftpd, etc).
  • Resuelve el nombre de host DNS a una dirección IP (utilizar con precaución, se desactiva con usedns = no).

Instalación

apt-get install fail2ban

dpkg-query -L fail2ban

Archivo de configuración a la medida (Jails)

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

vi /etc/fail2ban/jail.local

Filtros

Si desea modificar o añadir nuevos filtros, se puede hacer desde:

ls -la /etc/fail2ban/filter.d

Archivo log

tail -f /var/log/fail2ban.log

cat /var/log/fail2ban.log | grep WARNING

Por favor consulte: http://www.the-art-of-web.com/system/fail2ban-log/

man  fail2ban-client

Para habilitar una IP que haya sido prohibida:

fail2ban-client get {JAIL} actionunban {IP}

iptables -D fail2ban-{JAIL} -s {IP} -j DROP

Use el comando iptables -L -n para encontrar el nombre de la regla, por lo tanto, para obtener el nombre de las celdas debe usar:

fail2ban-client status

Por favor consulte: http://www.fail2ban.org/wiki/index.php/Commands

Probemos ¿Sí funciona?

Para probar fail2ban, hay que observar el comportamiento de las reglas iptables en el Servidor que se encuentra protegido con su respectivo “Firewall” y Fail2Ban:

Desde una computadora de la red (192.168.0.22), fuera de ignoreip en jail.local:

ab -n 1000 -c 5 http://192.168.0.1/

Desde el servidor (192.168.0.1):

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

iptables -L | egrep -i 'fail2ban|DROP|REJECT'

La prueba anterior requiere que exista una celda (jail) simple para prevenir cierto tipo de ataque del tipo “Denial of Service” contra Apache:

[http-get-dos]

enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/apache*/*access.log
maxretry = 120
findtime = 120

Entonces: vi /etc/fail2ban/filter.d/http-get-dos.conf

# Fail2Ban configuration file
#
# Author: http://www.go2linux.org
#
[Definition]

# Option: failregex
# Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match.
# You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives.

failregex = ^ -.*\"(GET|POST).*

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
# ignoreregex =
ignoreregex = ^ -.*\"(GET|POST).*Googlebot

Iniciar, parar y re-iniciar

/etc/init.d/fail2ban start
/etc/init.d/fail2ban stop
/etc/init.d/fail2ban restart

Más pruebas

[ssh]

enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6

Probemos con 6 peticiones de ingreso mediante SSH, usando un usuario que no existe:

ssh usuariofalso@192.168.0.1

Gestión y vigilancia de Servidores

Es importante que un sistema de vigilancia funcione, todo el tiempo, con la confianza de que así lo hace. Una herramienta de supervisión del sistema no debe ser intrusiva, es más, uno mismo debería olvidarse que se encuentra instalada. Eso ocurre hasta que, por ejemplo, el “proceso demonio” sshd se cae en un servidor co-ubicado a 200 kilómetros de distancia y no se puede acceder de manera remota ya que sshd no se encuentra “vivo”. Cuando esto sucede, es bueno saber que se cuenta con esta capa extra de vigilancia automática que además de alertar que algo sucedió, también toma una acción para solucionar el error.

monit

Monit es particularmente útil para controlar “procesos demonio”, como los iniciados al momento de arranque del sistema.

ls -la /etc/init.d/

Demasiado útil para vigilar y mantener de manera automática un Servidor altamente disponible. Con Monit también se pueden vigilar  servicios como: Apache, MySQL, SSH, Postfix y muchos otros más.

Alerta y acción inmediata

A diferencia de muchos otros sistemas de vigilancia, con Monit se puede actuar de inmediato si se produce una situación de error, por ejemplo, si no se está ejecutando Postfix, se puede automatizar el inicio de Postfix en caso de no estar activo. De la misma manera, por ejemplo, si Apache por alguna razón empieza a utilizar demasiados recursos (es probable, producto de un ataque DoS en curso) con Monit se puede detener o reiniciar Apache, también alertar o avisar por medio de correo electrónico. Con Monit es posible controlar características de procesos, tales como, la cantidad de memoria o la cantidad de cliclos CPU que un proceso se encuentra consumiendo.

Detectar cambios que no deberían pasar

Monit también se puede utilizar para supervisar archivos, directorios y sistemas de archivos. Permite detectar si ocurren cambios, tales como: “timestamps”, “checksums” o cambios de tamaño de archivos. Lo cual es útil de supervisar por razones de seguridad. Por ejemplo, se puede controlar la suma de control MD5 o SHA1 de los archivos que no deberían cambiar. De la misma manera se puede alertar o se puede realizar una acción si algo cambia.

Instalación

apt-get install monit

dpkg-query -L monit

Archivo de configuración

vi /etc/monit/monitrc

Archivo de configuración de vigilancia a la medida

ls -la /etc/monit/conf.d/

Por ejemplo: vi /etc/monit/conf.d/custom.conf

Iniciar, parar y re-iniciar

/etc/init.d/monit start
/etc/init.d/monit stop
/etc/init.d/monit restart

Archivo log

tail -f /var/log/monit.log

du -sh /var/log/monit*

Estado de la red y conexiones

Monit puede controlar las conexiones de red a varios servidores, tanto en el servidor local como en servidores remotos. Es capaz de manejar “Sockets” del tipo TCP, UDP y Unix Domain. La prueba de red se puede realizar en un nivel de protocolo; Monit tiene funciones propias para probar los principales protocolos de Internet, como HTTP, SMTP, etc. Incluso si un protocolo no se encuentra soportado, se puede ir configurando en la marcha para enviar datos de prueba y probar la respuesta del servidor.

Monit puede ser utilizado para probar programas o “scripts” en ciertos momentos, al igual que cron, pero, además, se puede probar el valor de salida de un programa y realizar una acción o enviar una alerta si el valor de salida indica un error. Esto significa que usted puede utilizar Monit para vigilar cualquier tipo de “script” que se pueda crear.

Cabe destacar que Monit se puede utilizar para vigilar los recursos generales del sistema, como el uso de CPU, la memoria y la carga media.