Saltar a contenido

Detección de intrusiones con AIDE

AIDE (Advanced Intrusion Detection Environment) es un sistema de detección de intrusiones basado en host (HIDS) para sistemas Unix/Linux. Guarda una "foto" de los ficheros críticos del sistema y, al compararla después con el estado actual, detecta ficheros añadidos, modificados o eliminados sin permiso.

Cómo funciona

AIDE calcula un hash (huella) de los ficheros que se le indica y los guarda en una base de datos (línea base). En ejecuciones posteriores vuelve a calcular los hashes actuales y los compara contra la base: si un hash no coincide, significa que el contenido del fichero ha cambiado.

Los cambios se clasifican en:

  • added (+) — un fichero nuevo que no estaba en la base.
  • removed (-) — un fichero que estaba en la base y ya no existe.
  • changed (>) — un fichero cuyo contenido, permisos, propietario u otros atributos han cambiado.

Además de comprobar el contenido, puede vigilar atributos del sistema de ficheros (permisos, propietario, tamaño, etc.). Está pensado para detectar intrusiones: si un atacante consigue modificar un binario, plantarse una puerta trasera o alterar la configuración, el hash cambiará y AIDE lo notificará.

La configuración (qué se vigila y con qué profundidad) se define en /etc/aide/aide.conf (Ubuntu/Debian) o /etc/aide.conf (Fedora/RHEL). Funciona por lista blanca: solo se comprueba lo que se declara explícitamente, no todo el disco.

Instalar

sudo apt update
sudo apt install aide

 

apt instalará también aide-common (viene como Recommends, no como dependencia obligatoria, pero apt instala los Recommends por defecto). Esta guía no usa ni su config (+200 fragmentos automáticos, uno por servicio detectado, con una precedencia de reglas fácil de malinterpretar) ni sus wrappers (aideinit, aide.wrapper); escribimos nuestra propia config para saber exactamente qué se vigila y por qué. Si prefieres no instalarlo ni ocupar esos ~934 KB: sudo apt install --no-install-recommends aide, o si ya lo tienes: sudo apt purge aide-common.

En Ubuntu el binario aide no trae compilada una ruta de config por defecto — siempre hay que pasarle --config= explícito, esté instalado aide-common o no.

sudo dnf install aide

En Fedora/RHEL todo viene en un solo paquete: no existe aide-common ni wrappers adicionales. El binario se instala en /usr/sbin/aide.

Configurar

Reemplazar la config por defecto

/etc/aide/aide.conf ya viene con contenido de serie (lo pone aide-common al instalarse, con el @@x_include a los +200 fragmentos que no vamos a usar). Guarda una copia por si acaso y sustituye todo el contenido — no lo añadas al final:

sudo cp /etc/aide/aide.conf /etc/aide/aide.conf.dist
sudo vim /etc/aide/aide.conf

 

aide.conf está gestionado con ucf (el mecanismo de Debian para ficheros de config generados). Esto significa que si algún día actualizas el paquete aide-common y cambia su plantilla por defecto, ucf te preguntará qué hacer con la tuya (como con cualquier conffile) — no te la va a pisar en silencio. Puedes responder "mantener la tuya" tranquilamente.

/etc/aide.conf ya viene con contenido de serie al instalar el paquete aide. Guarda una copia por si acaso y sustituye todo el contenido — no lo añadas al final:

sudo cp /etc/aide.conf /etc/aide.conf.dist
sudo vim /etc/aide.conf

 

En Fedora/RHEL no existe ucf ni aide-common. El sistema gestiona el fichero como un conffile estándar de RPM: si modificas la config, el gestor de paquetes te preguntará qué hacer en la siguiente actualización.

Contenido:

# Config propia de AIDE — sin aide-common. En Ubuntu no compila una ruta
# de config por defecto: usa siempre --config=/etc/aide/aide.conf.
# En Fedora/RHEL la config está en /etc/aide.conf.
database_in=file:/var/lib/aide/aide.db
database_out=file:/var/lib/aide/aide.db.new
report_url=stdout

# R y L ya vienen con AIDE (R = hash completo, L = solo permisos y
# propietario, sin hashear contenido).

# --- Todo /etc con hash completo: es pequeño, el coste es despreciable
# y así no hay que acordarse de listar cada fichero suelto que toque
# el servidor (sshd_config.d, fail2ban, sysctl.d, limits.d, passwd,
# swapfile.swap...) — ya cae dentro de /etc ---
/etc R
!/etc/mtab$

# --- Arranque y kernel: objetivo clásico de rootkits/bootkits ---
/boot             R
/lib/modules      R
/usr/lib/modules  R

# --- Binarios y librerías del sistema: cambios aquí son sospechosos ---
/bin      R
/sbin     R
/usr/bin  R
/usr/sbin R
/usr/lib  R
/lib      R

# --- Lugares clásicos de persistencia (binarios sueltos, como un
# agente de monitorización si no lo deja bajo /etc/systemd/system) ---
/opt           R
/usr/local/bin R

# --- Accesos SSH fuera de /etc ---
/root/\.ssh                         R
/home/hosting/\.ssh/authorized_keys R

 

Ajusta /home/hosting/\.ssh/authorized_keys si tu usuario se llama distinto. No se vigila nada de /var ni /home/*/web — es un enfoque de lista blanca (solo lo que declaras aquí), no de lista negra sobre todo el sistema, así que no hace falta excluir el contenido de hosting: nunca se incluyó.

Verificar

AIDE se maneja desde la línea de comandos pasando siempre --config= para señalar el fichero de configuración. Requiere sudo porque lee directorios protegidos.

Crear la base de datos

Genela por primera vez sobre el sistema actual (--init genera aide.db.new):

sudo aide --config=/etc/aide/aide.conf --init
sudo aide --config=/etc/aide.conf --init

Activar esa base de datos como la referencia oficial — hay que renombrarla a aide.db para que --check la use:

sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Comprobar el estado

Compara el estado actual contra la base de datos. Recién creada, no debería salir ninguna diferencia:

sudo aide --config=/etc/aide/aide.conf --check
sudo aide --config=/etc/aide.conf --check

Actualizar la base

--update es --check + --init en un solo paso (evita escanear el sistema dos veces): comprueba los cambios y regenera la base nueva. Útil cuando haces cambios legítimos y quieres volver a dejar la línea base al día:

sudo aide --config=/etc/aide/aide.conf --update
sudo aide --config=/etc/aide.conf --update

Después de --update, activar la base regenerada como nueva referencia:

sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Automatizar

Como no usamos aide-common, tampoco tenemos su cron automático, así que montamos el nuestro para comprobar el sistema cada día y avisar por email si hay cambios.

  1. Instalar un cliente de correo para poder enviar avisos por email:

    sudo apt install mailutils
    
    sudo dnf install s-nail postfix
    
  2. Crear el script de comprobación diaria:

    sudo vim /usr/local/bin/aide-check.sh
    

    Contenido:

    #!/bin/bash
    # aide-check.sh - ejecuta el check de AIDE y avisa por email si hay cambios
    set -o pipefail
    
    AIDE_CONF="/etc/aide/aide.conf"
    LOG_FILE="/var/log/aide/aide-check.log"
    ALERT_EMAIL="tu-email@dominio.com"
    HOST="$(hostname)"
    
    mkdir -p /var/log/aide
    
    aide --config="$AIDE_CONF" --check 2>&1 | tee "$LOG_FILE"
    EXIT_CODE=$?
    
    # Códigos de salida de aide (se suman si hay varios tipos de cambio):
    # 0 = sin diferencias · 1 = ficheros nuevos · 2 = ficheros eliminados
    # 4 = ficheros modificados · 14+ = error genérico
    
    if [ "$EXIT_CODE" -ne 0 ]; then
        mail -s "AIDE: cambios detectados en ${HOST}" "$ALERT_EMAIL" < "$LOG_FILE"
        logger "AIDE: cambios detectados (código de salida: $EXIT_CODE)"
    else
        logger "AIDE: comprobación diaria sin cambios"
    fi
    
    #!/bin/bash
    # aide-check.sh - ejecuta el check de AIDE y avisa por email si hay cambios
    set -o pipefail
    
    AIDE_CONF="/etc/aide.conf"
    LOG_FILE="/var/log/aide/aide-check.log"
    ALERT_EMAIL="tu-email@dominio.com"
    HOST="$(hostname)"
    
    mkdir -p /var/log/aide
    
    aide --config="$AIDE_CONF" --check 2>&1 | tee "$LOG_FILE"
    EXIT_CODE=$?
    
    # Códigos de salida de aide (se suman si hay varios tipos de cambio):
    # 0 = sin diferencias · 1 = ficheros nuevos · 2 = ficheros eliminados
    # 4 = ficheros modificados · 14+ = error genérico
    
    if [ "$EXIT_CODE" -ne 0 ]; then
        mail -s "AIDE: cambios detectados en ${HOST}" "$ALERT_EMAIL" < "$LOG_FILE"
        logger "AIDE: cambios detectados (código de salida: $EXIT_CODE)"
    else
        logger "AIDE: comprobación diaria sin cambios"
    fi
    
    sudo chmod +x /usr/local/bin/aide-check.sh
    

     

    Cambia ALERT_EMAIL por tu dirección real. mail necesita un MTA local que entregue el correo; si el aviso no llega, revisa primero el MTA antes de sospechar del script.

  3. Programar la ejecución diaria (no hace falta crontab -e; un fichero en /etc/cron.d/ con el usuario incluido en la línea ya es válido):

    echo "0 3 * * * root /usr/local/bin/aide-check.sh" | sudo tee /etc/cron.d/aide-check
    

Y ahora qué

AIDE ya está vigilando la integridad del sistema. Junto con Lynis para la auditoría inicial, tienes las dos piezas de auditoría cubiertas. El siguiente paso es proteger el servidor con el resto de secciones de Seguridad.