20 junio, 2025

Introducción y Preparación del Entorno

En un servidor Fedora 36, mantener un antivirus activo permite detectar malware antes de que se propague o cause daños irreversibles. Aunque Linux es menos propenso a virus que otros sistemas, un escaneo periódico aporta una capa extra de seguridad, sobre todo si compartes archivos con entornos Windows o guardas repositorios de código de terceros.

1. Elección de la herramienta: ClamAV

ClamAV es un antivirus de código abierto, muy extendido en servidores Linux. Ofrece:

  • Base de datos de firmas actualizable con freshclam.
  • Modo demonio (clamd) para escaneos más rápidos.
  • Integración con systemd para gestión de servicios y logs.

2. Instalación en Fedora 36

Abre una terminal y ejecuta:

sudo dnf install -y clamav clamav-update clamd
  • clamav: motor de detección.
  • clamav-update: actualizador de firmas (freshclam).
  • clamd: demonio que acelera los escaneos cuando utilizas clamdscan.

3. Actualización de la base de datos de firmas

Antes de escanear, actualiza la base de datos:

sudo freshclam

Puedes automatizar esta tarea añadiendo un cron (o dejando que Fedora ejecute el cron que viene preconfigurado para freshclam).

4. Habilitar e iniciar el demonio de escaneos

Para usar clamdscan y aprovechar el demonio, levanta el servicio con systemd:

sudo systemctl enable --now clamd@scan.service
  • enable: marca el servicio para que arranque automáticamente en cada reinicio.
  • --now: lo inicia inmediatamente.
  • El sufijo @scan hace referencia al archivo /etc/clamd.d/scan.conf, donde se definen rutas y opciones para el demonio.

Ventaja: Al tener clamd corriendo en segundo plano, cada llamada a clamdscan se conecta a él por socket, ahorrando el sobrecosto de arrancar el motor en cada ejecución.


Escaneo Detallado, Gestión de Logs y Resolución de Errores

1. Ejecutar un escaneo completo (solo lectura)

Para lanzar un análisis completo de tu sistema sin modificar ni borrar archivos, utilizamos clamscan con estos parámetros:

sudo clamscan -r / \
  --infected \
  --exclude-dir="^/sys" \
  --exclude-dir="^/proc" \
  --exclude-dir="^/dev" \
  --exclude-dir="^/run" \
  --log=/var/log/clamav/scan.log
  • sudo
    Garantiza que el escáner tenga permiso para leer todos los ficheros de /, incluidos aquellos protegidos por permisos de usuario.
  • -r /
    Modo recursivo desde la raíz.
  • --infected
    Solo lista en pantalla los archivos con detección positiva (evita el “ruido” de los archivos limpios).
  • --exclude-dir="^/sys", etc.
    Omite directorios virtuales del kernel, que además suelen lanzar errores de permiso o no contienen datos persistentes.
  • --log=/var/log/clamav/scan.log
    Vuelca el reporte completo a un fichero para revisión posterior.

Nota: Las barras invertidas (\) al final de cada línea permiten partir el comando en varias líneas por legibilidad, pero internamente es equivalente a una sola línea continua.


2. Interpretar el fichero de log

Una vez terminado el escaneo, revisa el contenido de /var/log/clamav/scan.log:

sudo less /var/log/clamav/scan.log

Dentro verás líneas como:

/ruta/al/archivo/ejemplo.exe: Win.Malware.Generic FOUND
----------- SCAN SUMMARY -----------
Known viruses: 543210
Scanned directories: 345
Scanned files: 12345
Infected files: 1
Data scanned: 1.23 GB
Time: 120.345 sec (1 m 0.345 s)
  • FOUND indica amenaza confirmada.
  • El SCAN SUMMARY ofrece métricas de cobertura y rendimiento.

3. Solución al error de permisos en el log

Si obtienes:

ERROR: Can't open /var/log/clamav/scan.log in append mode (check permissions!).
ERROR: Problem with internal logger.

significa que clamscan no puede escribir en el fichero o directorio. Para corregirlo:

  1. Crear el directorio y ficherosudo mkdir -p /var/log/clamav sudo touch /var/log/clamav/scan.log
    • mkdir -p crea toda la ruta, incluso si alguno de los niveles no existía.
    • touch crea el fichero vacío si no existía.
  2. Ajustar permisos sudo chown root:root /var/log/clamav /var/log/clamav/scan.log sudo chmod 755 /var/log/clamav sudo chmod 644 /var/log/clamav/scan.log Así, root puede escribir y tú (o el demonio) podrás leer los logs sin problema.
  3. (Si usas SELinux en modo enforcing)
    Restaura el contexto por defecto para que no bloquee la escritura: sudo restorecon -Rv /var/log/clamav

4. Significado de mkdir -p

El flag -p en mkdir:

  • Construye toda la ruta: si pides mkdir -p /a/b/c, crea también /a y /a/b si no existen.
  • No falla si existe: si algún nivel ya está presente, lo deja tal cual y continúa sin error.

Con mkdir sin -p, fallaría con “No such file or directory” si faltan niveles, o “File exists” si ya está creado.


Programación Automática, Notificaciones y Buenas Prácticas

1. Programar escaneos periódicos con Cron

Para no tener que lanzar manualmente los análisis, crea una entrada en el crontab de root:

sudo crontab -e

Añade, por ejemplo, este trabajo para ejecutar un escaneo nocturno diario a las 3 AM:

0 3 * * * clamscan -r /home \
  --infected \
  --exclude-dir="^/sys" \
  --exclude-dir="^/proc" \
  --exclude-dir="^/dev" \
  --exclude-dir="^/run" \
  --log=/var/log/clamav/home-scan-$(date +\%F).log
  • 0 3 * * * → a las 03:00 cada día.
  • --log=…$(date +\%F).log → nombre de log con fecha (2025-05-30.log), facilita archivado.

Si prefieres usar el demonio (clamd), sustituye clamscan por clamdscan --fdpass --no-summary.


2. Envío de notificaciones por correo

Para recibir un aviso si hay detecciones, instala y configura un MTA ligero (por ejemplo ssmtp o msmtp) y añade al crontab:

0 3 * * * clamscan -r /home --infected \
    --exclude-dir="^/sys" --exclude-dir="^/proc" \
    --exclude-dir="^/dev" --exclude-dir="^/run" \
    | grep FOUND | mail -s "Alerta ClamAV $(date +\%F)" admin@tudominio.com
  • | grep FOUND → filtra solo las líneas con detecciones.
  • mail -s … → envía correo con asunto que incluye la fecha.

3. Alternativa: timers de systemd

Si prefieres systemd en lugar de cron, crea un servicio y un timer:

  1. Servicio (/etc/systemd/system/clam-scan.service): [Unit] Description=Escaneo ClamAV diario [Service] Type=oneshot ExecStart=/usr/bin/clamscan -r /home --infected --exclude-dir="^/sys" \ --exclude-dir="^/proc" --exclude-dir="^/dev" --exclude-dir="^/run" \ --log=/var/log/clamav/home-scan-$(date +%%F).log
  2. Timer (/etc/systemd/system/clam-scan.timer): [Unit] Description=Timer para escaneo diario ClamAV [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now clam-scan.timer

4. Mejores prácticas de mantenimiento

  • Actualización continua de firmas
    Asegúrate de que freshclam corra al menos cada hora (viene por defecto en /etc/cron.d/freshclam).
  • Exclusiones inteligentes
    Limita el escaneo de grandes bases de datos o directorios de alto tráfico (/var/lib/mysql, /var/lib/postgresql) para evitar impacto en rendimiento.
  • Uso de clamd para cargas altas
    Bajo entornos con muchos ficheros, el modo demonio reduce significativamente el tiempo de escaneo.
  • Rotación y archivado de logs
    Configura logrotate para /var/log/clamav/*.log y evita llenar el disco.
  • Monitoreo de integridad
    Complementa ClamAV con herramientas como AIDE o Tripwire para detectar cambios no autorizados en ficheros.
  • Revisión periódica de informes
    Más allá de las alertas automáticas, inspecciona semanalmente los resúmenes para detectar falsos positivos o tendencias inusuales.

Integración Avanzada y Scripts de Automatización

1. Integración con sistemas de tickets (por ejemplo, Jira)

Para que detecciones de ClamAV creen automáticamente incidencias en tu gestor de tickets:

  1. Script de enlace con la API de Jira
    Crea un script en Bash o Python que, al encontrar detecciones, llame al endpoint de creación de incidencias de Jira. #!/usr/bin/env bash LOG="/var/log/clamav/scan-latest.log" JIRA_URL="https://tudominio.atlassian.net/rest/api/3/issue" AUTH="user:api_token" PROJECT_KEY="SEC" ISSUE_TYPE="Bug" # Filtrar detecciones DETECTS=$(grep FOUND "$LOG") if [[ -n "$DETECTS" ]]; then # Construir JSON de la incidencia PAYLOAD=$(jq -n \ --arg proj "$PROJECT_KEY" \ --arg itype "$ISSUE_TYPE" \ --arg desc "ClamAV detectó:\n$DETECTS" \ '{fields: {project: {key: $proj}, summary: "Alerta ClamAV", description: $desc, issuetype: {name: $itype}}}') # Enviar a Jira curl -s -u "$AUTH" -X POST -H "Content-Type: application/json" \ --data "$PAYLOAD" "$JIRA_URL" fi
  2. Programarlo
    Ejecuta este script tras cada escaneo, ya sea como parte de un cron job o como ExecStartPost= en un servicio systemd.

2. Notificaciones en Slack mediante Webhook

Para recibir alertas en un canal de Slack cuando haya detecciones:

  1. Crear un Incoming Webhook en tu espacio de Slack y copia la URL.
  2. Script de notificación: #!/usr/bin/env bash LOG="/var/log/clamav/scan-latest.log" SLACK_WEBHOOK="https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ" DETECTS=$(grep FOUND "$LOG") if [[ -n "$DETECTS" ]]; then PAYLOAD=$(jq -n \ --arg text "*Alerta ClamAV* detecciones:\n$DETECTS" \ '{text: $text}') curl -s -X POST -H 'Content-type: application/json' \ --data "$PAYLOAD" "$SLACK_WEBHOOK" fi
  3. Incluirlo en tu flujo tras clamscan o clamdscan en cron o timers.

3. Script de automatización completo

Un ejemplo de scan_and_notify.sh que actualiza firmas, escanea y notifica:

#!/usr/bin/env bash
LOGDIR="/var/log/clamav"
LATEST_LOG="$LOGDIR/scan-$(date +%F_%H%M).log"
SLACK_WEBHOOK="https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"

# 1. Actualizar firmas
freshclam

# 2. Escaneo completo
clamscan -r /home --infected --exclude-dir="^/proc" \
  --exclude-dir="^/sys" --exclude-dir="^/dev" \
  --exclude-dir="^/run" --log="$LATEST_LOG"

# 3. Notificar si hay detecciones
DETECTS=$(grep FOUND "$LATEST_LOG")
if [[ -n "$DETECTS" ]]; then
  PAYLOAD=$(jq -n --arg text "*Alerta ClamAV* $(basename $LATEST_LOG):\n$DETECTS" '{text: $text}')
  curl -s -X POST -H 'Content-type: application/json' \
    --data "$PAYLOAD" "$SLACK_WEBHOOK"
fi

Luego, añade al crontab de root:

0 * * * * /usr/local/bin/scan_and_notify.sh

(asumiendo que el script está en /usr/local/bin y es ejecutable).


4. Envío de logs a un SIEM (por ejemplo, Splunk o ELK)

Configura rsyslog para reenviar las entradas de /var/log/clamav/*.log a tu servidor de logs central:

  1. Archivo /etc/rsyslog.d/10-clamav.conf: $InputFileName /var/log/clamav/*.log $InputFileTag clamav: $InputFileStateFile stat-clamav $InputFileSeverity info $InputFileFacility local6 $InputRunFileMonitor local6.* @@splunk-server:514
  2. Reinicia rsyslog: sudo systemctl restart rsyslog

5. Escaneo de contenedores Docker

Para analizar volúmenes Docker o imágenes:

  • Instala la imagen oficial de ClamAV: docker pull mkodockx/docker-clamav
  • Escanear un volumen montando la carpeta: docker run --rm -v /host/data:/data mkodockx/docker-clamav \ clamscan -r /data --infected
  • Escanear imágenes (con docker save): docker save nginx:latest | docker run -i mkodockx/docker-clamav clamscan --stdin

6. APIs y análisis en línea de archivos

Para ofrecer escaneo de archivos subidos en una aplicación web, puedes:

  1. Habilitar socket TCP en /etc/clamd.d/scan.conf: TCPSocket 3310 TCPAddr 0.0.0.0
  2. Usar una librería (por ejemplo, node-clam en Node.js o pyclamd en Python) para enviar archivos a clamd.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *