Instalación y uso de ClamAV, el antivirus de Linux

Creo que estamos todos de acuerdo en que la seguridad de un sistema es muy importante, por lo que en cualquier sistema operativo deberíamos tener un antivirus. Sí, también en GNU/Linux. No me vale de nada que digáis que en Linux no existen virus o que es imposible que nos infecten, porque no es así. ¿Habéis escuchado el dicho "más vale prevenir que curar"? Pues aplicadlo a vuestros equipos y servidores. He hecho una pregunta en Twitter sobre si debemos utilizar antivirus en Linux y he tenido varias respuestas que afirmaban que es mejor usar antivirus. Obvio.

Un ejemplo que da que pensar es el de tener un servidor de correo electrónico con unos cuantos usuarios, como es el caso de Geeky Theory. Será mejor analizar los correos enviados y recibidos en busca de cualquier virus, ¿no? Si no, cualquiera podría infectarse. Como no queremos eso, vamos a aprender a instalar ClamAV en nuestro sistema GNU/Linux. En este caso, lo haré en una máquina virtual con Ubuntu 14.04.

Paso 1: Instalación

Para instalar ClamAV, tendremos que introducir los siguientes comandos:

Antes de nada, actualizar el sistema:

$ sudo apt-get update && sudo apt-get upgrade -y

Tras esto, instalamos:

$ sudo apt-get install clamav clamav-daemon -y

Paso 2: Actualizar la base de datos de virus

Para que ClamAV pueda detectar virus, debe tener su base de datos actualizada.

$ sudo freshclamObtenemos algo parecido a esto: ClamAV update process started at Sun Feb  8 17:24:00 2015 main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo) daily.cvd is up to date (version: 20045, sigs: 1320886, f-level: 63, builder: neo) bytecode.cvd is up to date (version: 245, sigs: 43, f-level: 63, builder: dgoddard)

Paso 3: Escanear un directorio

Ya sea desde la raíz o desde cualquier carpeta, vamos a realizar un análisis de los archivos en un directorio de forma recursiva. Por ejemplo, para analizar la carpeta /home/mario, introducimos lo siguiente:

$ sudo clamscan -r /home/marioEn mi caso, obtengo este resultado: /home/mario/.bash_history: OK /home/mario/.bashrc: OK /home/mario/archivo.txt: OK /home/mario/.cache/motd.legal-displayed: Empty file /home/mario/.bash_logout: OK /home/mario/.profile: OK /home/mario/LEEME.txt: OK ----------- SCAN SUMMARY ----------- Known viruses: 3739593 Engine version: 0.98.6 Scanned directories: 2 Scanned files: 6 Infected files: 0 Data scanned: 0.00 MB Data read: 0.00 MB (ratio 0.00:1) Time: 7.047 sec (0 m 7 s)

Se han analizado 6 archivos y no se ha encontrado ninguno infectado.

¿Qué pasaría si tuviéramos un virus? Vamos a descargar de esta página un archivo "infectado" para comprobar si el antivirus funciona:

$ wget http://www.eicar.org/download/eicar_com.zip

Acabamos de descargar un archivo ZIP que, si todo vabien, ClamAV detectará como malicioso:

$ sudo clamscan -r /home/mario

Obteniendo el siguiente resultado tras realizar el análisis:

/home/mario/.bash_history: OK /home/mario/.bashrc: OK /home/mario/archivo.txt: OK /home/mario/.cache/motd.legal-displayed: Empty file /home/mario/.bash_logout: OK /home/mario/.profile: OK /home/mario/LEEME.txt: OK /home/mario/eicar_com.zip: Eicar-Test-Signature FOUND ----------- SCAN SUMMARY ----------- Known viruses: 3739593 Engine version: 0.98.6 Scanned directories: 2 Scanned files: 7 Infected files: 1 Data scanned: 0.00 MB Data read: 0.00 MB (ratio 0.00:1) Time: 8.265 sec (0 m 8 s)

Paso 4: Eliminar archivos infectados

Para eliminar el archivo comprimido que ClamAV ha detectado como malicioso, introducimos lo siguiente:

$ sudo clamscan --infected --remove --recursive /home/mario

Con estos parámetros, obtendremos como salida únicamente los archivos infectados, los cuales serán eliminados:

/home/mario/eicar_com.zip: Eicar-Test-Signature FOUND /home/mario/eicar_com.zip: Removed. ----------- SCAN SUMMARY ----------- Known viruses: 3739593 Engine version: 0.98.6 Scanned directories: 2 Scanned files: 7 Infected files: 1 Data scanned: 0.00 MB Data read: 0.00 MB (ratio 0.00:1) Time: 9.651 sec (0 m 9 s)

Paso 5: Ejecutar demonios

Para que no tengamos que estar continuamente analizando carpetas, vamos a ejecutar un daemon en segundo plano, tanto de ClamAV como de Freshclam:

$ sudo /etc/init.d/clamav-daemon start $ sudo /etc/init.d/clamav-freshclam startSi da error al ejecutar los daemon, es posible que no tengáis suficiente RAM. A mi me daba error en una máquina virtual con 512 MB, pero he ampliado y ya funciona correctamente.

Paso 6: Estudiar posibles configuraciones de ClamAV

ClamAV tiene bastante parámetros de configuración. Para conocerlos todos, introducid el siguiente comando:

$ clamscan --help Clam AntiVirus Scanner 0.98.6 By The ClamAV Team: http://www.clamav.net/about.html#credits (C) 2007-2009 Sourcefire, Inc. --help                -h             Print this help screen --version             -V             Print version number --verbose             -v             Be verbose --archive-verbose     -a             Show filenames inside scanned archives --debug                              Enable libclamav's debug messages --quiet                              Only output error messages --stdout                             Write to stdout instead of stderr --no-summary                         Disable summary at end of scanning --infected            -i             Only print infected files --suppress-ok-results -o             Skip printing OK files --bell                               Sound bell on virus detection --tempdir=DIRECTORY                  Create temporary files in DIRECTORY --leave-temps[=yes/no(*)]            Do not remove temporary files --database=FILE/DIR   -d FILE/DIR    Load virus database from FILE or load all supported db files from DIR --official-db-only[=yes/no(*)]       Only load official signatures --log=FILE            -l FILE        Save scan report to FILE --recursive[=yes/no(*)]  -r          Scan subdirectories recursively --allmatch[=yes/no(*)]   -z          Continue scanning within file after finding a match --cross-fs[=yes(*)/no]               Scan files and directories on other filesystems --follow-dir-symlinks[=0/1(*)/2]     Follow directory symlinks (0 = never, 1 = direct, 2 = always) --follow-file-symlinks[=0/1(*)/2]    Follow file symlinks (0 = never, 1 = direct, 2 = always) --file-list=FILE      -f FILE        Scan files from FILE --remove[=yes/no(*)]                 Remove infected files. Be careful! --move=DIRECTORY                     Move infected files into DIRECTORY --copy=DIRECTORY                     Copy infected files into DIRECTORY --exclude=REGEX                      Don't scan file names matching REGEX --exclude-dir=REGEX                  Don't scan directories matching REGEX --include=REGEX                      Only scan file names matching REGEX --include-dir=REGEX                  Only scan directories matching REGEX --bytecode[=yes(*)/no]               Load bytecode from the database --bytecode-unsigned[=yes/no(*)]      Load unsigned bytecode --bytecode-timeout=N                 Set bytecode timeout (in milliseconds) --bytecode-statistics[=yes/no(*)]    Collect and print bytecode statistics --detect-pua[=yes/no(*)]             Detect Possibly Unwanted Applications --exclude-pua=CAT                    Skip PUA sigs of category CAT --include-pua=CAT                    Load PUA sigs of category CAT --detect-structured[=yes/no(*)]      Detect structured data (SSN, Credit Card) --structured-ssn-format=X            SSN format (0=normal,1=stripped,2=both) --structured-ssn-count=N             Min SSN count to generate a detect --structured-cc-count=N              Min CC count to generate a detect --scan-mail[=yes(*)/no]              Scan mail files --phishing-sigs[=yes(*)/no]          Signature-based phishing detection --phishing-scan-urls[=yes(*)/no]     URL-based phishing detection --heuristic-scan-precedence[=yes/no(*)] Stop scanning as soon as a heuristic match is found --phishing-ssl[=yes/no(*)]           Always block SSL mismatches in URLs (phishing module) --phishing-cloak[=yes/no(*)]         Always block cloaked URLs (phishing module) --partition-intersection[=yes/no(*)] Detect partition intersections in raw disk images using heuristics. --algorithmic-detection[=yes(*)/no]  Algorithmic detection --scan-pe[=yes(*)/no]                Scan PE files --scan-elf[=yes(*)/no]               Scan ELF files --scan-ole2[=yes(*)/no]              Scan OLE2 containers --scan-pdf[=yes(*)/no]               Scan PDF files --scan-swf[=yes(*)/no]               Scan SWF files --scan-html[=yes(*)/no]              Scan HTML files --scan-archive[=yes(*)/no]           Scan archive files (supported by libclamav) --detect-broken[=yes/no(*)]          Try to detect broken executable files --block-encrypted[=yes/no(*)]        Block encrypted archives --nocerts                            Disable authenticode certificate chain verification in PE files --dumpcerts                          Dump authenticode certificate chain in PE files --max-filesize=#n                    Files larger than this will be skipped and assumed clean --max-scansize=#n                    The maximum amount of data to scan for each container file (**) --max-files=#n                       The maximum number of files to scan for each container file (**) --max-recursion=#n                   Maximum archive recursion level for container file (**) --max-dir-recursion=#n               Maximum directory recursion level --max-embeddedpe=#n                  Maximum size file to check for embedded PE --max-htmlnormalize=#n               Maximum size of HTML file to normalize --max-htmlnotags=#n                  Maximum size of normalized HTML file to scan --max-scriptnormalize=#n             Maximum size of script file to normalize --max-ziptypercg=#n                  Maximum size zip to type reanalyze --max-partitions=#n                  Maximum number of partitions in disk image to be scanned --max-iconspe=#n                     Maximum number of icons in PE file to be scanned --enable-stats                       Enable statistical reporting of malware --disable-pe-stats                   Disable submission of individual PE sections in stats submissions --stats-timeout=#n                   Number of seconds to wait for waiting a response back from the stats server --stats-host-id=UUID                 Set the Host ID used when submitting statistical info. (*) Default scan settings (**) Certain files (e.g. documents, archives, etc.) may in turn contain other files inside. The above options ensure safe processing of this kind of data. Esto es todo por este artículo. Recordad que la seguridad es importante y haced todo lo posible por evitar problemas que puedan afectar a los usuarios de vuestro servicio. ¡Saludos!