Antivirus para Linux

El que utilizo yo, tanto en distribuciones de escritorio como en servidores es ClamAV.

Instalación

Para instalarlo:
apt-get install clamav

Para instalar el actualizador:
apt-get install clamav-freshclam

Actualizar las bases de virus

freshclam
Si recibes un error como este:
ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).

No te preocupes, tendras funcionando freshclam como demonio / servicio, compruebalo:
service clamav-freshclam status

Y recibirás una salida como esta:

clamav-freshclam.service - ClamAV virus database updater
   Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled)
   Active: active (running) since jue 2017-01-12 08:58:33 CET; 3 days ago
     Docs: man:freshclam(1)
           man:freshclam.conf(5)
           http://www.clamav.net/lang/en/doc/
 Main PID: 439 (freshclam)
   CGroup: /system.slice/clamav-freshclam.service
           └─439 /usr/bin/freshclam -d --foreground=true

ene 15 21:25:27 server freshclam[439]: daily.cld is up to date (version: ...)
ene 15 21:25:27 server freshclam[439]: bytecode.cvd is up to date (versio...)
ene 15 22:25:27 server freshclam[439]: Received signal: wake up
ene 15 22:25:27 server freshclam[439]: ClamAV update process started at S...7
ene 15 22:25:27 server freshclam[439]: main.cvd is up to date (version: 5...)
ene 15 22:25:27 server freshclam[439]: Downloading daily-22899.cdiff [100%]
ene 15 22:25:29 server freshclam[439]: daily.cld updated (version: 22899,...)
ene 15 22:25:29 server freshclam[439]: bytecode.cvd is up to date (versio...)
ene 15 22:25:32 server freshclam[439]: Database updated (5580644 signatur...)
ene 15 22:25:32 server freshclam[439]: Clamd successfully notified about ....
Hint: Some lines were ellipsized, use -l to show in full.

O sencillamente así:

[ ok ] freshclam is running.

Escaner bajo demanda

La sintaxis general es esta:
clamscan [options] [file/directory/-]

Y las opciones más interesantes:

stdout: Write all messages (except for lib‐clamav output) to the standard output (stdout).
quiet: Be quiet (only print error messages).
remove[=yes/no(*)]: Remove infected files. Be careful!
move=DIRECTORY: Move infected files into DIRECTORY.
-r, —recursive: Scan directories recursively.
-i, —infected: Only print infected files.

Ejemplo:
sudo clamscan -r /var/www
Con este ejemplo escaneamos recursivamente la carpeta de las webs.

Si queremos algo más elaborado, además de recursivo que solo muestre los infectados, que guarde el log en cierto sitio y que excluya ciertos directorios del escaneo:
clamscan -r --infected --log=/root/clamscan-`date +%d-%m-%y.log` --exclude-dir=^/sys\|^/proc\|^/dev /
Aquí la ruta es ‘/’ es decir pretendemos escanear todo el sistema.

Eliminar virus

Esto conviene hacerlo de forma controlada, la opción es –remove, aunque podría interesar utilizar la opción –move según como queramos reaccionar ante una infección.
clamscan --infected --remove --recursive /

Programación de un cron para escanear el sistema

Lo mejor es olvidarse, y con cierta frecuencia ejecutar el escaner y enviarnos por email el resultado.

Para ello programamos una tarea cron:
crontab -e

Y añadimos una línea que se ejecute los domingos a las 2:00 am:

# m      h    dom           mon  dow                command
# minuto hora 'dia del mes' mes 'dia de la semana'  ...
# Minutos: de 0 a 59.
# Horas: de 0 a 23.
# Día del mes: de 1 a 31.
# Mes: de 1 a 12.
# Día de la semana: de 0 a 6, siendo 0 el domingo.
0 2 * * 0 clamscan -r --infected --exclude-dir=^/sys\|^/proc\|^/dev / | mail -s "Escaner ClamAV" jblancov@gmail.com

De forma que una vez a la semana se ejecute el escáner y nos envíe un reporte a nuestro email.

Que será algo parecido a esto:

----------- SCAN SUMMARY -----------
Known viruses: 5575169
Engine version: 0.99.2
Scanned directories: 20304
Scanned files: 90084
Infected files: 0
Data scanned: 6405.15 MB
Data read: 8352.78 MB (ratio 0.77:1)
Time: 478.312 sec (7 m 58 s)

Espero que os haya sido útil.

Anti rootkit para Linux

Sin duda contra rootkits en Linux los dos más conocidos son rkhunter y chkrootkit, y yo me decanto siempre por el primero.

Instalación y setup inicial

Instalamos el paquete:
aptitude install rkhunter

Base de datos de archivos del sistema

Hacemos un:
rkhunter --propupd

Para indexar los archivos del sistema. Deberemos hacerlo al instalar nuevos paquetes o actualizar existentes.

Base de firmas

Hacemos un update de las firmar:
rkhunter --update

Escanear bajo demanda

Podemos lanzar una ejecución bajo demanda así:
rkhunter -c --enable all --disable none --rwo

Con –rwo -> –report-warnings-only: sólo mostrará los warning (útil cuando lo ejecutamos vía cron).
Otra opción interesante es -q, –quiet que no produce ninguna salida.
También tenemos –cronjob deshabilita las opciones interactivas.
Por último comentar que la opción –appendlog permite que el log, en lugar de ser sustituido en cada ejecución, vaya creciendo.

Conviene personalizar estas variables del fichero de configuración /etc/rkhunter.conf, sobre todo el email:
nano /etc/rkhunter.conf

MAIL-ON-WARNING=”your_user@domain.com”
MAIL_CMD=mail -s “[rkhunter] Warnings found for ${HOST_NAME}”
ALLOW_SSH_ROOT_USER=yes

Programar un escaneado

Pero lo ideal es programar una tarea cron y despreocuparnos.

crontab -e

Añadimos una linea al final como esta para ejecutarlo a las 4 a.m.:

00 04 * * * /usr/bin/rkhunter -c --report-warnings-only --update --cronjob --quiet

Si nos asusta cada vez que recibimos un email diciendo “” con el asunto “Warnings found for server” podemos hacer en la tarea cron que nos envíe un email con la salida mínima que produce el comando, para saber si preocuparnos:

00 04 * * * /usr/bin/rkhunter --update -c --report-warnings-only --cronjob | mail -s "Rkhunter" jblancov@gmail.com

He quitado –quiet.

Y esto es todo, hasta la próxima. Espero que os haya resultado interesante.

Apache2: Tips de seguridad

Incluir a nivel configuración servidor estas directivas:

<Directory />
  AllowOverride None
  Options None
  Order Deny,Allow
  Deny from all
 </Directory>

<ifmodule mod_usedir.c>
UserDir disabled root
</IfModule>

Después en los Host virtuales que queramos habilitar en las secciones Directory:

        <Directory /var/vhosts/joseblanco.pro/>
                Options -Indexes +FollowSymLinks +MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

En la declaración anterior por un lado hemos deshabilitado la navegación por los directorios que cuelgan de /var/vhosts/joseblanco.pro/ mediante la opción -Indexes.
Después hemos permitido ficheros .htaccess mediante AllowOverride All.
Por último hemos abierto lo que habíamos cerrado, de lo contrario los visitantes recibirán un “403 Forbidden Error”.
Es decir, siempre tened un esquema de 1º Prohibir todo, 2º Permitir lo necesario:

<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>

<Directory /www>
Order Allow,Deny
Allow from all
</Directory>

Seguridad por oscuridad

Otras dos configuraciones de seguridad para Apache2 están actualmente en un fichero security.conf, estos son los dos parámetros y el valor a establecer:

ServerTokens ProductOnly
ServerSignature Off

Y como casi siempre tenemos funcionando PHP, conviene verificar que la directiva expose_php está inactiva:
Editar el fichero /etc/php5/apache2/php.ini y cambiar la siguiente directiva:
expose_php = off

Un artículo donde se explica como montar un servidor vps Debian desde cero os podría venir bien.

Desactivar el fichero wp-cron.php para evitar consumo en el VPS

wordpress

El archivo wp-cron.php cumple con características muy necesarias:

  • Verificación de actualizaciones
  • Pingbacks
  • Publicar artículos programados

Es una función muy útil y que necesitamos en nuestro WordPress, pero tiene su parte negativa:  este script php se ejecuta cada vez que la página recibe un impacto. Lo cual son peticiones a apache innecesarias, por lo que os sugiero una configuración alternativa para el caso de los VPS Linux, teniendo en mente que estas tareas se podrían hacer una sola vez al día, de madrugada por ejemplo.

Cómo desactivar wp-cron.php?

Debemos editar wp-config.php y añadir esta directiva:

define('DISABLE_WP_CRON', true);

Ahora convendría añadir un cron Linux real, para ello vía SSH en el VPS editamos el crontab de root:

crontab -e

Y añadimos en el minuto y hora deseados, o bien a una frecuencia, para que el script /var/www/vhosts/wordpress/wp-cron.php se ejecute 1 vez al día en mi caso a las 2:30am, en lugar de en cada visita:

30 02 * * * php -q /var/www/vhosts/wordpress/wp-cron.php

 

Aquí tienes un pequeño script que ejecutaría todos los cron de todos los WordPress que haya a partir de la carpeta /var/www/webs/:
nano /var/www/webs/cronWP.sh

for i in `find . -iname "wp-cron.php"`
do
	echo "$i"
	php -q $i
done

Y después podemos programar el crontab cada 30 minutos;
crontab -e

*/30 * * * * /var/www/webs/cronWP.sh

Aquí tienes un script que actualiza todas las configuraciones de todos los WordPress que haya por debajo de la carpeta /var/www/webs/ para desactivar crontab:

for i in `find . -iname "wp-cron.php"`
do
  ruta=`dirname $i`
  echo "
/* jblanco: cron */
define('DISABLE_WP_CRON', true);" >> $ruta/wp-config.php
done