Logstash: Creando un panel de control personalizado (II)

Hoy os voy a presentar el resultado del trabajo que hicimos en el post del otro día. Una vez cargados todos los datos, accedemos con nuestro navegador al puerto 9292 del equipo donde hemos desplegado Logstash (en nuestro caso nuestro propio equipo), y empezamos a jugar con todas las visualizaciones que proporciona . El resultado inicial es el siguiente:

Aquí podemos ver como hemos introducido varios parámetros de búsqueda, que coinciden con las categorías que proporciona Emerging Threats, el conjunto de reglas que usamos en la sonda que hemos utilizado para las pruebas.

A continuación aparece por defecto un histograma que nos permite ver, de un vistazo, qué tipos de ataques han sido los que más hemos sufrido. Como se puede apreciar, hay varios picos de alertas “ET SCAN” que corresponden con escaneos hacia nuestra infraestructura, así como varios picos de alertas del tipo “ET P2P”, que nos hacen pensar que alguno de nuestros usuarios ha utilizado herramientas P2P.

A partir de este punto es donde empezamos la personalización, generando nosotros mismos las visualizaciones que queramos.

La primera visualización interesante es la de terms, que para un campo concreto que le indiquemos, obtiene los valores más (o menos) comunes. Se puede configurar para que nos muestre los resultados en un gráfico de barras, de tarta, o en una lista simple (como veremos más adelante).

Además, nos permite mostrar el número de registros con otros valores fuera de los que muestra (‘Other values’), e incluso a los que les falta el campo que estamos visualizando (‘Missing’).

Utilizando esta visualización para las IP y los puertos origen y destino obtenemos una vista como la siguiente:

Seguidamente, vemos otra de las visualizaciones que hemos generado:

Aquí aparece, a la izquierda, una visualización de tipo terms sobre las firmas más comunes que han generado alertas. Este caso es ligeramente diferente, ya que para que funcione bien la visualización debemos seleccionar el campo sig_name.raw. Esto se debe a que elasticsearch por defecto procesa todos los campos que le llegan, separándolos en palabras, de forma que la visualización de tipo terms actuaría para cada palabra que forma la firma, dejando por ejemplo en primer lugar el término “ET” con un valor igual al número de alertas que se han generado. Para evitar esta separación y poder obtener el valor deseado, logstash añade por defecto a cada campo otro homónimo con el sufijo “.raw”, que marca para que no sea procesado por elasticsearch, dejando el resultado como se aprecia en la imagen anterior.

Otra visualización interesante es la de tendencias (trends), que compara, para cada una de las búsquedas que hemos realizado, su evolución temporal, en base a un intervalo prefijado. Si por ejemplo, fijamos el intervalo en 1 día, comparará el número de ocurrencias de cada búsqueda en las últimas 24h, y el valor para las 24h anteriores, mostrando la diferencia en porcentaje.

Para finalizar, tenemos un gráfico de tarta que muestra la distribución de los protocolos IP utilizados por las alertas generadas.

En la parte inferior de la página vemos otra visualización por defecto, se trata de un listado detallado con un número determinado de alertas, de entre todas las que cumplen los requisitos indicados en las búsquedas. Como ya indiqué en el anterior post, se pueden seleccionar campos para que se ordene la información por ellos, y abrir cada alerta para ver todos sus campos.

Para finalizar el post, os voy a mostrar otra visualización muy interesante, que se puede obtener modificando el fichero de configuración que generamos para cargar los datos, añadiendo las siguientes líneas en el apartado filter:

  geoip {
	database => "/usr/share/GeoIP/GeoLiteCity.dat"
	source => ip_src
	target => geoip_src
  }
  geoip {
	database => "/usr/share/GeoIP/GeoLiteCity.dat"
	source => ip_dst
	target => geoip_dst
  }

Con ello obtendremos dos nuevos campos, con los que podremos generar mapas localizando hasta la ciudad a la que pertenecen las IP origen y destino de las alertas, siempre que sea posible.

Para obtener estos mapas el panel se creará con la visualización bettermap, y el único campo que necesitaremos introducir es el Coordinate, donde debemos indicar, por ejemplo, el campo geoip_src.location si queremos generar un mapa con los orígenes de los ataques.

El resultado es el siguiente:

Por supuesto, el mapa es navegable y al pulsar en cualquiera de los puntos el mapa se acerca, mostrando un desglose específico de las alertas por área geográfica.

En las últimas semanas se ha cambiado el proveedor de mapas para esta visualización, por lo que es posible que no se cargue ningún mapa al generar esta visualización. Para solucionar este problema, tan sólo es necesario realizar el cambio que se muestra en este commit de GitHub en el fichero vendor/kibana/app/panels/bettermap/module.js dentro de la carpeta donde se encuentra logstash.

Espero que os haya gustado esta entrada, y os animéis a jugar con este gran conjunto de herramientas.

Comments

  1. La verdad es que al final del proceso se consiguen unos informes visualmente útiles y atractivos.

  2. Hola Alejandro, muchas gracias por tu comentario.

    La verdad es que si, se consigue procesar mucha información y mostrarla de una forma muy sencilla y atractiva. Te animo a que lo pruebes si tienes oportunidad.

  3. Lo he estado probando y me gusta bastante.

    Hay varias cosas que me preocupan especialmente:

    * Rendimiento: ¿habéis probado a ponerlo en producción con un elasticsearch de verdad (no el embedded)? ¿Qué tal rendimiento os ha dado? ¿Habéis tenido que usar Redis o algún otro middleware?

    * Impacto del agente: no sé qué impacto pueda tener logstash en servidores. Se ve que no debe ser muy bueno cuando también han sacado el forwarder.

    * Control de acceso: por ahora creo que no hay control de acceso a elasticsearch.

  4. Chmeee: Si hablas del rendimiento como tal del ElasticSearch es una locura. Me escribe casi 2000 eventos por segundo en las pruenas y no he optimizado nada. Esta comiendo 3-4 cores.

    El uso de redis es porque logstash como shipper/indexer no es muy optimo haciendo buffering. Si el ES traga, eL logstash como indexer directo al ES va de miedo. Como shipper estoy usando nxlog porque no me gustaba logstash asi que no tengo tanta info.

    Respecto al logstash como agente en general si te equivocas con el filtro estas muerto. Grok como worker puede comerse 1000 cores si quiere. Hilar fino es un infierno si el log es complicado: multilinea etc etc… si vas a lo tipico no tendrás muchos problemas. Con un core se come mas de 600 lineas/s si el log es simple.

    Suerte!