Soluciones y consultoría

Recolección de logs en entornos cluster

Índice del contenido

Recolección de logs en entornos cluster

En el post de hoy, me gustaría presentaros una herramienta que tuve que desarrollar durante una investigación de seguridad. El análisis, se realizaba sobre cuatro servidores Linux con un Apache funcionando en cluster. Estos servidores Apache servían diferentes Virtual Host y además almacenaban el histórico de una semana. El resultado de esto era un montón de logs que había que obtener, ordenar y fusionar.

Veámoslo con un ejemplo:

Tenemos 4 servidores web que sirven entre los 4, 2 páginas web, la página www.webA.com y wwww.webB.com

En el Server1 nos encontramos en /var/log/www/ los siguientes logs:

www.webA.com-access.log

www.webA.com-access.log.20170710

www.webA.com-access.log.20170711

www.webA.com-access.log.20170712

www.webA.com-access.log.20170713

www.webA.com-access.log.20170714

www.webA.com-access.log.20170715

www.webA.com-access.log.20170716

www.webB.com-access.log

www.webB.com-access.log.20170710

www.webB.com-access.log.20170711

www.webB.com-access.log.20170712

www.webB.com-access.log.20170713

www.webB.com-access.log.20170714

www.webB.com-access.log.20170715

www.webB.com-access.log.20170716

Si multiplicamos esto por cuatro servidores, nos encontramos con 64 ficheros de log en los que tenemos que buscar evidencias, lo cual, es bastante inmanejable desde mi punto de vista.

Por eso, decidí crear un script que recolectara los ficheros de los 4 nodos del cluster, los ordenara y los fusionara en dos ficheros www.webA.com-acces.log y www.webB.com-access.log con el contenido ordenado de esos 64 ficheros.

Vamos pues a comentar los problemas encontrados durante la creación del script y las soluciones a las que se llegó:

Recolección automática de logs

Las premisas con las que se creó el script fueron:

  • nada de passwords escritos en el script
  • que fuera lo más portable posible
  • que tuviera el mínimo número de dependencias.

Para obtener los logs, la forma más fácil que me vino a la cabeza y que se encuentra en la práctica totalidad de los servidores Linux es SCP. El problema reside en que a SCP no se le puede pasar las credenciales vía argumento.

En este punto, se valoraron dos opciones, o utilizar clave pública/privada o un programa externo como sshpass. Al final, descarté la primera opción para evitar dejar “piezas” en los servidores destino y decidí utilizar sshpass.

Sshpass nos permite llamar a scp pasándole usuario y password mediante parámetros. Otra de las consideraciones que se tomó, es que sea automágico (dícese de aquel sistema que funciona como por arte de magia) y no pregunte si queremos aceptar la huella del servicio ssh.

Para ello se utilizaron las siguientes opciones de SSH, que evitan la pregunta y evitan que se almacene nueva información en el fichero known-hosts:

StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null

 

Al final, nos queda una orden como la siguiente:

sshpass -e scp -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ‘$usuario@$sist:$ruta/$archivo’ ‘$DESTINATION/archivo’

 

Como más de uno habrá notado, en este comando, no aparece el password por ningún lado. Esto es porque se le pasa vía la variable de entorno SSHPASS. Una vez ejecutado el comando, tendríamos ya todos los ficheros log en un punto centralizado.

 

Ordenar y fusionar los logs

Cuando me enfrenté al paso de la ordenación y la fusión de los logs me encontré con dos problemas:

  • El log no era trivial de ordenar
  • El tamaño de los ficheros

Vamos por partes, ¿qué quiero decir con que “no era trivial de ordenar”?

Si nos encontramos con un fichero con las líneas “hola”, “aaa” y “adiós”, un simple comando sort de Linux nos daría el resultado correcto. ¿Pero qué pasa si tenemos un log como este y lo queremos ordenar por fecha?

305 198.51.100.18 – – [28/Jul/2017:00:02:05 +0200] ‘GET /index.html HTTP/1.1’ 302 260 ‘-‘ ‘Safari (x86_64)’

 

En este caso, el simple sort se convertiría en algo como esto:

sort -t ‘ ‘ -k 5.9,5.12n -k 5.5,5.7M -k 5.2,5.3n -k 5.14,5.21n ruta/www.webA.com-access.log* -o www.webA.com-access-ordenado.log

 

Lo primero que salta a la vista es el -t ‘ ‘ que en este caso nos serviría para definir los delimitadores de los campos.

Con la opción -k indicamos el campo por el que se debe ordenar. Por ejemplo,

-k 5.9,5.12n  significa: el primer campo para ordenar lo encontrarás entre los caracteres 9 y 12 del campo número 5. Además, ese campo es numérico.

-k 5.5,5.7M significa: la misma esquemática que la anterior, pero en este caso la M significa que debe ordenar meses y no numéricos.

Con esto llegamos a nuestro último problema, el tamaño de los ficheros. Imaginad que cada fichero de log es 1 GB. Nos encontramos con que debemos ordenar 32 GB de texto y creedme cuando os digo que tarda horas.

Por tanto, necesitamos una forma rápida de ordenar estos ficheros de forma rápida. O mejor dicho, necesitamos evitar ordenar los ficheros. Si recordamos, cada fichero de log está ordenado individualmente, por lo que sólo necesitamos fusionarlos de forma “ordenada”.

Para este problema, el comando sort tiene una opción que se encarga precisamente de esto:

Con esto, nuestro comando se quedaría:

sort -t ‘ ‘ -k 5.9,5.12n -k 5.5,5.7M -k 5.2,5.3n -k 5.14,5.21n -m ruta/www.webA.com-access.log* -o www.webA.com-access-ordenado.log

 

Y cambiaríamos las horas por unos pocos minutos. Si quereis probar el script, lo tenéis disponible en mi github https://github.com/nomex/get_cluster_logs . ¡Espero vuestros commits!!!

Comparte
Share on facebook
Share on twitter
Share on linkedin
Share on email

No es sólo un blog

Noticias y avances sobre
tecnología

La realización de un Análisis de Riesgos de...
¿Cómo escoger un ERP para el sector alimentario?...
La transformación digital de la industria cervecera, un...
La gestión y obtención de informes relacionados con...
Digitalizar para innovar: las nuevas tecnologías aportan a...
La buena gestión de la red de comunicaciones...

¡Gracias!

Tu formulario se ha enviado correctamente-