Históricamente la instalación de un antivirus para Linux no era una opción elegida por los administradores del sistema operativo porque no habían prácticamente ataques y porque tampoco existían muchos productos en el mercado.
La inmensa mayoría de los virus estaban enfocados en sistemas Windows.
¿Es necesario hoy en día instalar un antivirus para Linux?
En la actualidad, Linux ha cobrado mucha más importancia que hace unos años tanto en el entorno empresarial, donde ya era líder, como en el entorno del escritorio, como en el de los smartphones, es decir, actualmente hay una inmensa cantidad de empresas, usuarios y aplicaciones utilizando Linux, lo que significa que Linux es un objetivo claro de ataques de hackers, troyanos y ransomware.
Por lo tanto, la respuesta rápida es que cada vez es más necesario instalar un antivirus en Linux.
¿Qué alternativas tengo si no quiero instalar un antivirus en Linux?
Tenemos dos alternativas claras para evitar la instalación de un antivirus en Linux:
- Podemos configurar el firewall interno (iptables o firewalld) para dejar pasar únicamente el tráfico que nos interesa o, bien, podemos configurar un firewall externo por hardware para esta misma función.
- Podemos configurar SELinux para otorgar los permisos estrictamente necesarios de acceso a recursos del sistema a todas las aplicaciones y usuarios del mismo. No obstante, SELinux es un producto muy complejo que puede dar muchos dolores de cabeza a cualquier administrador del sistema o desarrollador de aplicaciones, ya que si no está configurado como nos interesa, se puede dar el caso de que una aplicación no pueda acceder a un recurso que necesita, como un fichero, incluso si es el propietario del mismo. De hecho, con veinte años que llevo administrando Linux, no conozco a ningún solo administrador que tenga habilitado SELinux.
¿Dónde deberíamos instalar un antivirus en Linux?
Si estamos hablando de un entorno empresarial con servidores públicos y privados, los puntos más vulnerables son aquellos servidores visibles desde Internet y aquellos que almacenan archivos subidos por los usuarios desde sus propios PCs, como podría ser un servidor SFTP, FTP o una aplicación que permita subir archivos por POST.
Para el resto de servidores privados no sería tan necesario la instalación de un antivirus.
Qué es el Antivirus ClamAV
Las grandes compañías de antivirus como McAffee, Symantec, Bitdefender, etc. sacan para Linux los antivirus que ya habían fabricado para Windows mucho antes. Eso sí, previo pago de licencia.
A mi me ha llamado especialmente la atención el antivirus ClamAV, que es un antivirus Opensource que se distribuye mediante licencia GPL y muy utilizando en los entornos Linux, aunque también existe su versión para Windows.
He estado echando un vistazo a los foros de discusión de la RedHat Network y éste es el que recomiendan mayoritariamente otros administradores que lo están usando, por sus actualizaciones frecuentes de su base de datos de virus, su facilidad de uso y de instalación.
ClamAV nació en 2001 para proteger todos aquellos servidores de correo electrónico corriendo en servidores Linux, pero ya ha llovido mucho desde entonces y, actualmente, es capaz de identificar muchos tipos diferentes de virus, malware, troyanos, etc.
Instalación del antivirus ClamAV en Linux RedHat
A continuación, voy a instalar ClamAV en un servidor Linux RedHat 8. Comencemos:
- Configuración del repositorio EPEL: ClamAV se distribuye, ya compilado, en los repositorios «Extras» de RedHat, así que vamos a configurarlo con el siguiente comando:
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
- Instalación del antivirus: Una vez tenemos configurado el repositorio, ya podemos pasar a instalar el antivirus ClamAV.
dnf install -y clamd clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd sendmail-milter
Al finalizar la instalación, deberíamos ver todos estos paquetes instalados:
[root@localhost ~]# rpm -qa |grep -i clam
clamav-data-0.102.4-1.el8.noarch
clamav-update-0.102.4-1.el8.x86_64
clamav-milter-0.102.4-1.el8.x86_64
clamav-filesystem-0.102.4-1.el8.noarch
clamav-0.102.4-1.el8.x86_64
clamd-0.102.4-1.el8.x86_64
clamav-unofficial-sigs-7.0.1-5.el8.noarch
clamav-lib-0.102.4-1.el8.x86_64
[root@localhost ~]#
Configuración de ClamAV y Arranque del antivirus (servicio clamd)
En el fichero /etc/clamd.d/scan.conf dejamos descomentada la línea
LocalSocket /run/clamd.scan/clamd.sockl
Habilitamos el servicio de escaneo de virus y lo arrancamos (clamd@scan):
[root@localhost ~]# systemctl enable clamd@scan
Created symlink /etc/systemd/system/multi-user.target.wants/clamd@scan.service → /usr/lib/systemd/system/clamd@.service.
[root@localhost ~]#
[root@localhost ~]# systemctl start clamd@scan
[root@localhost ~]#
[root@localhost ~]# systemctl status clamd@scan
● clamd@scan.service - clamd scanner (scan) daemon
Loaded: loaded (/usr/lib/systemd/system/clamd@.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-24 02:03:20 PST; 6s ago
Docs: man:clamd(8)
man:clamd.conf(5)
https://www.clamav.net/documents/
Process: 34995 ExecStart=/usr/sbin/clamd -c /etc/clamd.d/scan.conf (code=exited, status=0/SUCCESS)
Main PID: 35005 (clamd)
Tasks: 2 (limit: 11220)
Memory: 276.2M
CGroup: /system.slice/system-clamd.slice/clamd@scan.service
└─35005 /usr/sbin/clamd -c /etc/clamd.d/scan.conf
Nov 24 02:02:58 localhost.localdomain clamd[35005]: ELF support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: Mail files support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: OLE2 support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: PDF support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: SWF support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: HTML support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: XMLDOCS support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: HWP3 support enabled.
Nov 24 02:02:58 localhost.localdomain clamd[35005]: Self checking every 600 seconds.
Nov 24 02:03:20 localhost.localdomain systemd[1]: Started clamd scanner (scan) daemon.
[root@localhost ~]#
Actualización de la base de datos de virus de ClamAV
Cada cierto tiempo, deberemos teclear el comando freshclam para que la base de datos de virus que debamos escanear en el sistema, esté actualizada.
[root@localhost ~]# freshclam
ClamAV update process started at Tue Nov 24 02:05:53 2020
daily database available for update (local version: 25876, remote version: 25997)
Current database is 121 versions behind.
Downloading database patch # 25877...
WARNING: downloadFile: file not found: https://database.clamav.net/daily-25877.cdiff
WARNING: getpatch: Can't download daily-25877.cdiff from https://database.clamav.net/daily-25877.cdiff
Downloading database patch # 25877...
WARNING: downloadFile: file not found: https://database.clamav.net/daily-25877.cdiff
WARNING: getpatch: Can't download daily-25877.cdiff from https://database.clamav.net/daily-25877.cdiff
Downloading database patch # 25877...
WARNING: downloadFile: file not found: https://database.clamav.net/daily-25877.cdiff
WARNING: getpatch: Can't download daily-25877.cdiff from https://database.clamav.net/daily-25877.cdiff
WARNING: Incremental update failed, trying to download daily.cvd
WARNING: Download failed (56) WARNING: Message: Failure when receiving data from the peer
WARNING: getcvd: Can't download daily.cvd from https://database.clamav.net/daily.cvd
Trying again in 5 secs...
daily database available for update (local version: 25876, remote version: 25997)
Current database is 121 versions behind.
Downloading database patch # 25877...
WARNING: downloadFile: file not found: https://database.clamav.net/daily-25877.cdiff
WARNING: getpatch: Can't download daily-25877.cdiff from https://database.clamav.net/daily-25877.cdiff
Downloading database patch # 25877...
WARNING: downloadFile: file not found: https://database.clamav.net/daily-25877.cdiff
WARNING: getpatch: Can't download daily-25877.cdiff from https://database.clamav.net/daily-25877.cdiff
Downloading database patch # 25877...
WARNING: downloadFile: file not found: https://database.clamav.net/daily-25877.cdiff
WARNING: getpatch: Can't download daily-25877.cdiff from https://database.clamav.net/daily-25877.cdiff
WARNING: Incremental update failed, trying to download daily.cvd
Time: 8.1s, ETA: 0.0s [=============================>] 109.39MiB/109.39MiB
Testing database: '/var/lib/clamav/tmp.8d6f5/clamav-e6abbef4ebcf6914ffb6f26c2ef700ed.tmp-daily.cvd' ...
Database test passed.
daily.cvd updated (version: 25997, sigs: 4348353, f-level: 63, builder: raynman)
main.cvd database is up to date (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr)
bytecode.cvd database is up to date (version: 331, sigs: 94, f-level: 63, builder: anvilleg)
[root@localhost ~]#
[root@localhost ~]# freshclam
ClamAV update process started at Tue Nov 24 02:07:54 2020
daily.cvd database is up to date (version: 25997, sigs: 4348353, f-level: 63, builder: raynman)
main.cvd database is up to date (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr)
bytecode.cvd database is up to date (version: 331, sigs: 94, f-level: 63, builder: anvilleg)
[root@localhost ~]#
También podemos crear una tarea en cron para que la base de datos se actualice automáticamente:
[root@localhost ~]# crontab -l |tail -1
00 00 01 * * /usr/bin/freshclam >/dev/null 2>&1
[root@localhost ~]#
Si tenemos que usar un proxy para poder actualizar la base de datos, configuraremos las siguientes directivas del fichero /etc/freshclam.conf:
#HTTPProxyServer https://proxy.example.com
#HTTPProxyPort 1234
#HTTPProxyUsername myusername
#HTTPProxyPassword mypass
No es necesario reiniciar el servicio una vez configuradas.
Obtener la versión de la base de datos del antivirus
Podemos averiguarlo de dos maneras:
[root@localhost ~]# clamscan --version
ClamAV 0.100.3/26016/Sun Dec 13 15:31:03 2020
[root@localhost ~]#
[root@localhost ~]#
freshclam
ClamAV update process started at Mon Dec 14 14:33:07 2020
Connecting via 192.168.47.162
main.cld is up to date (version: 59, sigs: 4564902, f-level: 60, builder: sigmgr)
Connecting via 192.168.47.162
daily.cld is up to date (version: 26016, sigs: 4401988, f-level: 63, builder: raynman)
Connecting via 192.168.47.162
bytecode.cld is up to date (version: 331, sigs: 94, f-level: 63, builder: anvilleg)
[root@localhost ~]#
Escanear un directorio manualmente
Si deseamos escanear un directorio específico del sistema, lo podremos hacer manualmente con el comando clamscan:
[root@localhost ~]# clamscan -r /test
/test/david.txt: OK
----------- SCAN SUMMARY -----------
Known viruses: 8943455
Engine version: 0.102.4
Scanned directories: 1
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 32.111 sec (0 m 32 s)
[root@localhost ~]#
Excluir algunos Paths del Escaneo
Podría ser que no nos interesara escanear ciertos paths como, por ejemplo, donde se guardan los datafiles de una base de datos de Oracle por temas de rendimiento. Para ello, podemos añadir tantas directivas «ExcludePath» como necesitemos, en el fichero clamd.conf.
Si ejecutamos el comando «man clamd.conf», obtendremos más información:
ExcludePath REGEX
man del comando clamd.conf
Don’t scan files and directories matching REGEX. This directive can be used multiple times.
Default: disabled
Ejemplo de uso:
ExcludePath ^/oracle
ExcludePath ^/mysql
ExcludePath ^/mongodb
También podemos utilizar expresiones regulares de otra manera. Por ejemplo:
clamscan -r --exclude=/home --exclude=/ISO --exclude=.fg2* / 2>&1 | tee /tmp/clamscan.log
Eliminar un archivo infectado con ClamAV
Ahora vamos a descargar un archivo de test con una «firma» de virus para ver si ClamAV es capaz de detectarlo.
[david@server1 virus]$ wget http://www.eicar.org/download/eicar_com.zip
--2021-03-19 10:40:49-- http://www.eicar.org/download/eicar_com.zip
Resolving www.eicar.org (www.eicar.org)... 89.238.73.97, 2a00:1828:1000:2497::2
Connecting to www.eicar.org (www.eicar.org)|89.238.73.97|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 184 [application/zip]
Saving to: ‘eicar_com.zip’
eicar_com.zip 100%[=====================================================================================================================>] 184 --.-KB/s in 0s
2021-03-19 10:40:50 (9.93 MB/s) - ‘eicar_com.zip’ saved [184/184]
[david@server1 virus]$ ll
total 4
-rw-rw-r-- 1 david david 184 Jul 1 2020 eicar_com.zip
[david@server1 virus]$
Si escaneamos el directorio, debería encontrar el virus:
[root@server1 ~]# clamscan -r /home/david/virus/
/home/david/virus/eicar_com.zip: Win.Test.EICAR_HDB-1 FOUND
----------- SCAN SUMMARY -----------
Known viruses: 8513224
Engine version: 0.103.0
Scanned directories: 1
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 31.152 sec (0 m 31 s)
Start Date: 2021:03:19 10:41:54
End Date: 2021:03:19 10:42:25
[root@server1 ~]#
Por último, eliminamos los archivos infectados:
[root@server1 ~]# clamscan -r --remove /home/david/virus/
/home/david/virus/eicar_com.zip: Win.Test.EICAR_HDB-1 FOUND
/home/david/virus/eicar_com.zip: Removed.
Killed
[root@server1 ~]#
¿Donde guarda los logs ClamAV?
Por defecto, los logs se guardan en /var/log/clamav:
[root@server1 clamav]# pwd
/var/log/clamav
[root@server1 clamav]# ll
total 340
-rw-r--r-- 1 clam clam 37617 Mar 18 11:36 clamd.log
-rw-r--r-- 1 clam clam 66551 Feb 21 04:42 clamd.log-20210221
-rw-r--r-- 1 clam clam 60209 Feb 28 03:26 clamd.log-20210228
-rw-r--r-- 1 clam clam 60681 Mar 7 03:30 clamd.log-20210307
-rw-r--r-- 1 clam clam 60740 Mar 14 03:43 clamd.log-20210314
-rw-r--r-- 1 clam clam 2360 Mar 18 03:28 freshclam.log
-rw-r--r-- 1 clam clam 4219 Feb 21 04:42 freshclam.log-20210221
-rw-r--r-- 1 clam clam 4130 Feb 28 03:26 freshclam.log-20210228
-rw-r--r-- 1 clam clam 4570 Mar 7 03:30 freshclam.log-20210307
-rw-r--r-- 1 clam clam 4219 Mar 14 03:43 freshclam.log-20210314
[root@server1 clamav]#
Problema de consumo de memoria de ClamAV
En los servidores donde he instalado ClamAV me he encontrado con que en servidores con apenas 4GB de RAM, el antivirus estaba consumiendo hasta 1,5GB, lo cual puede causar un problema de rendimiento cuando eso sucede.
Lo que podemos hacer para evitar eso, es configurar el servicio para limitar la cantidad de memoria máxima que vamos a permitir que use ClamAV. Para limitarlo a 500MB de uso en RedHat 8, configuraremos la directiva MemoryMax=500M.
[root@server1 ~]# cat /usr/lib/systemd/system/clamd@.service
[Unit]
Description = clamd scanner (%i) daemon
Documentation=man:clamd(8) man:clamd.conf(5) https://www.clamav.net/documents/
After = syslog.target nss-lookup.target network.target
[Service]
Type = forking
ExecStart = /usr/sbin/clamd -c /etc/clamd.d/%i.conf
# Reload the database
ExecReload=/bin/kill -USR2 $MAINPID
Restart = on-failure
TimeoutStartSec=420
MemoryMax=500M
[Install]
WantedBy = multi-user.target
[root@server1 ~]#
Una vez que reiniciamos el servicio, comprobamos que el uso máximo de memoria del proceso de ClamAV es de 500MB:
En RedHat 7, la directiva a utilizar es MemoryLimit=500M.
Y en RedHat 6 tendremos que limitar el uso de memoria configurando cgroups.
Te puede interesar
- Configuración de SSH para establecer conexiones seguras en Linux
- Encriptación de discos en Linux (LUKs)
- Cómo auditar ficheros en Linux (audit)
Mi pasión por la tecnología me lleva constantemente a explorar las últimas tendencias y aplicaciones, buscando siempre formas de implementar soluciones innovadoras que mejoren la eficiencia. En puerto53.com comparto contenido valioso para ayudar a otros profesionales y entusiastas de la informática a navegar y dominar el complejo mundo de la tecnología. Mi especialidad en Linux RedHat.
Más sobre mí en el este enlace,