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 aclamdscan
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:
- Crear el directorio y fichero
sudo 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.
- 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. - (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:
- 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
- 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 quefreshclam
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
Configuralogrotate
para/var/log/clamav/*.log
y evita llenar el disco. - Monitoreo de integridad
Complementa ClamAV con herramientas comoAIDE
oTripwire
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:
- 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
- Programarlo
Ejecuta este script tras cada escaneo, ya sea como parte de un cron job o comoExecStartPost=
en un servicio systemd.
2. Notificaciones en Slack mediante Webhook
Para recibir alertas en un canal de Slack cuando haya detecciones:
- Crear un Incoming Webhook en tu espacio de Slack y copia la URL.
- 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
- Incluirlo en tu flujo tras
clamscan
oclamdscan
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:
- 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
- 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:
- Habilitar socket TCP en
/etc/clamd.d/scan.conf
:TCPSocket 3310 TCPAddr 0.0.0.0
- Usar una librería (por ejemplo,
node-clam
en Node.js opyclamd
en Python) para enviar archivos aclamd
.