jueves, 14 de agosto de 2014

OSSIM 12. Como monitorizar webserver > 1mill. files. TCP tunning, Inotify, OSSEC performance y demás.

Amigos veraneantes y no, de Inseguros.
Para esta entrada del verano voy a comentar algunos consejos que ido recopilando y usando en un despliegue empresarial que seguro os servirá de ayuda.


El escenario es un web server con distintos dominios y una larga seria de ficheros, mas o menos 1.000.000 de ficheros.
La idea es monitorizar la integridad de dichos ficheros, mediante el agente OSSEC, el cual indexará varios datos como el tamaño, el hash md5 y el sha-1.

Si has seguido la serie de artículos dedicados a Ossim, habrás configurado algún agente.
Vamos a usar su capacidad de realizar File Integrity Monitoring editando el fichero ossec.conf (  /var/ossec/etc/).
En el incluimos la ruta de ficheros que queremos monitorizar.
Ignoramos algún directorio, extensión de ficheros y poco más respecto al Syscheck.

<syscheck>
    <!-- Frequency that syscheck is executed - default set to every 22 hours -->
    <frequency>79200</frequency>

    <!-- Directories to check (perform all possible verifications) -->
    <directories>/etc,/usr/bin,/usr/sbin</directories>
    <directories>/bin,/sbin</directories>
    <directories>/var/www/vhost</directories>
  
    <!-- Files/directories to ignore -->
    <ignore>/etc/mtab</ignore>
    <ignore>/etc/mnttab</ignore>
    <ignore>/etc/hosts.deny</ignore>
    <ignore>/etc/mail/statistics</ignore>
    <ignore>/etc/random-seed</ignore>
    <ignore>/etc/adjtime</ignore>
    <ignore>/etc/httpd/logs</ignore>
    <ignore>/etc/utmpx</ignore>
    <ignore>/etc/wtmpx</ignore>
    <ignore>/etc/cups/certs</ignore>
    <ignore>/etc/dumpdates</ignore>
    >ignore>/etc/svc/volatile&lgt;/ignore>
  </syscheck>
Es muy sencillo y lo recomendables pasarse por la documentación oficial y leer todos los parámetros disponibles.

Hasta este punto es muy sencillo. Ahora debemos añadir una regla en nuestro decoder en OSSIM para que emita una alerta cuando un fichero nuevo se cree. Si no hacemos este paso podríamos verlo en la parte servido de OSSEC en el servidor OSSIM, pero queremos verlo graficamente.
Editamos local_rules.xml en nuestro servidor OSSIM /var/ossec/rules/ y añadimos:


<rule id="554" level="10" overwrite="yes">
       <category>ossec</category>
       <decoded_as>syscheck_new_entry</decoded_as>
       <description>File added to the system.</description>
       <group>syscheck,</group>

<alerts>

    <log_alert_level>1</log_alert_level>
    </alerts>

Recuerda que estas reglas son las únicas que no se "machacaran" con los updates...



En el supuesto de establecer que cada 8 horas compruebe el millón de archivos que existe en este caso la lectura/escritura se vería considerablemente mermada, y todos sabemos que el Performance de los servidores reside en el almacenamiento ( Ram y persistente).

Ossec emplea la función Inotify del Kernel de Linux  ( > 2.6.13) que nos permite el Real Monitoring es decir, en tiempo real, detecta los cambios... Justo lo que necesitamos. Esta función es empleada para muchos desarrollos debido a la agilidad que proporciona.

Inotify almacena en Kernel Space una estructura de datos en la que almacena los ficheros a revisar y las acciones asociadas. De esta manera, tendremos agilidad respecto al acceso a disco. 
Para poder ver el el número máximo de ficheros "controlados" podemos ejecutar:

cat /proc/sys/fs/inotify/max_user_watches 


En mi caso he tenido que aumentar el tamaño para que no desborde el sistema. Realmente entran en cola, pero con la cantidad de ficheros se congestiona entra cada revision de SYSCHECK y no da los resultados correctamente. Cuanto lo subo?

Lo primero que debemos saber es que en sistemas 64 bits, cada watch, cada objeto suervisado ocupa en memoria 1 kb. Para el millón de ficheros empleo 1 GB ( 1mill. kb)Al usar Kernel Space no entra en Swap, por lo que si te mueves en entornos de poca memoria ojo !!!.
Para modificar el valor: echo fs.inotify.max_user_watches=1000000 >> /etc/sysctl.conf

Si queremos ver los procesos que están consumiendo recursos de Inotify podemos ejecutar: 



ps -p `find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print | sed s/'^\/proc\/'/''/ | sed s/'\/fd.*$'/''/`

Otra de las configuraciones que he revisado el tamaño del buffer TCP. En una conexión TCP existe un mecanismo de control de flujo en el que ambos extremos de la conexión conocen el espacio disponible para procesar los paquetes. Aumentando este tamaño a las capacidades actuales de velocidad y memoria, podemos obtener rendimiento entra la comunicación de nuestro agente OSSEC y el servidor OSSEC instalado en OSSIM. En el caso de necesitar performance para copiar ficheros grandes por la red y similares, este TCP TUNNING nos ayudará.

Para comprobar los tamaños del buffer TCP podemos ejecutar:


cat /proc/sys/net/ipv4/tcp_mem


Ajustamos a 12 MB como se recomienda para servidores de más de 4gb y líneas ADSL.


alienvault:~# echo 'net.core.wmem_max=12582912' >> /etc/sysctl.conf

alienvault:~# echo 'net.core.rmem_max=12582912' >> /etc/sysctl.conf
sysctl -p

Ejecutamos estas modificaciones en ambos extremos, OSSEC agente y servidor.

De esta manera he conseguido tener el millón de ficheros controlado ante modificaciones deseada o no, subida de ficheros y en general medidas anti-defacement, RFI y demás amenazas WEB.

Espero que os sirva de ayuda para este proyecto o para cualquier otro.

Gracias por leerme.