Cómo Instalar ClamAV en Linux: Una Guía Técnica Completa
ClamAV es un motor antivirus de código abierto y multiplataforma mantenido por Cisco Talos que detecta virus, troyanos, rootkits, malware y otras amenazas maliciosas. Funciona mediante un modelo de detección basado en firmas respaldado por una base de datos actualizada continuamente (/var/lib/clamav/), y es la solución antivirus estándar de facto para servidores Linux, pasarelas de correo y entornos de alojamiento web.
Esta guía cubre el ciclo de vida completo de instalación: preparación del sistema, instalación de paquetes en las principales distribuciones, gestión de la base de datos de virus con freshclam, configuración del daemon, estrategias de escaneo, manejo de cuarentena, automatización con cron y escaneo en tiempo real mediante clamonacc — incluyendo errores de nivel de producción que la mayoría de los tutoriales omiten.
Por qué ClamAV es importante en servidores Linux
Los sistemas Linux no son inmunes al malware. Si bien los exploits dirigidos a Linux son menos comunes que las amenazas de Windows, los servidores que ejecutan aplicaciones web, relés de correo o servicios de intercambio de archivos son vectores activos de distribución de malware — incluso cuando el host Linux en sí no es el objetivo principal. Un entorno de VPS Hosting comprometido puede redistribuir silenciosamente archivos infectados a los usuarios finales, provocar la inclusión en listas negras de bases de datos de spam, o servir como punto de pivote en una cadena de ataque mayor.
ClamAV aborda esto proporcionando:
- Escaneo bajo demanda para análisis programado o activado
- Escaneo en modo daemon (
clamd) para verificaciones de alto rendimiento y baja latencia - Integración con pasarela de correo mediante
clamsmtp,amavisd-newoMilter - Monitoreo del sistema de archivos en tiempo real mediante
clamonacc(kernel Linuxfanotify) - Firmas de bytecode para detección heurística más allá de la coincidencia de patrones estáticos
Paso 1: Preparar y actualizar su sistema
Antes de instalar cualquier paquete, sincronice su índice de paquetes y aplique los parches de seguridad pendientes. Ejecutar bibliotecas del sistema desactualizadas junto con una herramienta de seguridad crea una falsa sensación de protección.
Para Debian/Ubuntu:
sudo apt update && sudo apt upgrade -yPara CentOS/RHEL 7:
sudo yum update -yPara Rocky Linux / AlmaLinux / RHEL 8+:
sudo dnf update -yPara Fedora:
sudo dnf update -yConfirme que las versiones de su kernel y glibc estén actualizadas, ya que clamonacc (escaneo en tiempo real) requiere kernel 5.1+ para soporte estable de fanotify.
Paso 2: Instalar ClamAV
ClamAV está disponible en los repositorios predeterminados de todas las distribuciones principales. La distinción clave es si instala solo el escáner (clamav) o también el daemon en segundo plano (clamav-daemon / clamd), lo cual es muy recomendable para cualquier servidor en producción.
Para Debian/Ubuntu:
sudo apt install clamav clamav-daemon -yclamav— instalaclamscanyfreshclam
clamav-daemon — instala clamd, el daemon de escaneo persistente que mantiene la base de datos de virus cargada en memoria, reduciendo drásticamente la sobrecarga por escaneo
Para CentOS/RHEL 7 (requiere EPEL):
sudo yum install epel-release -y
sudo yum install clamav clamav-update clamav-scanner-systemd clamd -y
Para Rocky Linux / AlmaLinux / RHEL 8+ (requiere EPEL):
sudo dnf install epel-release -y
sudo dnf install clamav clamav-update clamd -y
Para Fedora:
sudo dnf install clamav clamav-update clamd -y
Ubicaciones de binarios post-instalación a verificar:
Binario
Ruta
Propósito
clamscan
/usr/bin/clamscan
Escáner CLI bajo demanda
clamd
/usr/sbin/clamd
Daemon de escaneo en segundo plano
freshclam
/usr/bin/freshclam
Actualizador de base de datos de virus
clamdscan
/usr/bin/clamdscan
Cliente que delega a clamd
clamonacc
/usr/sbin/clamonacc
Escáner de acceso en tiempo real
Paso 3: Actualizar la base de datos de firmas de virus
La capacidad de detección de ClamAV depende completamente de la actualidad de su base de datos de firmas. La base de datos reside en /var/lib/clamav/ y consta de varios archivos: main.cvd, daily.cvd (o .cld) y bytecode.cvd.
Detener el daemon antes de la primera actualización (Debian/Ubuntu)
En sistemas Debian/Ubuntu, clamav-freshclam.service se ejecuta automáticamente después de la instalación y bloquea el directorio de la base de datos. Si intenta ejecutar freshclam manualmente mientras este servicio está activo, encontrará un conflicto de bloqueo. Deténgalo primero:
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
En CentOS/RHEL/Rocky/Alma:
sudo freshclam
Salida esperada en una actualización exitosa:
ClamAV update process started at ...
daily.cvd updated (version: 27xxx, sigs: xxxxxxx, ...)
main.cvd is up to date
bytecode.cvd is up to date
Configurar actualizaciones automáticas de la base de datos
freshclam está controlado por /etc/clamav/freshclam.conf. Directivas clave a revisar:
sudo nano /etc/clamav/freshclam.conf
Parámetros críticos:
Checks 24 — número de verificaciones de actualización por día (predeterminado: 12 en algunas distribuciones)
DatabaseMirror database.clamav.net — espejo oficial; no cambie a menos que use un espejo privado
NotifyClamd /etc/clamav/clamd.conf — indica a freshclam que señale a clamd después de una actualización para que el daemon recargue las firmas sin reiniciarse
Paso 4: Configurar e iniciar el daemon de ClamAV
El daemon clamd mantiene la base de datos completa de virus residente en RAM (típicamente 500 MB–1,2 GB dependiendo de la versión de la base de datos). Esto elimina el costo de inicio de varios segundos de clamscan, haciéndolo esencial para cualquier entorno que realice escaneos frecuentes o concurrentes.
Debian/Ubuntu
sudo systemctl start clamav-daemon
sudo systemctl enable clamav-daemon
sudo systemctl status clamav-daemon
CentOS/RHEL 7
En RHEL 7, la unidad de servicio se llama clamd@scan, haciendo referencia al archivo de configuración /etc/clamd.d/scan.conf:
sudo systemctl start clamd@scan
sudo systemctl enable clamd@scan
Rocky Linux / AlmaLinux / RHEL 8+
sudo systemctl start clamd@scan
sudo systemctl enable clamd@scan
Parámetros clave de clamd.conf
La configuración del daemon reside en /etc/clamav/clamd.conf (Debian/Ubuntu) o /etc/clamd.d/scan.conf (familia RHEL). Revise estas directivas:
sudo nano /etc/clamav/clamd.conf
Configuraciones importantes:
LocalSocket /run/clamav/clamd.ctl — ruta del socket Unix utilizada por clamdscan; asegúrese de que coincida con la configuración de su cliente
MaxFileSize 100M — tamaño máximo de archivo a escanear; aumente para servidores de correo que manejan archivos adjuntos grandes
MaxScanSize 400M — datos máximos escaneados por archivo después de la descompresión
StreamMaxLength 100M — relevante para el escaneo basado en milter/stream
User clamav — el daemon se ejecuta como el usuario clamav; asegúrese de que este usuario tenga acceso de lectura a los directorios que desea escanear
LogFile /var/log/clamav/clamd.log — habilite el registro persistente para registros de auditoría
Error crítico: Si clamd se ejecuta como usuario clamav y escanea /home/user/uploads/, el usuario clamav debe tener permisos de lectura en esa ruta. Olvidar esto resulta en fallos de escaneo silenciosos — clamd reportará errores de “Acceso denegado” en su registro en lugar de devolver un veredicto limpio/infectado.
Paso 5: Ejecutar escaneos con clamscan y clamdscan
Escaneo bajo demanda con clamscan
clamscan es el escáner independiente. Carga la base de datos desde el disco en cada invocación, haciéndolo más lento pero independiente del daemon.
Escanear un directorio específico de forma recursiva:
clamscan -r /path/to/directory
Escanear y mostrar solo archivos infectados:
clamscan -r --infected /path/to/directory
Escanear con salida detallada y registrar resultados:
sudo clamscan -r --infected --log=/var/log/clamav/manual_scan.log /var/www/html
Mover archivos infectados a un directorio de cuarentena:
sudo clamscan -r --move=/var/quarantine /path/to/directory
Eliminar archivos infectados automáticamente (usar con precaución en producción):
sudo clamscan -r --remove /path/to/directory
Escanear todo el sistema de archivos (espere un tiempo de ejecución significativo en discos grandes):
sudo clamscan -r --infected --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" /
Excluir /sys, /proc y /dev es obligatorio — escanear estos pseudosistemas de archivos produce errores falsos y puede causar bloqueos.
Escaneo de alto rendimiento con clamdscan
Cuando clamd está en ejecución, use clamdscan en lugar de clamscan. Envía solicitudes de escaneo al daemon ya cargado a través del socket Unix, haciéndolo órdenes de magnitud más rápido para escaneos repetidos o masivos.
clamdscan --fdpass /path/to/directory
El indicador --fdpass pasa el descriptor de archivo directamente a clamd, evitando problemas de permisos que surgen cuando el usuario del daemon no puede leer la ruta de destino directamente.
Escaneo multihilo con clamdscan:
clamdscan --multiscan --fdpass /var/www/html
--multiscan indica a clamd que escanee archivos en paralelo usando su grupo de hilos, reduciendo significativamente el tiempo de reloj en sistemas multinúcleo.
clamscan vs. clamdscan: Comparación de rendimiento
Atributo
`clamscan`
`clamdscan`
Carga de base de datos por escaneo
Sí (inicio lento)
No (el daemon mantiene la BD en RAM)
Tiempo de inicio típico
5–30 segundos
Menos de 1 segundo
Requiere clamd en ejecución
No
Sí
Escaneo paralelo
No
Sí (--multiscan)
Mejor caso de uso
Escaneos manuales puntuales
Escaneos automatizados, frecuentes o masivos
Modelo de permisos
Se ejecuta como el usuario que lo invoca
Se ejecuta como usuario clamav (use --fdpass)
Paso 6: Automatizar escaneos con Cron
Para una protección continua, programe escaneos regulares usando cron. El siguiente ejemplo escanea la raíz web diariamente a las 02:00 AM y registra los resultados con una marca de tiempo.
sudo crontab -e
Agregue la siguiente entrada:
0 2 * * * /usr/bin/clamdscan --multiscan --fdpass --log=/var/log/clamav/daily_scan_$(date +%Y%m%d).log /var/www/html
Cron de nivel de producción con alertas por correo electrónico en caso de infección:
0 2 * * * /usr/bin/clamscan -r --infected /var/www/html 2>&1 | grep -v "^$" | mail -s "ClamAV Daily Scan Report - $(hostname)" admin@yourdomain.com
Esto canaliza la salida no vacía directamente a un destinatario de correo, asegurando que solo reciba alertas cuando se encuentre algo o ocurra un error. Asegúrese de que mailutils o postfix esté configurado en el servidor.
Rotar los registros de escaneo para evitar el crecimiento ilimitado del disco:
sudo nano /etc/logrotate.d/clamav-scan
/var/log/clamav/daily_scan_*.log {
weekly
rotate 4
compress
missingok
notifempty
}
Paso 7: Escaneo de acceso en tiempo real con clamonacc
clamonacc es el componente de escaneo de acceso de ClamAV, introducido como característica estable en ClamAV 0.102. Se conecta al subsistema fanotify del kernel Linux para interceptar eventos de apertura y cierre de archivos, escaneando los archivos antes de que sean accedidos.
Requisitos:
Kernel Linux 5.1 o posterior (para fanotify con FAN_OPEN_EXEC_PERM)
ClamAV 0.102+
clamd debe estar en ejecución
Privilegios de root
Habilitar el escaneo de acceso en clamd.conf
sudo nano /etc/clamav/clamd.conf
Agregue o descomente:
OnAccessIncludePath /home
OnAccessIncludePath /var/www/html
OnAccessPrevention yes
OnAccessExcludeUname clamav
OnAccessPrevention yes — bloquea el acceso a archivos infectados en tiempo real (modo de denegación); establezca en no para el modo de solo detección
OnAccessExcludeUname clamav — evita que clamd en sí mismo desencadene bucles de escaneo recursivos
Iniciar clamonacc
sudo clamonacc --log=/var/log/clamav/clamonacc.log --daemonize
Para ejecutarlo como un servicio systemd, cree un archivo de unidad:
sudo nano /etc/systemd/system/clamonacc.service
[Unit]
Description=ClamAV On-Access Scanner
Requires=clamav-daemon.service
After=clamav-daemon.service
[Service]
Type=simple
ExecStart=/usr/sbin/clamonacc --log=/var/log/clamav/clamonacc.log --foreground
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now clamonacc
Error conocido: En servidores de alto rendimiento (p. ej., endpoints de carga de archivos con mucho tráfico), OnAccessPrevention yes puede introducir latencia de E/S medible. Evalúe su carga de trabajo antes de habilitar el modo de prevención en producción. Considere limitar OnAccessIncludePath a la ruta más estrecha necesaria en lugar de directorios amplios como /.
Paso 8: Integrar ClamAV con servidores de correo
El caso de uso de producción más extendido de ClamAV es el escaneo de pasarelas de correo. Si está ejecutando un servidor de correo en su infraestructura de VPS Hosting o Servidores Dedicados, integrar ClamAV con su MTA es una capa de seguridad crítica.
Pilas de integración comunes:
Postfix + amavisd-new + ClamAV — amavisd-new actúa como filtro de contenido entre Postfix y ClamAV, también gestionando SpamAssassin
Postfix + clamsmtp — proxy ligero estilo milter
Exim + ClamAV — la directiva nativa av_scanner de Exim admite clamd directamente mediante socket
Ejemplo: integración de clamd de Exim en /etc/exim4/exim4.conf:
av_scanner = clamd:/run/clamav/clamd.ctl
Esta única directiva enruta todo el contenido de los mensajes a través de la instancia de clamd en ejecución antes de la entrega. Combínela con una configuración adecuada de Alojamiento de Correo Electrónico para garantizar que su infraestructura de correo esté completamente protegida.
Solución de problemas comunes de ClamAV
freshclam falla con “locked by another process”
sudo systemctl stop clamav-freshclam
sudo rm -f /var/lock/clamav/freshclam.lock
sudo freshclam
sudo systemctl start clamav-freshclam
clamd no inicia: “ERROR: Can’t open/parse the config file”
Verifique la ruta del archivo de configuración y la sintaxis:
sudo clamd --config-file=/etc/clamav/clamd.conf --debug 2>&1 | head -50
Alto uso de memoria
clamd típicamente consume entre 500 MB y 1,2 GB de RAM con la base de datos completa cargada. En sistemas con memoria limitada, considere:
Establecer MaxThreads 2 en clamd.conf para limitar la concurrencia
Usar clamscan sin el daemon para escaneos poco frecuentes
Actualizar a un plan con RAM suficiente — un plan de VPS Hosting con al menos 2 GB de RAM es el mínimo práctico para ejecutar clamd junto con una pila web
El escaneo devuelve “Access denied” para archivos
El daemon clamd se ejecuta como el usuario clamav. Otorgue acceso de lectura:
sudo setfacl -R -m u:clamav:rX /path/to/scan
O use clamdscan --fdpass para pasar descriptores de archivo desde el contexto del usuario que lo invoca.
Falsos positivos
ClamAV ocasionalmente marca archivos legítimos, particularmente archivos comprimidos o ciertos frameworks PHP. Para incluir en la lista blanca un archivo conocido como seguro por hash:
sigtool --md5 /path/to/legitimate/file >> /var/lib/clamav/whitelist.fp
Reinicie clamd después de modificar los archivos .fp.
ClamAV en alojamiento compartido vs. VPS vs. servidor dedicado
El modelo de implementación afecta significativamente cómo debe configurarse ClamAV:
Entorno
Modo recomendado
Notas
Alojamiento Web Compartido
clamscan bajo demanda mediante cron
Sin acceso root; modo daemon no disponible
VPS (2–4 GB RAM)
Daemon clamd + cron clamdscan
Equilibrio entre rendimiento y limitaciones de memoria
Servidor Dedicado
clamd + clamonacc + integración de correo
Conjunto completo de características; sin compromiso de recursos
Nodo GPU/alto cómputo
Solo daemon clamd
Evite la sobrecarga de E/S de clamonacc en pipelines de datos
Para entornos que requieren el máximo rendimiento y control total sobre las herramientas de seguridad, los Servidores Dedicados proporcionan el margen de hardware para ejecutar clamd, clamonacc y el escaneo de correo simultáneamente sin contención de recursos.
Matriz de decisión técnica y conclusiones clave
Antes de implementar ClamAV, valide cada uno de los siguientes puntos:
Versión del kernel — ejecute uname -r; confirme 5.1+ si se requiere clamonaccclamd necesita 1–1,5 GB; planifique en consecuencia antes de habilitar el daemonfreshclam — confirme que clamav-freshclam.service esté habilitado y que NotifyClamd esté configurado en freshclam.confclamav pueda leer todos los destinos de escaneo; use --fdpass con clamdscan donde las ACL sean impracticables/proc, /sys, /dev de los escaneos recursivoslogrotate para todos los archivos de registro de ClamAV antes de habilitar trabajos cron diariosOnAccessPrevention — pruebe en modo de solo detección (no) antes de cambiar al modo de bloqueo (yes) en sistemas de producciónamavisd-new o la directiva nativa av_scanner del MTA, no solo mediante escaneos periódicos de archivos/var/quarantine con la propiedad adecuada antes de usar --move; clamscan no lo creará automáticamente.fp y revise los registros de escaneo después de cada actualización de la base de datos para detectar regresionesPreguntas frecuentes
¿ClamAV proporciona protección en tiempo real en Linux de forma predeterminada?
No. Después de la instalación, ClamAV opera únicamente en modo bajo demanda. La protección en tiempo real requiere habilitar explícitamente clamonacc con las directivas OnAccessIncludePath y OnAccessPrevention en clamd.conf, además de un kernel que admita fanotify (5.1+).
¿Cuál es la diferencia entre clamscan y clamdscan?
clamscan es un binario independiente que carga la base de datos de virus desde el disco en cada invocación, resultando en un retraso de inicio de 5–30 segundos. clamdscan es un cliente ligero que envía trabajos de escaneo al daemon clamd ya en ejecución, que mantiene la base de datos en RAM — haciéndolo significativamente más rápido para escaneos repetidos o automatizados.
¿Cuánta RAM requiere el daemon de ClamAV?
clamd con la base de datos completa actual (main + daily + bytecode) típicamente requiere entre 700 MB y 1,2 GB de memoria residente. En sistemas con menos de 2 GB de RAM total, ejecutar el daemon junto con un servidor web o base de datos puede causar presión de memoria. Use clamscan sin el daemon en instancias con memoria limitada.
¿Puede ClamAV escanear archivos comprimidos y adjuntos de correo electrónico?
Sí. ClamAV desempaqueta y escanea de forma nativa ZIP, RAR, 7z, TAR, GZIP, BZIP2, CAB y muchos otros formatos de archivo, así como documentos OLE2 (Microsoft Office), archivos PDF y ejecutables ELF/PE. Las directivas MaxScanSize y MaxFileSize en clamd.conf controlan los límites de profundidad y tamaño para el escaneo de archivos.
¿Por qué freshclam reporta “locked by another process” inmediatamente después de la instalación?
En Debian/Ubuntu, el servicio systemd clamav-freshclam se inicia automáticamente después de la instalación del paquete y mantiene un bloqueo exclusivo sobre el directorio de la base de datos. Ejecutar freshclam manualmente mientras este servicio está activo provoca un conflicto de bloqueo. Detenga el servicio con sudo systemctl stop clamav-freshclam, ejecute la actualización manual y luego reinicie el servicio.
