Guía Práctica: Configuración de UFW en Ubuntu con Scripts y Org Mode
Introducción
La seguridad es un aspecto crítico para cualquier servidor Linux. UFW (Uncomplicated Firewall) proporciona una interfaz simplificada para configurar un firewall robusto en sistemas Ubuntu. En este artículo, nos centraremos en la parte práctica: cómo crear, configurar y ejecutar un script de configuración de UFW, todo gestionado desde Emacs con Org Mode.
Este enfoque práctico te permitirá:
- Documentar tu configuración de seguridad
- Automatizar la implementación de reglas
- Mantener un registro de los cambios realizados
- Compartir fácilmente tu configuración con otros administradores
Está diseñado para administradores de sistemas y entusiastas de Linux que utilizan Emacs como parte de su flujo de trabajo.
Prerrequisitos
Antes de comenzar, asegúrate de tener:
- Ubuntu 22.04 LTS o superior
- Emacs 27+ con Org Mode
- Acceso root o privilegios sudo
- UFW instalado (
sudo apt install ufw) - Conexión SSH configurada (si trabajas remotamente)
Creación del Script en Org Mode
Comenzaremos creando un archivo Org Mode que contendrá nuestro script y documentación. En Emacs:
- Crea un nuevo archivo:
C-x C-f ~/firewall-config.org RET - Añade la estructura básica del documento
#+TITLE: Configuración de UFW para Servidores Ubuntu #+AUTHOR: Tu Nombre #+DATE: 2025-04-15 #+PROPERTY: header-args:bash :tangle ufw-secure-config.sh :comments both * Descripción del Script Este script configura UFW en Ubuntu para proteger contra amenazas comunes, incluyendo botnets, ataques de fuerza bruta y escaneos de puertos. Está diseñado para servidores de producción con exposición a Internet. * Script de Configuración ** Cabecera y verificaciones iniciales
El atributo :tangle ufw-secure-config.sh indica a Org Mode que extraiga (tangle) el código en un archivo ejecutable cuando lo solicitemos.
Desarrollo del Script de Configuración UFW
Ahora desarrollaremos el script por secciones, añadiendo cada parte como un bloque de código Org Babel. Esto nos permite tener el script documentado y listo para ejecutar.
Sección 1: Cabecera y verificaciones
Añade este bloque después de la sección "Cabecera y verificaciones iniciales":
#+BEGIN_SRC bash #!/bin/bash # Script: ufw-secure-config.sh # Descripción: Configuración segura de UFW para servidores Ubuntu # Autor: Tu Nombre # Fecha: 2025-04-15 # Versión: 1.0 # Colores para mejor legibilidad RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # Sin Color echo -e "${GREEN}=== Script de Configuración Segura de UFW ===${NC}" echo "Iniciando configuración en $(date)" # Verificar privilegios de root if [[ $EUID -ne 0 ]]; then echo -e "${RED}Este script requiere privilegios de root.${NC}" echo "Por favor, ejecuta con sudo: sudo bash $0" exit 1 fi # Verificar que UFW esté instalado if ! command -v ufw &> /dev/null; then echo -e "${YELLOW}UFW no está instalado. Instalando...${NC}" apt update && apt install -y ufw if [ $? -ne 0 ]; then echo -e "${RED}Error instalando UFW. Abortando.${NC}" exit 1 fi echo -e "${GREEN}UFW instalado correctamente.${NC}" else echo -e "${GREEN}UFW ya está instalado.${NC}" fi # Crear directorio para backups si no existe BACKUP_DIR="/root/ufw-backups" if [ ! -d "$BACKUP_DIR" ]; then mkdir -p "$BACKUP_DIR" echo "Directorio para backups creado: $BACKUP_DIR" fi #+END_SRC ** Sección 2: Backup y reinicio de configuración
Sección 2: Backup y reinicio de configuración
Continuamos con la siguiente sección:
#+BEGIN_SRC bash # Crear backup de reglas actuales TIMESTAMP=$(date +%F-%H%M%S) BACKUP_FILE="$BACKUP_DIR/ufw-backup-$TIMESTAMP.rules" echo -e "${YELLOW}Creando backup de reglas actuales en:${NC} $BACKUP_FILE" ufw status verbose > "$BACKUP_FILE" # Guardar configuración actual de iptables para referencia iptables-save > "$BACKUP_DIR/iptables-backup-$TIMESTAMP.rules" echo "Backup de iptables guardado en: $BACKUP_DIR/iptables-backup-$TIMESTAMP.rules" # Reiniciar UFW para configuración limpia echo -e "${YELLOW}Reiniciando UFW para iniciar configuración limpia...${NC}" ufw --force reset echo -e "${GREEN}UFW reiniciado correctamente.${NC}" #+END_SRC ** Sección 3: Configuración de políticas básicas
Sección 3: Configuración de políticas básicas
Configuramos las políticas predeterminadas y activamos el logging:
#+BEGIN_SRC bash echo -e "\n${GREEN}=== Configurando políticas básicas ===${NC}" # Establecer políticas predeterminadas echo "Configurando política por defecto: denegar tráfico entrante" ufw default deny incoming echo "Configurando política por defecto: permitir tráfico saliente" ufw default allow outgoing # Configurar nivel de log echo "Configurando nivel de logging: medio" ufw logging medium echo -e "${GREEN}Políticas básicas configuradas correctamente.${NC}" #+END_SRC ** Sección 4: Reglas para servicios esenciales
Sección 4: Reglas para servicios esenciales
Configuramos las reglas para los servicios principales:
#+BEGIN_SRC bash echo -e "\n${GREEN}=== Configurando reglas para servicios esenciales ===${NC}" # SSH - Limitar intentos para prevenir ataques de fuerza bruta echo "Configurando SSH con límite de conexiones..." ufw limit proto tcp from any to any port 22 comment 'SSH con límite de conexiones' # HTTP/HTTPS para servidores web echo "Configurando acceso web (HTTP/HTTPS)..." ufw allow proto tcp from any to any port 80 comment 'HTTP' ufw allow proto tcp from any to any port 443 comment 'HTTPS' # DNS para resolución de nombres echo "Configurando acceso DNS..." ufw allow proto udp from any to any port 53 comment 'DNS' # NTP para sincronización horaria echo "Configurando acceso NTP..." ufw allow proto udp from any to any port 123 comment 'NTP' echo -e "${GREEN}Servicios esenciales configurados.${NC}" #+END_SRC ** Sección 5: Protección contra amenazas comunes
Sección 5: Protección contra amenazas comunes
Añadimos reglas para mitigar amenazas específicas:
#+BEGIN_SRC bash echo -e "\n${GREEN}=== Configurando protección contra amenazas específicas ===${NC}" # Limitar intentos de conexión para HTTP/HTTPS (protección básica contra DDoS) echo "Configurando límites de conexión para servicios web..." ufw limit proto tcp from any to any port 80 comment 'Limitar HTTP' ufw limit proto tcp from any to any port 443 comment 'Limitar HTTPS' # Bloquear puertos comúnmente explotados por botnets y malware echo "Bloqueando puertos vulnerables comúnmente usados por botnets..." ufw deny proto tcp from any to any port 23 comment 'Telnet, usado por botnets' ufw deny proto tcp from any to any port 445 comment 'SMB, objetivo de ransomware' ufw deny proto tcp from any to any port 1433 comment 'MS-SQL, explotado por botnets' ufw deny proto tcp from any to any port 3389 comment 'RDP, objetivo común' ufw deny proto udp from any to any port 1900 comment 'UPnP, usado en DDoS' # Bloquear rangos de puertos efímeros sospechosos echo "Bloqueando rangos de puertos sospechosos..." ufw deny proto tcp from any to any port 49152:65535 comment 'Puertos efímeros sospechosos' # Limitar ICMP para prevenir ataques de flood echo "Limitando tráfico ICMP..." ufw limit proto icmp from any to any comment 'Limitar ping' echo -e "${GREEN}Protección contra amenazas comunes configurada.${NC}" #+END_SRC ** Sección 6: Bloqueo de IPs maliciosas
Sección 6: Bloqueo de IPs maliciosas
Bloqueamos rangos de IPs conocidos por actividades maliciosas:
#+BEGIN_SRC bash echo -e "\n${GREEN}=== Configurando bloqueo de IPs maliciosas ===${NC}" # Nota: Estas son IPs de ejemplo. En producción, usa listas actualizadas. echo "Bloqueando rangos de IPs conocidos por actividades maliciosas..." # Ejemplos de rangos sospechosos (reemplazar con datos actualizados en producción) ufw deny from 185.220.101.0/24 comment 'Rango de IPs sospechosas - Tor exit nodes' ufw deny from 45.148.10.0/24 comment 'Rango de IPs de botnets reportadas' ufw deny from 91.134.0.0/16 comment 'Fuente conocida de ataques' # Opción: Descomentar y modificar para actualizar desde fuente externa # echo "Descargando lista actualizada de IPs maliciosas..." # curl -s https://ejemplo.com/ip-blocklist.txt | while read ip; do # ufw deny from $ip comment 'IP maliciosa - lista externa' # done echo -e "${YELLOW}Nota: Considera actualizar regularmente la lista de IPs bloqueadas.${NC}" echo -e "${GREEN}Bloqueo de IPs maliciosas configurado.${NC}" #+END_SRC ** Sección 7: Activación del firewall
Sección 7: Activación del firewall
Finalmente, activamos el firewall y mostramos el estado:
#+BEGIN_SRC bash echo -e "\n${GREEN}=== Activando UFW ===${NC}" # Habilitar UFW echo "Activando firewall..." ufw --force enable # Verificar estado echo -e "\n${GREEN}=== Estado final de UFW ===${NC}" ufw status verbose echo -e "\n${GREEN}=== Configuración completada exitosamente ===${NC}" echo "Fecha y hora: $(date)" echo -e "${YELLOW}Recomendaciones:${NC}" echo "1. Revisa periódicamente /var/log/ufw.log para detectar actividad sospechosa" echo "2. Considera implementar Fail2Ban como protección adicional" echo "3. Actualiza las reglas regularmente según evolucionen las amenazas" exit 0 #+END_SRC * Utilización del Script ** Generación del script ejecutable
Utilización del Script desde Org Mode
Ahora que tenemos nuestro script documentado en Org Mode, vamos a ver cómo utilizarlo.
Generación del script ejecutable
Para generar el archivo ejecutable a partir de nuestro documento Org:
Para extraer (tangle) el script desde este documento Org Mode: 1. Posiciona el cursor en cualquier parte del documento 2. Ejecuta: ~M-x org-babel-tangle~ (o usa el atajo ~C-c C-v t~) 3. Esto creará el archivo ~ufw-secure-config.sh~ en el mismo directorio Alternativamente, puedes ejecutar esto directamente como un bloque de código: #+BEGIN_SRC emacs-lisp :results silent (org-babel-tangle) #+END_SRC Una vez extraído, hazlo ejecutable: #+BEGIN_SRC bash :dir . chmod +x ufw-secure-config.sh ls -la ufw-secure-config.sh #+END_SRC
Ejecución del script
Añade esta sección para documentar la ejecución:
** Ejecución del script El script debe ejecutarse con privilegios de superusuario: #+BEGIN_SRC bash :dir . :results output :eval no sudo ./ufw-secure-config.sh #+END_SRC Nota: El script realizará las siguientes acciones: 1. Verificará los privilegios y la instalación de UFW 2. Creará un backup de las reglas existentes 3. Reiniciará la configuración de UFW 4. Establecerá políticas predeterminadas seguras 5. Configurará reglas para servicios esenciales 6. Implementará protecciones contra amenazas comunes 7. Bloqueará IPs maliciosas conocidas 8. Activará el firewall con la nueva configuración * Personalización del Script Puedes personalizar este script para adaptarlo a tus necesidades específicas: ** Servicios adicionales Para añadir reglas para otros servicios, agrega líneas como estas en la Sección 4: #+BEGIN_SRC bash :eval no # FTP (si es necesario) ufw allow proto tcp from any to any port 21 comment 'FTP' # Correo electrónico ufw allow proto tcp from any to any port 25,465,587 comment 'SMTP' ufw allow proto tcp from any to any port 110,995 comment 'POP3' ufw allow proto tcp from any to any port 143,993 comment 'IMAP' # Base de datos (solo desde redes confiables) ufw allow proto tcp from 192.168.1.0/24 to any port 3306 comment 'MySQL desde LAN' #+END_SRC ** Restricción por origen Para permitir servicios solo desde ciertas IPs o redes: #+BEGIN_SRC bash :eval no # Acceso SSH solo desde oficina ufw allow proto tcp from 203.0.113.0/24 to any port 22 comment 'SSH desde oficina' # Panel de administración solo desde IPs específicas ufw allow proto tcp from 203.0.113.10 to any port 8080 comment 'Admin desde IP confiable' #+END_SRC
Monitoreo y Mantenimiento
Añade esta sección para completar el post:
* Monitoreo y Mantenimiento Una vez configurado el firewall, es importante monitorizarlo y mantenerlo: ** Verificación del estado Para verificar el estado actual del firewall: #+BEGIN_SRC bash :eval no sudo ufw status verbose #+END_SRC ** Monitoreo de logs Para monitorizar actividad sospechosa: #+BEGIN_SRC bash :eval no # Ver últimas entradas del log en tiempo real sudo tail -f /var/log/ufw.log # Buscar intentos de conexión bloqueados sudo grep "BLOCK" /var/log/ufw.log # Contar intentos bloqueados por IP (TOP 10) sudo grep "BLOCK" /var/log/ufw.log | grep -oE "SRC=[0-9.]+" | sort | uniq -c | sort -nr | head -10 #+END_SRC ** Actualización de reglas Cuando necesites actualizar las reglas: #+BEGIN_SRC bash :eval no # Ver reglas numeradas sudo ufw status numbered # Eliminar una regla específica sudo ufw delete 3 # Elimina la regla número 3 # Añadir una nueva regla sudo ufw allow proto tcp from any to any port 8443 comment 'HTTPS alternativo' # Aplicar cambios sudo ufw reload #+END_SRC * Integración con cron para Actualizaciones Automáticas Para mantener tu lista de IPs bloqueadas actualizada, puedes crear un script separado y programarlo con cron: #+BEGIN_SRC org #+BEGIN_SRC bash :tangle update-blocklist.sh :comments both #!/bin/bash # Script: update-blocklist.sh # Descripción: Actualiza la lista de IPs bloqueadas en UFW # Autor: Tu Nombre # Fecha: 2025-04-15 # Verificar privilegios if [[ $EUID -ne 0 ]]; then echo "Este script requiere privilegios de root." exit 1 fi # Directorio para logs LOG_DIR="/var/log/ufw-updates" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/update-$(date +%F).log" echo "Iniciando actualización de listas de bloqueo en $(date)" >> "$LOG_FILE" # Descargar lista actualizada (ejemplo) echo "Descargando lista actualizada..." >> "$LOG_FILE" curl -s https://ejemplo.com/ip-blocklist.txt > /tmp/new-blocklist.txt # Eliminar reglas antiguas con comentario específico echo "Eliminando reglas antiguas..." >> "$LOG_FILE" for ip in $(ufw status | grep "lista externa" | awk '{print $3}'); do ufw delete deny from $ip >> "$LOG_FILE" 2>&1 done # Añadir nuevas IPs echo "Añadiendo nuevas IPs..." >> "$LOG_FILE" count=0 while read ip; do if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(/[0-9]{1,2})?$ ]]; then ufw deny from $ip comment 'IP maliciosa - lista externa' >> "$LOG_FILE" 2>&1 ((count++)) fi done < /tmp/new-blocklist.txt echo "Actualización completada. $count IPs bloqueadas." >> "$LOG_FILE" echo "Fecha y hora de finalización: $(date)" >> "$LOG_FILE" # Limpiar archivos temporales rm /tmp/new-blocklist.txt exit 0 #+END_SRC #+END_SRC Programa la ejecución con cron: #+BEGIN_SRC bash :eval no # Editar crontab sudo crontab -e # Añadir línea para ejecutar cada día a las 3 AM 0 3 * * * /ruta/a/update-blocklist.sh #+END_SRC
Conclusión y Recursos Adicionales
Finalmente, añade una conclusión y recursos adicionales:
#+BEGINSRC org ,* Conclusión
Configurar UFW a través de scripts gestionados con Org Mode en Emacs ofrece varias ventajas:
- Documentación integrada: El código y su explicación se mantienen juntos
- Reproducibilidad: Puedes recrear exactamente la misma configuración en diferentes servidores
- Control de versiones: Puedes mantener tu configuración en un sistema de control de versiones como Git
- Adaptabilidad: Fácil de modificar para diferentes entornos (desarrollo, pruebas, producción)
Esta aproximación combina la potencia de Emacs y Org Mode con las necesidades prácticas de la administración de sistemas, creando un flujo de trabajo eficiente y bien documentado para la gestión de la seguridad.
Recuerda que la seguridad es un proceso continuo, no un estado final. Mantén tus reglas de firewall actualizadas, revisa regularmente los logs y adapta tu configuración según evolucionen las amenazas.
,* Recursos Adicionales
- Documentación oficial de UFW en Ubuntu
- Wiki de Arch Linux sobre UFW
- Documentación de Org Babel
- AbuseIPDB - Base de datos de IPs maliciosas
,* Notas de la versión
- Versión 1.0 (2025-04-15): Publicación inicial
- Próximas mejoras planificadas: Integración con Fail2Ban, reglas para Docker, configuración para IPv6
Diagrama de Componentes de la Configuración
Este diagrama muestra los componentes principales que conforman la configuración de seguridad con UFW: