Logo

Mi Blog con Emacs y Esteroides

Emacs, IA y Linux: Poder y Simplicidad en tu Flujo de Trabajo

mybloggingnotes@gmail.com


15/04/2025

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.

ufw-components.png

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:

  1. Crea un nuevo archivo: C-x C-f ~/firewall-config.org RET
  2. 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:

  1. Documentación integrada: El código y su explicación se mantienen juntos
  2. Reproducibilidad: Puedes recrear exactamente la misma configuración en diferentes servidores
  3. Control de versiones: Puedes mantener tu configuración en un sistema de control de versiones como Git
  4. 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

,* 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:

ufw-components.png
Categoría: linux ubuntu seguridad firewall ufw emacs orgmode tutoriales

Suscribirse al Feed RSS | Mapa del Sitio

© 2025 M.Castillo | Hecho con ❤️ en Emacs y org-static-blog

📊 Estadísticas Visit counter For Websites