MonitoreoSeguridadSistemas

Clamav: Instalación y Configuración

En este tutorial detallado, te proporcionaremos un paso a paso para fortalecer la seguridad en sistemas basados en Linux mediante la instalación y configuración de ClamAV. ClamAV, una solución antivirus de código abierto, ofrece una defensa robusta contra amenazas potenciales, garantizando la integridad y protección de tu sistema.

Exploraremos los procesos de instalación desde cero, abordando cada aspecto crítico para optimizar el rendimiento y garantizar una detección efectiva de malware y virus. Aprenderás a configurar ClamAV para realizar análisis programados, actualizar bases de datos de manera automática y personalizar ajustes según tus necesidades específicas.

Instalación

Para este tutorial lo haremos desde un servidor Debian 11 Server y un Fedora 35 Server. Desde una consola ejecutaremos lo siguiente:

sudo dnf install clamav-server clamav-data clamav-filesystem clamav-lib clamav-update clamav clamav-devel
sudo update && sudo apt-get install clamav-daemon

Para confirmar que se ha instalado correctamente, ejecutaremos lo siguiente:

clamscan --version

Configuración

Una vez tengamos instalado clamav, toca configurarlo. A gusto personal, aunque en muchas distribuciones de Linux ya viene un configuración por defecto, me gusta usar el comando clamconf para generar un fichero de configuración con todas las opciones disponibles asociado a un comentario que explica qué significa cada cosa.

sudo clamconf -g clamd.d/scan.conf > /etc/clamd.d/scan.conf
sudo clamconf -g clamd.conf > /etc/clamav/clamd.conf

Configuración Clamd

A continuación te dejo una configuración que nos permitirá sacar el máximo partido a la herramienta:

# Log del servicio
LogFile /var/log/clamav/clamav.log

# Tamaño máximo del fichero del log
LogFileMaxSize 5M

# Añadir la hora del evento en las entradas del log
LogTime yes

# Habilita la rotación del log
LogRotate yes

# Ruta del pid del servicio
PidFile /var/run/clam.pid

# Ruta del socket del servicio
LocalSocket /var/lib/clamav/clamd.socket

# Permisos del socket del serivicio
LocalSocketMode 600

# Esta opción limita el tiempo máximo de escaneo
# Estableciéndolo a 0 quitamos esta limitación
MaxScanTime 0

# Los archivos/mensajes mayores que este límite no serán escaneados.
MaxScanSize 0

# Los archivos/mensajes que superen este límite no se analizarán.
MaxFileSize 0

# Establece el nivel de profundidad de búsqueda de un fichero comprimido
MaxRecursion 0

# Número de ficheros a escanear dentro de un archivo, un documento, o cualquier otro archivo contenedor
MaxFiles 0

# Permite al usuario evitar que clamd analice ficheros de tamaño superior al especificado. 
OnAccessMaxFileSize 0

# Esta opción especifica un directorio (incluidos todos los archivos y directorios que contiene),que debe ser escaneado en el acceso
OnAccessIncludePath /home /root /var /usr /tmp

# Esta opción permite excluir directorios del análisis en tiempo real
OnAccessExcludePath /var/log/clamav/quarantine

# Enables fanotify blocking when malicious files are found.
OnAccessPrevention false

# Activa la exploración adicional y las notificaciones cuando se crea o mueve un archivo o directorio.
OnAccessExtraScanning true

#Con esta opción puede excluir UIDs específicos. En esta opción desactivamos root 
OnAccessExcludeUID 0

# Ejecuta un comando cuando se encuentre un virus. 
VirusEvent /etc/clamd.d/detected.sh

# Ejecutar el demonio como un usuario especificado. SI SE ACTIVA EL TIEMPO REAL, DEBER SER ROOT QUIEN EJECUTE EL DEMONIO
User root

Esta configuración nos permite guardar los logs del servicio, poder lanzar el antivirus como servicio, desactivar los límites que vienen por defecto en la configuración (Ojo, todo dependerá de los recursos de cada equipo) y establecer un directorio dónde clamav es . Puedes obtener más información sobre los parámetros de configuración, consultando la documentación oficial de clamav.

Antes de lanzar el servicio, debemos de asegurarnos de tener todos los ficheros que necesitará el servicio para poder funcionar. Para ello realizaremos lo siguiente:

# Creamos el directorio de los logs y donde se guardarán los virus detectados
sudo mkdir -p /var/log/clamav/quarantine

# Creamos el socket para el servicio
sudo touch /var/lib/clamav/clamd.socket

# Creamos el pid del fichero
sudo touch /var/run/clam.pid

Por último nos faltaría crear la acción que se ejecutará cuando se detecte alguna amenaza. En este caso crearemos un script que nos enviará la notificación a distintos medios. Si se tiene desplegado alguna herramienta de monitorización (zabbix, pandorafms, nagios,..) , se debería enviar algún tipo de alerta para que quede registrado en la monitorización.

sudo vi /etc/clamd.d/detected.sh

#!/bin/bash
PATH=/usr/bin
alert="Firma detectada: $CLAM_VIRUSEVENT_VIRUSNAME en $CLAM_VIRUSEVENT_FILENAME"

# Enviar la alerta al registro de systemd si existe, de lo contrario a /var/log
if [[ -z $(command -v systemd-cat) ]]; then
        echo "$(date) - $alert" >> /var/log/clamav/detections.log
else
        # Esto podría hacer que su entorno de escritorio muestre una alerta visual. Sucede en Plasma, pero la siguiente alerta visual es mucho mejor.
        echo "$alert" | /usr/bin/systemd-cat -t clamav -p emerg
fi

# Enviar una alerta a todos los usuarios de la interfaz gráfica.
XUSERS=($(who|awk '{print $1$NF}'|sort -u))

for XUSER in $XUSERS; do
    NAME=(${XUSER/(/ })
    DISPLAY=${NAME[1]/)/}
    DBUS_ADDRESS=unix:path=/run/user/$(id -u ${NAME[0]})/bus
    echo "run $NAME - $DISPLAY - $DBUS_ADDRESS -" >> /tmp/testlog
    /usr/bin/sudo -u ${NAME[0]} DISPLAY=${DISPLAY} \
                       DBUS_SESSION_BUS_ADDRESS=${DBUS_ADDRESS} \
                       PATH=${PATH} \
                       /usr/bin/notify-send -i dialog-warning "clamAV" "$alert"
done

Configuración Clamonacc

El demonio clamonacc se registra para recibir notificaciones de acceso a archivos del núcleo de Linux y, en respuesta, envía análisis al demonio de análisis clamd para obtener un veredicto. On-Access sólo está disponible en sistemas Linux. En Linux, On-Access requiere una versión del kernel >= 3.8. Esto se debe a que aprovecha una api del kernel llamada fanotify para bloquear procesos que intenten acceder a archivos maliciosos. Esta prevención se produce en el espacio del kernel, por lo que ofrece una protección mayor que una solución puramente de espacio de usuario.

Como paso previo, debemos asegurarnos de que nuestra herramienta es compatible con el sistema donde queremos actualizarlo, apara ello ejecutamos lo siguiente:

[root@fedora ~]# grep FANOTIFY /boot/config-$(uname -r)
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y

El valor esperado debe ser un ‘y’, esto nos permitirá usar esta herramienta. Ahora solo nos queda configurar el servicio y crear los componentes necesarios:

vi /usr/lib/systemd/system/clamav-clamonacc.service

# clamonacc systemd service file primarily the work of ChadDevOps & Aaron Brighton
# See: https://medium.com/@aaronbrighton/installation-configuration-of-clamav-antivirus-on-ubuntu-18-04-a6416bab3b41#a340

[Unit]
Description=ClamAV On-Access Scanner
Documentation=man:clamonacc(8) man:clamd.conf(5) https://docs.clamav.net/
After=clamd@scan.service syslog.target network.target

[Service]
Type=simple
User=root
#ExecStart=/usr/sbin/clamonacc -F --config-file=/etc/clamd.d/scan.conf
ExecStart=/usr/sbin/clamonacc -F --config-file=/etc/clamd.d/scan.conf --log=/var/log/clamav/clamonacc.log --move=/var/log/clamav/quarantine

[Install]
WantedBy=multi-user.target

Por último nos queda crear el fichero log de este servicio, para ello ejecutamos:

sudo touch /var/log/clamav/clamonacc.log

Con esto ya tendríamos Clamav configurado y listo para arrancar, ahora solo nos queda habilitarlo para que arranque con el sistema e iniciar los servicios:

sudo systemctl enable clamav-clamonacc clamd@scan
sudo systemctl start clamav-clamonacc clamd@scan

Comprobación de funcionamiento

Vamos a crear un pequeño laboratorio para comprobar el funcionamiento de la herramienta y su escaneo ‘en acceso’. Para realizar las pruebas vamos a utilizar los ficheros ‘eicar‘ que son los que se utilizan para realizar estas pruebas y no daña el sistema. OJO, RECUERDA HACER ESTA PRUEBA EN UN ENTORNO CONTROLADO.

Desde la página de Eicar me he descargado los siguientes elementos:

[root@fedora check]# ls
eicar.com  eicar.text  eicar.zip
[root@fedora check]# cat eicar.text eicar.com
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
[root@fedora check]# zipinfo eicar.zip
Archive:  eicar.zip
Zip file size: 237 bytes, number of entries: 1
-rw-r--r--  3.0 unx       69 tx stor 24-Jan-07 17:27 eicar.com
1 file, 69 bytes uncompressed, 69 bytes compressed:  0.0%
[root@fedora check]#

Tanto eicar.com como eicar.txt tienen el mismo contenido, pero lo que queremos comprobar, es que clamav comprueba el contenido del fichero, sin distinguir por extensión. Luego eicar.zip, es un comprimido que contiene el eicar.com.

Si queremos analizar un fichero o un directorio a petición, podemos utilizar el comando clamdscan. Un ejemplo básico sería el siguiente:

clamdscan --config-file=/etc/clamd.d/scan.conf --fdpass --move=/var/log/clamav/quarantine /tmp/check/

Te explico un poco, qué significa cada opción:

  • config-file: Le asignamos la ruta de la configuración que debe de usar para realizar el análisis.
  • fdpass: Pasa los permisos del descriptor del archivo a clamd. Esto es útil si clamd se está ejecutando como un usuario diferente, ya que es más rápido que transmitir el archivo a clamd. Sólo disponible si se conecta a clamd a través de un socket local(unix).
  • move: Si se encuentra una amenaza, el propio comando moverá este fichero a la carpeta que le asignemos

Si ejecutamos el comando, obtendremos la siguiente salida:

[root@fedora check]# clamdscan --config-file=/etc/clamd.d/scan.conf --move=/var/log/clamav/quarantine /tmp/check/

/tmp/check/eicar.com: Eicar-Signature FOUND
traverse_rename: Failed to rename: /tmp/check/eicar.com
        to: /var/log/clamav/quarantine/eicar.com

/tmp/check/eicar.com: moved to '/var/log/clamav/quarantine/eicar.com'
/tmp/check/eicar.text: Eicar-Signature FOUND
traverse_rename: Failed to rename: /tmp/check/eicar.text
        to: /var/log/clamav/quarantine/eicar.text

/tmp/check/eicar.text: moved to '/var/log/clamav/quarantine/eicar.text'
/tmp/check/eicar.zip: Eicar-Signature FOUND
traverse_rename: Failed to rename: /tmp/check/eicar.zip
        to: /var/log/clamav/quarantine/eicar.zip

/tmp/check/eicar.zip: moved to '/var/log/clamav/quarantine/eicar.zip'

----------- SCAN SUMMARY -----------
Infected files: 3
Time: 0.007 sec (0 m 0 s)
Start Date: 2024:01:07 18:04:51
End Date:   2024:01:07 18:04:51

Ahora, si comprobamos la carpeta donde se almacenan las amenazas, podemos comprobar que los ficheros que nos descargamos previamente, se encuentran en el directorio.

[root@fedora check]# ls -l /var/log/clamav/quarantine/
total 36
-rw------- 1 root root  69 Jan  7 18:04 eicar.com
-rw------- 1 root root  69 Jan  7 18:04 eicar.text
-rw------- 1 root root 237 Jan  7 18:04 eicar.zip
-rw------- 1 root root  69 Jan  6 19:44 virucito
-rw------- 1 root root  69 Jan  6 21:29 virucito.001
-rw------- 1 root root  69 Jan  6 19:52 virucito2
-rw------- 1 root root  69 Jan  6 20:04 virucito3
-rw------- 1 root root  69 Jan  6 21:28 virucito4
-rw------- 1 root root  69 Jan  6 21:29 virucito6

Como vemos, los ficheros se han movido a la carpeta y se establece los permisos 600 y se cambia el propietario a root, para un futuro análisis.

Ahora comprobaremos el escaneo ‘on access‘. Como es un entorno de prueba, lo que haremos será copiar uno de los eicar de nuestra carpeta /var/log/clamav/quarantine a alguna de las carpetas que estamos monitorizando.

cp /var/log/clamav/quarantine/eicar.com /root/
ls /root/

Si listamos el contenido del directorio, comprobamos de que el fichero no se encuentra. Esto es, que en cuanto el fichero se ha copiado, clamav ha escaneado el fichero y ha detectado que es una amenaza, por lo que, lo ha movido a la carpeta donde se encuentran el resto de las amenazas. Para confirmarlo, veamos los de clamav.

[root@fedora check]# tail /var/log/clamav.log
Sun Jan  7 17:49:32 2024 -> SelfCheck: Database status OK.
Sun Jan  7 17:59:32 2024 -> SelfCheck: Database status OK.
Sun Jan  7 18:04:51 2024 -> /tmp/check/eicar.com: Eicar-Signature FOUND
Sun Jan  7 18:04:51 2024 -> /tmp/check/eicar.text: Eicar-Signature FOUND
Sun Jan  7 18:04:51 2024 -> /tmp/check/eicar.zip: Eicar-Signature FOUND
Sun Jan  7 18:09:34 2024 -> SelfCheck: Database status OK.
Sun Jan  7 18:12:37 2024 -> /root/eicar.com: Eicar-Signature FOUND
Sun Jan  7 18:12:42 2024 -> /var/log/clamav/quarantine/eicar.com.001: Eicar-Signature FOUND
Sun Jan  7 18:13:44 2024 -> /root/eicar.com: Eicar-Signature FOUND
Sun Jan  7 18:13:49 2024 -> /var/log/clamav/quarantine/eicar.com.001: Eicar-Signature FOUND

Como vemos, el fichero ha sido detectado y lo ha enviado a nuestra carpeta de cuarentena.

Actualización de Firmas

Para actualizar las firmas, solo es necesario ejecutar el comando freshclam. Este comando se conectará a los repositorios de clamav, descargará las firmas y las dejará en el repositorio /var/lib/clamav por defecto. Reiniciamos los servicios para que los servicios renueven sus firmas.

[root@fedora check]# freshclam
ClamAV update process started at Sun Jan  7 18:39:58 2024
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.103.7 Recommended version: 0.103.11
DON'T PANIC! Read https://docs.clamav.net/manual/Installing.html
daily database available for update (local version: 27145, remote version: 27147)
Current database is 2 versions behind.
Downloading database patch # 27146...
Time:    0.2s, ETA:    0.0s [========================>]    7.98KiB/7.98KiB
Downloading database patch # 27147...
Time:    0.0s, ETA:    0.0s [========================>]   10.50KiB/10.50KiB
Testing database: '/var/lib/clamav/tmp.ed08d1bc45/clamav-ea673babaeb75b36d623923c56427ace.tmp-daily.cld' ...
Database test passed.
daily.cld updated (version: 27147, sigs: 2050511, f-level: 90, builder: raynman)
main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
bytecode.cvd database is up-to-date (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

[root@fedora check]# systemctl restart clamd@scan clamav-clamonacc.service

Si las firmas que tenemos en la máquina son las más actuales, nos saldrá un mensaje notificándolo.

[root@fedora check]# freshclam
ClamAV update process started at Sun Jan  7 18:55:48 2024
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.103.7 Recommended version: 0.103.11
DON'T PANIC! Read https://docs.clamav.net/manual/Installing.html
daily.cld database is up-to-date (version: 27147, sigs: 2050511, f-level: 90, builder: raynman)
main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
bytecode.cvd database is up-to-date (version: 334, sigs: 91, f-level: 90, builder: anvilleg)

Es recomendable actualizar diariamente las firmas, por lo que se recomienda automatizarlo.

Programación de Tareas

Actualización de firmas

Creamos un script dentro del directorio /etc/cron.daily/ para que así el sistema ejecute el script diariamente.

vi /etc/cron.daily/firmas_antivirus.sh
#!/bin/bash

/usr/bin/freshclam --quiet
systemctl restart clamd@scan clamav-clamonacc.service

Guardamos el fichero y le damos permisos solo al usuario root:

chmod 700 /etc/cron.daily/firmas_antivirus.sh

Análisis completo

Uno de los inconvenientes que tiene ahora mismo el ‘scan on access’ es el consumo de recursos, a más ficheros que se monitoriza, más recursos consume. Si configuramos que se monitorice todos los ficheros que están por debajo de la raíz del sistema, clamav es capaz de que use todos los recursos del sistema para llevar a cabo esa acción. Es por ello, que se suele monitorizar aquellos directorios, donde haya cambios constantes (home, /tmp, /var/log,..) para reducir el uso de recursos. Como protección complementaria, es recomendable analizar todo el sistema al menos una vez al día. Por ello vamos a crear otro script dentro de la carpeta /etc/cron.daily para el sistema ejecute diariamente nuestro script.

vi /etc/cron.daily/analisis_completo.sh
#!/bin/bash

clamdscan --config-file=/etc/clamd.d/scan.conf --fdpass --move=/var/log/clamav/quarantine --log-file=/var/log/clamav/analisis_diario.log /

Guardamos el fichero y le damos permisos solo al usuario root:

chmod 700 /etc/cron.daily/analisis_completo.sh

Con esto, haremos un análisis diario completo del sistema. Recuerda que tienes que crear el fichero /var/log/clamav/analisis_diario.log para que se guarden los logs de nuestros análisis.

Deja una respuesta

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