Exportar los logs de Microsoft Azure a ElasticSearch

Una de las cosas que me encanta de mi trabajo es que puedo trastear con cualquier tecnología, ya sea de Microsoft o no. En estos días he estado viendo la forma más sencilla de enviar todos los logs que necesite, de diferentes servicios, a ElasticSearch, con el objetivo de visualizarlos con Kibana. En este artículo te muestro cómo hacerlo.

ELK en Microsoft Azure

Para este artículo voy a utilizar la plantilla oficial de Elastic que hay en el MarketPlace de Azure.

Plantilla de ELK en Azure Marketplace

A parte de los campos obligatorios, no he configurado nada en particular a excepción de que he indicado que quiero instalar Logstash, para que me ayude con la ingesta de los logs.

Instalar Logstash con la plantilla de ELK en Azure Marketplace

La instalación puede tardar unos minutos, ya que necesita crear varias máquinas virtuales.

Azure Monitoring Module

En el año 2018 se anunció un módulo llamado Azure Monitoring, que permite una integración sencilla entre Elastic y Microsoft Azure, y es el que vamos a utilizar para lograr nuestro objetivo.

Azure Monitoring Module

Este hace uso del plugin para Event Hubs (viene preinstalado desde la versión 6.4), que le permite a Logstash recuperar los eventos que se van a exportar desde diferentes servicios. Además, también nos genera de manera automática una serie de Dashboards que seguro que te ayudan en el inicio.

Cómo enviar los logs a Azure Event Hubs

Como te decía, el objetivo es que ElasticSearch sea capaz de recuperar los eventos de diferentes servicios de la plataforma. El flujo es muy sencillo: vamos a habilitar la exportación de los logs al servicio Event Hub (necesitas tener creado un namespace de antemano) y Logstash se conectará a ellos para mandarlos a ElasticSearch. En este artículo vamos a ver cómo es la configuración de algunos logs, para que sepas dónde está dicha configuración.

Activity Logs

Se trata de la actividad que se genera en las suscripciones de Microsoft Azure (quién ha hecho qué y cuándo). Para configurar la exportación de los logs debes ir a Azure Monitor > Activity Log > Export to Event Hub.

Dentro de este apartado solo tienes que marcar el check Export to an event hub y seleccionar el namespace de Event Hub que quieres utilizar.

Esta exportación creará un event hub llamado insights-operational-logs dentro del namespace seleccionado.

Logs de Azure SQL Database

Otra fuente de logs podría ser los de las bases de datos de Azure SQL Database. La forma de configurarlos es bastante similar y este proceso puede valerte para otros servicios de la plataforma. Accede a una de tus bases de datos y en el apartado de Diagnostics settings haz clic en + Add diagnostic setting. Selecciona todos los logs que quieras exportar:

Si quieres que exista un event hub por tipo de log, puede dejar el campo en blanco en la configuración del event hub.

Así podríamos seguir con diferentes servicios dentro de la plataforma que queramos exportar a nuestro stack de Elastic, ya que la configuración es exactamente igual en todos ellos. Al cabo de unos instantes en el servicio de Event Hub podremos ver todos los que se han ido creando, conforme se han ido generado métricas para cada uno de ellos. La foto debería de ser parecida a la siguiente:

Event hubs generados al configurar la exportación de Logs en Microsoft Azure

Configuración de Logstash

Ahora que ya tienes event hubs de los que consumir registros, solo queda configurar tu logstash recien creado. Para ello, vamos a acceder al mismo a través de la VM de Kibana, que es la que nos hace de jumpbox o puente al resto de máquinas. Abre un terminal y accede por SSH a la IP pública de kibana:

ssh IP_PUBLICA_KIBANA

Ahora haz un nuevo ssh a la VM de logstash:

ssh logstash-0

Esta máquina ha sido configurada para ejecutar logstash como servicio, por lo que antes de modificar la configuración para el mismo debes parar el servicio:

systemctl stop logstash.service

Lo siguiente es modificar la configuración de logstash, la cual se encuentra en /etc/logstash/logstash.yml.

sudo nano /etc/logstash/logstash.yml

La misma debería de ser de la siguiente manera:

node.name: "logstash-0"
path.data: /var/lib/logstash
path.logs: /var/log/logstash
log.level: info

modules:
  - name: azure
    var.elasticsearch.hosts: "${ELASTICSEARCH_URL}"
    var.elasticsearch.username: elastic
    var.elasticsearch.password: "ELASTIC_PASSWORD"
    var.kibana.host: kibana:5601
    var.kibana.username: elastic
    var.kibana.password: "KIBANA_PASSWORD"
    var.kibana.ssl.enabled: false
    var.input.azure_event_hubs.decorate_events: true
    var.input.azure_event_hubs.consumer_group: "logstash"
    var.input.azure_event_hubs.storage_connection: "DefaultEndpointsProtocol=https;AccountName=..."
    var.input.azure_event_hubs.threads: 9
    var.elasticsearch.ssl.enabled: false
    var.input.azure_event_hubs.event_hub_connections:
      - "Endpoint=sb://...;EntityPath=insights-operational-logs"
      - "Endpoint=sb://...;EntityPath=insights-metrics-pt1m"
      - "Endpoint=sb://...;EntityPath=insights-logs-blocks"
      - "Endpoint=sb://...;EntityPath=insights-logs-databasewaitstatistics" 
      - "Endpoint=sb://...;EntityPath=insights-logs-errors"
      - "Endpoint=sb://...;EntityPath=insights-logs-querystoreruntimestatistics"
      - "Endpoint=sb://...;EntityPath=insights-logs-querystorewaitstatistics"
      - "Endpoint=sb://...;EntityPath=insights-logs-timeouts"
      - "Endpoint=sb://...;EntityPath=insights-logs-sqlsecurityauditevents"

Como ves, necesitas configurar los usuarios y contraseñas para elastic y kibana (en el archivo /etc/logstash/logstash.keystore tienes almacenadas un par de claves: ELASTICSEARCH_URL y LOGSTASH_SYSTEM_PASSWORD. Te recomiendo que los datos sensibles los almacenes también allí, una vez que pruebes que todo funciona correctamente). Por otro lado, en la configuración del módulo de azure, necesitas indicar una cuenta de Azure Storage, un consumer group de Event Hub (yo he creado uno nuevo por cada event hub llamado logstash) y debes añadir la cadena de conexión de todos los event hubs que quieras consumir.

Arrancar logstash

La primera vez que arranques Logstash con tu nueva configuración, necesitarás lanzarlo de manera manual para poder especificar el parámetro –setup, que creará el patrón del indice (azure-*) en Kibana y los dashboards.

set +o history
# export the keystore password into env variable
pass=$(sudo grep -Po "(?<=^LOGSTASH_KEYSTORE_PASS=).*" /etc/sysconfig/logstash | sed 's/"//g')
export LOGSTASH_KEYSTORE_PASS="$pass"
set -o history

sudo -Eu logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash --setup

Si todo ha salido bien, ahora puedes acceder a Kibana, a través del DNS que se ha generado para la máquina virtual, a través del puerto 5601.

En el apartado Management > Kibana > Index Patterns verás que tienes un nuevo patrón de indice llamado azure-*

En la sección Dashboards tendrás cargados diferentes paneles que empiezan por [Azure Monitor], que podrás ver con información o no dependiendo de las métricas que estés exportando:

Por supuesto, podrás ver toda la información indexada en el apartado Discover, para que lo modeles a tu gusto 😀

Una vez que compruebes que todo se ha cargado correctamente, puedes dejar lanzado logstash como servicio:

systemctl start logstash.service

¡Saludos!