Desarrollador de software, con experiencia en desarrollo web y móvil. Apasionado por la tecnología y la innovación.
La administración de la seguridad de nuestros servidores es tan importante como la calidad de las aplicaciones que se ejecutan en ellos. En esta entrada vamos a ver todo lo que necesitamos para gestionar de forma segura las conexiones hacia nuestro servidor usando un cortafuegos (Firewall).
Altamente versatil, potente y sencillo, hoy veremos como trabajar con Uncomplicated FireWall (UFW) en Ubuntu.
En primer lugar vamos necesitar instalar el paquete de firewall, para ello vamos a ejecutar las siguientes dos líneas.
sudo apt update
sudo apt install ufw
Nota: ufw corresponde a las siglas de la aplicación Uncomplicated FireWall.
Ahora debemos hacer unos ajustes iniciales, entre ellos vamos a poner unas configuraciones básicas, permitir todo el tráfico saliente y negar todo el trafico entrante (habilitaremos solo lo necesario más adelante).
sudo ufw default deny incoming
sudo ufw default allow outgoing
Importante: Configura la conexión SSH antes de activar el firewall, de lo contrario la conexión se cerrará y quedarás sin acceso a tu servidor, esto lo hacemos con la siguiente instrucción.
sudo ufw allow ssh
En caso de que (por seguridad) nuestro servidor use un puerto SSH diferente, ejecutamos la siguiente instrucción:
sudo ufw allow PUERTO/tcp
Como en los demás servicios del sistema operativo, en ubuntu podemos gestionar y monitorear el servicio de firewall con el comando systemctl.
Para conocer el estado de este servicio podemos ejecutar la línea:
sudo systemctl status ufw
Para iniciar el servicio si se encuentra inactivo:
sudo systemctl start ufw
Para detener el servicio:
sudo systemctl stop ufw
Para habilitar el inicio automático del servicio en el arranque del sistema operativo:
sudo systemctl enable ufw
Para deshabilitar el inicio automático:
sudo systemctl disable ufw
Que el servicio se esté ejecutando no quiere decir que el firewall esté habilitado (que esté bloqueando activamente conexiones), por defecto el firewall no está activo, para evitar que te quedes fuera de tu servidor. Para conocer el estado del firewall podemos ejecutar la siguiente instrucción:
sudo ufw status [verbose]
Cuando se utiliza la opción verbose nos mostrará información más detallada, como el nivel de logging actual o las políticas por defecto.
Una opción adicional del comando status nos permite listar de forma numerada las reglas activas del firewall, para ellos ejecutamos la siguiente línea:
sudo ufw status numbered
También podemos conocer las reglas agregadas al firewall antes de habilitarlo usando el siguiente comando:
sudo ufw show added
Además, podemos ver los puertos en los cuales se están escuchando conexiones activamente:
sudo ufw show listening
Esto nos basta para conocer el estado general de nuestro firewall, ahora vamos a ver como gestionar el servicio de cara al sistema operativo.
Al igual que con el servicio, el estado del firewall también puede ser gestionado, podemos habilitar, reiniciar o detener las actividades de cortafuegos.
Para activar el cortafuegos y que además se inicie con el sistema operativo, ejecutamos la instrucción:
sudo ufw enable
Para desactivar el cortafuegos y que además no se inicie con el sistema operativo:
sudo ufw disable
Por otra parte, cuando realizamos algunas operaciones, se requiere reiniciar o “recargar” el firewall, para ello podemos ejecutar el siguiente comando:
sudo ufw reload
En nuestro sistema pueden haber multitud de aplicaciones que aceptan conexiones para brindar un flujo de datos, podemos mejorar la gestión del cortafuegos a través del uso de los llamados perfiles de aplicación, que son archivos de texto que describen reglas específicas para un aplicación. Muchas aplicaciones traen sus perfiles por defecto, por ejemplo, los servidores web.
Para listar los perfiles de aplicación disponibles en nuestros sistema podemos usar el comando:
sudo ufw app list
Para obtener información detallada de uno de los perfiles podemos ejecutar:
sudo ufw app info NombrePerfil
Si el nombre del perfil contiene espacios debemos usar comillas, por ejemplo:
sudo ufw app info "Nombre Perfil"
Para habilitar (activar) un perfil de aplicación tenemos el siguiente comando:
sudo ufw allow NombrePerfil
Mientras que para deshabilitar un perfil tenemos:
sudo ufw delete allow NombrePerfil
Los archivos que definen los perfiles de las aplicaciones pueden hallarse en el directorio:
/etc/ufw/applications.d/
Estos perfiles son archivos de texto plano con extensión .profile y con una estructura como la siguiente:
[Apache Full]
title=Web Server (HTTP,HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80,443/tcp
Donde el nombre del perfil es el que aparece entre [].
Si hemos realizado algún cambio en los archivos de perfiles podemos ejecutar el siguiente comando para que el motor de reglas actualize su vigilancia:
sudo ufw app update NombrePerfil
En esta sección vamos a estar revisando el paso a paso para la gestión de las reglas de firewall, cómo permitir conexiones a puertos o aplicaciones y cómo realizar bloqueos, tanto a direcciones IP específicas o a subredes enteras.
La notación para habilitar conexiones TCP a un puerto es la siguiente (a modo de ejemplo):
sudo ufw allow 22/tcp
Por otra parte, si no especificamos el protocolo, las conexiones se habilitaran tanto en UDP como TCP.
# Habilitar conexión en el puerto 22 para UDP y TCP
sudo ufw allow 22
Como vimos en el apartado de perfiles, para permitir conexiones a aplicaciones descritas en un archivo de perfil, solo necesitamos ejecutar la siguiente instrucción:
sudo ufw allow NombrePerfil
Si el nombre del perfil contiene espacios, usamos comillas dobles:
sudo ufw allow "nombre del perfil"
Por otra parte, podemos aceptar conexiones hacia una aplicación, que provengan de una dirección IP específica. Para ello necesitamos identificar la dirección IP pública que deseamos configurar, lo podemos hacer con la línea:
curl -4 icanhazip.com
Luego podemos ejecutar la siguiente instrucción para relaciónar un perfil con esa dirección IP:
sudo ufw allow from <IP> to any app <NombrePerfil> comment "comentario"
Si por alguna razón deseamos bloquear una dirección IP específica, pdemos ejecutar la siguiente instrucción:
sudo ufw deny from <IP>
No tenemos que realizar bloqueos una a una las direcciones IP, podemos bloquear las conexiones de una subred completa:
sudo ufw deny from <IP/mask>
Por ejemplo:
sudo ufw deny from 203.0.113.100/24
Como vimos en la sección de conocer el estado del firewall, si deseamos listar las reglas presentes en el firewall, podemos ejecutar la siguiente instrucción:
sudo ufw status numbered
Para aliminar una regla de nuestro firewall, primero debemos conocer su identificador como vimos en la sección anterior y, posteriormente, ejecutar la siguiente línea:
sudo ufw delete <ID>
Un aspecto muy importante, casi de cualquier software, es la información de logging, que nos permite analizar en tiempo real o posteriormente las transacciones y los eventos que han ocurrido. En este apartado veremos como se gestionan con UFW.
Al igual que con la mayoría de aplicaciones que se ejecutan en un servidor Linux, los logs suelen almacenarse en el directorio /var. En el caso de ufw los logs pueden encontrarse en la ruta:
/var/log/ufw.log
Podemos saber si el logging de la aplicación está activo o apagado mediante el comando:
sudo ufw status verbose
Tras la ejecución obtendremos una salida como la siguiente:
Status: active
Logging: off
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
...
Podemos encender el logging con:
sudo ufw logging on
Podemos detener el logging con:
sudo ufw logging off
Similar a otras herramientas, UFW cuenta con diferentes niveles de logging que nos muestran diferentes niveles de información en los logs. A continuación se listan los 5 niveles desde la documentación oficial:
off: Means logging is disabled.low: Will store logs related to blocked packets that do not match the current firewall rules and will show log entries related to logged rules.medium: In addition to all the logs offered by the low level, you get logs for invalid packets, new connections, and logging done through rate limiting.high: Will include logs for packets with rate limiting and without rate limiting.full: This level is similar to the high level but does not include the rate limiting.En la descripción del nivel low puedes ver que se menciona logged rules, y es que es posible parametrizar las reglas para que guarden un registro cuando un paquete coincide con la regla, no todas las interesacciones con las reglas generan logs, para activar esta opción manualmente en una regla usamos la opción log (registra la primera interacción) o log-all (registra todos los paquetes que interactuan con la regla), veamos la sintaxis:
sudo ufw allow log <puerto o perfil>
Si quetemos cambiar el nivel de logging de nuestro firewall ejecutamos la siguiente sintaxis, donde logging_level representa uno de los valores listados anteriormente.
sudo ufw logging <logging_level>
Por ejemplo:
sudo ufw logging medium
Verificamos el cambio con:
sudo ufw status verbose
Esto ha sido todo por hoy, con los conocimientos expuestos puedes gestionar una gran parte de la seguridad que se requiere para mantener un sistema expuesto a internet. Pero esto no es suficiente, existen muchas amenzas ahí afuera y también herramientas que nos ayudan a gestionarlas. En la próxima entrada hablaremos de un mecanismo para ayudarnos a bloquear automáticamente ataques de fuerza bruta.
Autor: Julio César Echeverri M.