====== Configurando un FireWall en Debian ====== {{:servicios:informaticos:debian-logo.png?200 |Logo Debian}} 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. ===== No Usamos ipv6 ===== 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**. ===== Definiendo Políticas de IPTABLES ===== 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 ===== Añadiendo Reglas ===== 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. ===== Bloqueando IP's ===== 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. ===== Bloqueando Rangos de IP's ===== 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. ===== Listando Nombres de Servicios ===== 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 ===== Complicando las Reglas ===== 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. ===== Insertando Reglas ===== 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. ===== Denegando IP's ===== 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. ===== Eligiendo el Protocolo ===== 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 ===== Eliminando Reglas ===== 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. ===== Activando o Deshabilitando el 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 ===== Comprobando la Configuración del FireWall ===== 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. ====== Realizando un Script ====== 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.