En muchos casos cuando nos queremos involucrar en configurar un FireWall, necesitamos aprender bastante de IPTABLES, para configurarlo y que quede funcional y seguro usando un kernel de Linux.
Tarea que se torna difícil si ejecutamos los comandos y reglas directamente con comandos de IPTABLES, materia que es compleja de configurar adecuadamente.
Afortunadamente existen herramientas que nos permiten realizar este trabajo en forma más simple y nos aleja del detalle de las instrucciones, esta es una de las herramientas, se llama Uncomplicated FireWall o ufw.
Para instalarla ejecutamos en un terminal como root:
# aptitude install ufw
Esta es una interfaz de línea de comandos que nos permiten trabajar desde consola con IPTABLES en forma sencilla y consisten en un pequeño número de ordenes simples que son traducidas por la aplicación para todas las reglas de IPTABLES.
Si no tenemos disponible ipv6 en nuestra red, no es necesario activar reglas para esta red, por lo que debemos desactivarlo, para ello lo que deberemos hacer es editar el archivo /etc/default/ufw y dejar la variable, de la forma siguiente:
IPV6=no
Con eso hemos deshabilitado IPV6 de nuestra definición, pero si llegamos a configurar IPV6 deberemos dejar de nuevo la variable IPV6=yes.
Antes de comenzar a escribir las reglas debemos definir como trabajará nuestro FireWall o cual será su comportamiento por defecto o su Política de Filtrado, lo más recomendable es denegar todo tipo de tráfico entrante y permitir el tráfico saliente, para lograr esto debemos ejecutar los comandos siguientes:
# ufw default deny incoming # ufw default allow outgoing
Las reglas se pueden indicar de dos maneras distintas, por una parte podemos realizarlo por el nombre del servicio y la otra es por el número de puerto tcp/udp del protocolo.
Un ejemplo de esto, por ejemplo es que si queremos habilitar o escuchar en el puerto 22 o habilitar el servicio SSH en nuestro servidor, para ello podremos usar cualquiera de las dos formas siguientes:
# ufw allow ssh # ufw allow 22
Ambas formas son correctas para esta aplicación.
En el tiempo hay que estar mirando los logs para saber desde que IP's han habido más intentos de quebrar nuestras claves de acceso, cuando tenemos una IP's que recurrentemente intenta violar nuestra seguridad, tenemos la posibilidad de bloquearlo directamante:
# ufw deny from xx.yy.zz.ww
Con esto, la IP identificada quedará simplemente bloqueada. Pero es importante que esta regla quede en las primeras posiciones en las reglas, ya que recordemos que IPTABLES ejecuta las reglas hasta que haya una coincidencia, por lo tanto debe estar antes de la apertura de los puertos y en las primeras líneas.
Para realizar esto debemos ejecutar:
# ufw insert 1 deny from xx.yy.zz.ww
Esto dejará esta regla de bloqueo en primero posición. Para serciorarnos que esto es así, debemos listar en orden las reglas con la orden:
# ufw status numbered
Entrega un listado completo de las reglas aplicadas y en el orden en las que las aplica.
Hay ocasiones en que se bloquean ciertas IP's que intentan quebrar nuestra seguridad y se prueba insistentemente con varias IP's del mismo segmento, obviamente poner una lista de IP's no es lo más aconsejable en estos casos, lo que se debe hacer es bloquear el segmento completo para eso ejecutamos la regla.
# ufw deny from xx.yy.zz.0/24 Por ejemplo: # ufw deny from 192.168.100.0/24
Cuando ejecutamos es status nos muestra el rango de IP's bloqueadas, esto lo tendremos que chequear en las reglas, SIEMPRE.
Además de poder utilizar los nombres de los servicios que tenemos es /etc/services, esta aplicación dispone de una lista de nombres de las aplicaciones más comunes, como WWW, OpenSSH, WWW Secure, etc…
Para ver la lista completa de los nombres podemos ejecutar:
# ufw app list AIM Bind9 Bonjour CIFS DNS Deluge IMAP IMAPS IPP KTorrent Kerberos Admin Kerberos Full Kerberos KDC Kerberos Password LDAP LDAPS LPD MSN MSN SSL Mail submission NFS OpenSSH POP3 POP3S PeopleNearby SMTP SSH Socks Telnet Transmission Transparent Proxy VNC WWW WWW Cache WWW Full WWW Secure XMPP Yahoo qBittorent svnserve
UFW nos permite incorporar reglas más complejas, como por ejemplo limitar el rango de IP's desde las que se puede acceder a una aplicación.
En el ejemplo siguiente podemos acceder desde un rango de IPs al servicio SSH o viceversa.
# ufw allow from 192.168.0.0/24 to 127.0.0.1 app ssh # ufw allow to 192.168.0.0/24 from 127.0.0.1 app ssh
Cualquier máquina que no esté en el rango de red 192.168.0.0 a 192.168.0.254, no podrá tener acceso a la máquina por el servicio SSH.
UFW además tiene mecanismos para poder insertar reglas en IPTables y poder eliminarlas, veamos el ejemplo siguiente de inserción:
# ufw insert 1 deny 192.168.0.100
Esto inserta en la línea “1” de las reglas, denegar a una IP de la red LAN, esto se comprueba al ejecutar ufw status, nos entrega un listado donde podemos ver las reglas y el orden en que van ejecutadas.
# ufw delete 1
Esto nos permite eliminar una regla de la lista, en el ejemplo se elimina la primera regla de la lista de ufw.
UFW tiene también mecanismos para denegar IP's que han sido bloqueadas varias veces y vuelven a intentar tratar de romper nuestras claves, para ello simplemente debemos DENEGAR esas IP's, las cuales quedan registradas en los logs.
# ufw deny from 192.168.144.xx to any
Ha modo de ejemplo hemos denegado una IP interna, pero podemos poner cualquier IP que nos de problemas, también debemos saber que los atacantes pueden probar con otras IP's del mismo segmento u otro.
Pero como saber que IP's son las que tratan de accesar nuestra máquina o cuales son las que tienen mayor numero de intentos fallidos, para ello ejecutamos en un terminal.
# zgrep "Failed password for " /var/log/auth* \ | sed "s/invalid user //" | tr -s " " | awk '{print $11" "$9}' \ | sort | uniq -c | sort -n | tail -25
Todo esto en una misma línea del terminal. Estos nos proporcionará un registros de las IP's que han realizado mayor cantidad de accesos fallidos y debemos de bloquear.
10 106.75.71.224 root 10 42.7.26.85 root 10 58.242.83.8 root 11 123.150.200.121 root 23 173.212.222.115 admin 35 116.31.116.26 root 141 58.242.83.7 root
Como ejemplo he sacado las que han tratado de romper el acceso a mi server, la primera columna es la cantidad de veces, la segunda es desde la IP de origen y la tercera es el usuario por el cual han tratado de ingresar. Este es un ejemplo real de las IP's que han tratado 10 a más veces, la lista es larga, pero sólo puse esa por los intentos.
UFW también nos permite definir con que protocolo usaremos el puerto, podremos utilizar por ejemplo el protocolo TCP o el UDP. Como ejemplo podemos estar utilizando mariaDB sólo para peticiones TCP o para un rango de puertos concreto, este ejemplo sería de esta forma:
# ufw allow 3306/tcp # ufw allow 3306:4000/tcp
Pero también de una forma más simple podremos ejecutar el comando:
# ufw allow mysql
Como es lógico pensar, esta herramienta también nos permite eliminar reglas, por ejemplo siguiendo con las reglas que hemos definico como ejemplo, podemos eliminar algunas de ellas, de esta forma:
# ufw delete allow ssh
Esto nos borra sólo la que está referida a allow ssh, pero si queremos borrar por completo las reglas del FireWall, debemos ejecutar el comando:
# ufw reset
Esto nos elimina todas las reglas del FireWall.
Para habilitar y/o refrescar las reglas de nuestro FireWall, se puede realizar con el comando:
# ufw enable
Se debe hacer notar también que cada vez que se modifique, agrege o borre una regla, se debe ejecutar este comando, para actualizar las reglas que están en ejecución en el sistema.
Para deshabilitar el se debe ejecutar el comando:
# ufw disable
Una vez que hayas terminado de configurar y habilitar tu configuración del FireWall, puedes comprobar las reglas utilizadas, para ello debes ejecutar el comando:
# ufw status # ufw status verbose
La primera línea nos estrega una información general de lo que hemos programado en nuestro FireWall, la segunda línea nos entrega un detalle mas completo de todas las reglas que hemos puesto en nuestro sistema.
Podremos relizar un scripts con varios pasos que nos permiten realizar este trabajo en forma más simple y rápida:
#!/bin/bash # Deshabilitamos el FireWall a cualquier regla anterior ufw disable # Reseteamos todas las reglas anteriores ufw reset # Denegamos el tráfico de entrada y permitimos que salga todo ufw default deny incoming ufw default allow outgoing # Permitimos el acceso a SSH ufw allow ssh # Permitimos acceso a http ufw allow www # Permitimos acceso a MariaDB ufw allow 3306/tcp # Habilitamos acceso a NTPd ufw allow ntp # Activamos el FireWall ufw enable # Listamos las reglas escritas ufw status verbose
Este es un script de ejemplo para darse una idea que podemos programar un script que nos permita ejecutar rápidamente un Firewall completo a nuestro sistema.