Después de una semana en modo paranoico por diversos motivos he decidido acelerar los proyectos de bastionado de mi red local. La primera medida más urgente a pesar de utilizar contraseñas robustas era activar un mecanismo para evitar ataques de fuerza bruta en mi Raspberry Pi conectada hacia el exterior. Los registros revelan que por lo menos cada hora recibe un ataque de estas características, normalmente desde equipos comprometidos chinos.
La opción por la que me he decantado finalmente es utilizar Fail2ban, un script en python que analiza los registros de los principales servicios y en caso de detectar un ataque crea una regla de firewall para bloquear al atacante. Es compatible con Iptables, Shorewall y otras soluciones firewall de Linux. Además se puede integrar con diferentes clientes de correo electrónico por consola para recibir alertas.
La instalación y configuración es muy sencilla. Primero instalarlo desde el repositorio de paquetes de tu distribución Linux, en mi caso aptitude de Debian.
apt-get install fail2ban
Una vez instalado procedemos a la configuración, primero renombramos el fichero de configuración general:
mv /etc/fail2ban.conf.example /etc/fail2ban.conf
A pesar de que en el manual indica más parámetros de configuración en este fichero sólo he podido configurar el nivel de detalles del log, la ruta del log y la ruta del socket.
El grueso de la configuración se hace en las «jaulas», los ficheros «jail» dónde se encuentran los filtros y acciones. Fal2ban primero lee el fichero fail2ban.config y luego las jaulas de cada usuario. Para ello copiamos el jail.conf a jail.local para realizar nuestra propia configuración.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Los parámetros de configuración que considero más importantes son:
- ignoreip para crear una lista blanca de direcciones IP permitidas.
- destemail para indicar la dirección de correo electrónico dónde recibir las alertas.
- mta para establecer el proveedor de correo electrónico, en mi caso al final he optado por sendmail. Debajo indico cómo configurarlo.
- action para indicar la acción a realizar en caso de ataque. En mi caso he optado por la opción action_mwl que banea la IP atacante y envía por correo un completo informe con un Whois del atacante y una copia de los logs que han dado la voz de alarma.
A continuación indico el fichero de configuración completo omitiendo los servicios que no estoy monitorizando. Por el momento sólo lo he configurado para proteger SSH pero como se puede ver en el fichero de configuración se puede proteger servicios HTTP, FTP, Mail, etc:
# Fail2Ban configuration file. # # This file was composed for Debian systems from the original one # provided now under /usr/share/doc/fail2ban/examples/jail.conf # for additional examples. # # To avoid merges during upgrades DO NOT MODIFY THIS FILE # and rather provide your changes in /etc/fail2ban/jail.local # # Author: Yaroslav O. Halchenko <debian@onerussian.com> # # $Revision$ # # The DEFAULT allows a global definition of the options. They can be overridden # in each jail afterwards. [DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host ignoreip = 127.0.0.1/8 bantime = 600 maxretry = 3 # "backend" specifies the backend used to get files modification. Available # options are "gamin", "polling" and "auto". # yoh: For some reason Debian shipped python-gamin didn't work as expected # This issue left ToDo, so polling is default backend for now backend = auto # # Destination email address used solely for the interpolations in # jail.{conf,local} configuration files. #destemail = root@localhost destemail = tuusuariodegmail@gmail.com # # ACTIONS # # Default banning action (e.g. iptables, iptables-new, # iptables-multiport, shorewall, etc) It is used to define # action_* variables. Can be overridden globally or per # section within jail.local file banaction = iptables-multiport # email action. Since 0.8.1 upstream fail2ban uses sendmail # MTA for the mailing. Change mta configuration parameter to mail # if you want to revert to conventional 'mail'. mta = sendmail # Default protocol protocol = tcp # Specify chain where jumps would need to be added in iptables-* actions chain = INPUT # # Action shortcuts. To be used to define action parameter # The simplest action to take: ban only action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] # ban & send an e-mail with whois report to the destemail. action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"] # ban & send an e-mail with whois report and relevant log lines # to the destemail. action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"] # Choose default action. To change, just override value of 'action' with the # interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in jail.local # globally (section [DEFAULT]) or per specific section #action = %(action_)s action = %(action_mwl)s # # JAILS # # Next jails corresponds to the standard configuration in Fail2ban 0.6 which # was shipped in Debian. Enable any defined here jail by including # # [SECTION_NAME] enabled = true # # in /etc/fail2ban/jail.local. # # Optionally you may override any other parameter (e.g. banaction, # action, port, logpath, etc) in that section within jail.local [ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3
A la hora de levantar el servicio hay dos scripts fail2ban-server y fail2ban-client.
fail2ban-server únicamente se pone a la escucha de los servicios a monitorizar mientras que fail2ban-client aplica los filtros que hemos configurado anteriormente.
También podemos utilizar fail2ban-client para sacar IPs que se hayan baneado anteriormente, por ejemplo si nos hemos baneado nosotros mismos para probar la herramienta.
fail2ban-client get ssh actionunban <IP>
Reiniciando el servicio completo limpiaremos la lista (y el Firewall) de todas las direcciones IP baneadas.
etc/init.d/fail2ban restart
Hasta aquí la información necesario para configurar Fail2ban para bastionar nuestros servicios remotos en Linux. Cómo siempre en el manual disponemos de todas la información de la herramienta.
Realmente en lo que más he perdido el tiempo ha sido en configurar el servicio de correo electrónico. Al final me he decantado por sendmail para recibir las alertas en el correo de gmail. Al principio me había pelado con mail pero al final me he decantado por lo fácil utilizando sendmail.
Primero lo instalamos desde nuestro repositorio de paquetes:
apt-get install sendmail
Y lo configuramos desde el archivo de configuración
nano /etc/ssmtp/ssmtp.conf
Descomentamos la opción FromLineOverride=YES e incluimos los siguientes parámetros
- AuthUser=tuemail@gmail.com
- AuthPass=tucontraseñadeunuso
- mailhub=smtp.gmail.com:587
- UseSTARTTLS=YES
# # Config file for sSMTP sendmail # # The person who gets all mail for userids < 1000 # Make this empty to disable rewriting. root=postmaster # The place where the mail goes. The actual machine name is required no # MX records are consulted. Commonly mailhosts are named mail.domain.com mailhub=mail # Where will the mail seem to come from? #rewriteDomain= # The full hostname hostname=kali # Are users allowed to set their own From: address? # YES - Allow the user to specify their own From: address # NO - Use the system generated From: address FromLineOverride=YES AuthUser=tuusuariodegmail@gmail.com AuthPass=tucontraseña mailhub=smtp.gmail.com:587 UseSTARTTLS=YES
Para probarlo con este comando es suficiente
echo "Cuerpo del mensaje" | mail -s "Titulo" my-email@my-domain.com
En otro de los proyectos que tengo pendientes y que me comentó un compañero de trabajo es guardar la información de estos equipos atacantes, para después devolverles el ataque, a modo espejo, en el mismo servicio que te están tratando de comprometer. Normalmente al serlos equipos atacantes una red de zombies es fácil tener éxito y en poco tiempo construir una base de datos de equipos comprometidos.
Mis siguientes pasos para bastionar la red local son añadir port knocking a los servicios más críticos y aleatorizar los puertos cada 24 horas.