«En Linux no hace falta antivirus» es una opinión extendida, y en su forma original es correcta: virus que infecten archivos de sistema de Linux prácticamente no hay. En un servidor, ClamAV tiene otra tarea, y se formula así: encontrar lo que se ha subido a través de su sitio. Web shells en primer lugar.
Qué se busca exactamente
Un web shell es un pequeño archivo PHP que permite ejecutar comandos desde el navegador. Llega al servidor por un formulario de subida, una extensión vulnerable o una contraseña de administrador adivinada, se instala entre las imágenes del directorio de subidas y vive ahí durante meses. Ni el cortafuegos ni Fail2ban lo verán: las peticiones hacia él parecen peticiones corrientes al sitio.
Además de eso, ClamAV encuentra:
- archivos maliciosos subidos por usuarios y redistribuidos desde su servidor: de eso suele tratar la carta del proveedor;
- adjuntos de correo, si el servidor gestiona correo;
- malware de Windows en almacenes de archivos: al servidor no le interesa, pero al empleado que descargue el archivo sí le afectará.
Sobre los límites, de entrada: ClamAV no impide una intrusión ni la detecta por sí mismo. Detecta rastros. Una puerta trasera discreta añadida a un archivo de tema existente se le escapará a un analizador por firmas; para eso está el control de integridad.
Instalación y el ajuste que importa
sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam
El segundo comando importa más que el primero. freshclam es el servicio de actualización de firmas, y si no funciona, ClamAV se vuelve inútil mientras sigue informando de análisis correctos. La antigüedad de las bases se comprueba así:
sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam
Bases de más de una semana significan un mecanismo roto. Las causas frecuentes son conexiones salientes bloqueadas, o un freshclam lanzado a mano como root, tras lo cual el servicio ya no puede escribir en su propio archivo por los permisos.
Memoria: demonio o ejecución puntual
Hay dos formas de uso, y la elección debe ser consciente.
clamd es un demonio permanente que mantiene las bases en memoria. Responde rápido pero ocupa alrededor de un gigabyte de memoria. En un VPS de uno o dos gigabytes eso es inaceptable: el demonio desplazará a la base de datos y a PHP-FPM, y el servidor se volverá pesado sin motivo visible. Se diagnostica con free -m y por el uso del swap.
La alternativa es clamscan programado. Es más lento (carga las bases en cada ejecución, alrededor de un minuto) pero solo trabaja mientras analiza:
sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www
La opción -i imprime solo los hallazgos; de lo contrario la salida son cientos de miles de líneas.
Analizar directorios, no el disco
Un análisis completo del disco en un servidor modesto dura horas y genera carga, por lo que se programa de noche y luego se desactiva del todo. Es más práctico analizar lo que de verdad cambia desde fuera:
0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads
Tres cosas importan en esa línea. ionice y nice eliminan el efecto sobre el sitio. --move en lugar de --remove: el archivo va a cuarentena en vez de borrarse, porque los falsos positivos existen y un archivo de cliente borrado por error no se recupera de ningún sitio. Y el directorio analizado es aquel donde se sube, no la raíz.
Firmas para web shells
Las bases que trae ClamAV son flojas con las puertas traseras en PHP: apuntan sobre todo al tráfico de correo. Linux Malware Detect (maldet) lo hace notablemente mejor: tiene su propio conjunto de firmas construido justamente en torno a los web shells, y analiza con el motor de ClamAV si está instalado. La combinación habitual es ClamAV como motor y base actualizable, y maldet como fuente de firmas especializadas.
Qué hacer con un hallazgo
Un web shell encontrado no es el final de la investigación sino su comienzo. Un archivo en el directorio de subidas significa que alguien pudo escribir ahí, y borrar el archivo no elimina esa posibilidad.
- No lo borre de inmediato: guarde una copia y anote la hora de modificación del archivo.
- Con esa hora, busque en los registros del servidor web la petición que lo dejó ahí. Esa es la vulnerabilidad.
- Busque vecinos: una puerta trasera casi nunca se deja en un único ejemplar.
- Compruebe qué más cambió en el disco en ese mismo periodo y si han aparecido nuevas tareas de cron y claves SSH.
Unas palabras aparte sobre los falsos positivos. Las bibliotecas de plantillas y el JavaScript minificado a veces caen bajo una firma. De ahí la cuarentena en lugar del borrado, y de ahí también el consejo de no enchufar sin criterio todos los conjuntos de firmas ajenos que aparezcan: la confianza en un informe donde la mitad de las líneas es ruido se pierde en una semana, y entonces se deja de leer.
El valor práctico de un analizador está en que sus resultados salten a la vista: cuándo fue el último análisis, qué antigüedad tienen las bases, qué se encontró. Es una sola línea, pero su ausencia convierte un antivirus instalado en una casilla marcada. Cómo se ve esa línea lo muestra la página de demostración de abajo.