Integrando ELK y Exchange. Parte 1

Integrando ELK y Exchange. Parte 1

Comienzo una serie de artículos en los que quiero compartir mi experiencia conectando Exchange y ELK. Este conjunto ayudará a procesar grandes volúmenes de registros sin preguntarse en qué tamaño los instrumentos de registro habituales dejarán de sernos útiles. Conozcamos a nuestro nuevo aliado en el manejo de registros.

Exchange tiene un sistema de registro bastante extenso. Los registros más solicitados son los registros de seguimiento, que rastrean el paso a paso de correos específicos dentro de la organización de correo; los registros del servidor web, que siguen cada nueva sesión de usuario en el sistema, y los registros de aplicaciones web específicas con diferentes niveles de detalle. Además, Exchange puede almacenar registros en bruto de los protocolos smtp, imap y pop3.

¿Qué herramientas podemos utilizar para trabajar con los registros?

  • El cmdlet incorporado Get-MessageTrackingLog: conveniente para procesar registros de seguimiento;
  • La herramienta logparser: utiliza un lenguaje similar a SQL para buscar en los registros y funciona bastante rápido;
  • Un servidor SQL externo: para casos muy específicos (por ejemplo, análisis de datos a lo largo de períodos prolongados).

Todo esto funciona bien cuando tenemos un par de servidores y el volumen de registros procesados se mide en decenas o cientos de gigabytes. ¿Pero qué pasa si el número de servidores llega a ser decenas y el tamaño de los registros ha superado el terabyte? Este esquema, muy probablemente, comienza a fallar.

Y esto es lo que ocurre: Get-MessageTrackingLog comienza a fallar por tiempo de espera, logparser se topará con el límite de 32 bits, y la descarga en el servidor SQL se interrumpe en el momento menos adecuado, sin poder manejar una excepción de varias líneas del servicio.

Aquí entra en escena un nuevo jugador: el conjunto ELK, diseñado específicamente para manejar enormes volúmenes de registros de manera razonable y con un consumo de recursos tolerable.

En la primera parte explicaré detalladamente cómo conectar filebeat, que forma parte del conjunto ELK — se encarga de leer y enviar archivos de texto simples en los que diferentes aplicaciones registran sus registros. En los próximos artículos, profundizaremos en los componentes Logstash y Kibana.

Instalación

Así que, el archivo comprimido del agente filebeat se puede descargar de este sitio web..

Realizaremos la instalación simplemente descomprimiendo el contenido del archivo zip. Por ejemplo, en c:Program Filesfilebeat. Luego, es necesario ejecutar el script de PowerShell install-service-filebeat.ps1, que viene incluido, para instalar el servicio filebeat.

Ahora estamos listos para comenzar a configurar el archivo de configuración.

Tolerancia a fallos

Filebeat garantiza la entrega de logs al sistema de recolección de logs. Esto se logra mediante el mantenimiento de un registro de las entradas en los archivos de log. En el registro se almacena información sobre las entradas que se han leído de los archivos de log, y se marcan las entradas específicas que se han logrado entregar en el destino.

Si alguna entrada no puede ser entregada, filebeat intentará enviarla nuevamente hasta que reciba una confirmación de entrega del sistema receptor o hasta que el archivo de log original sea eliminado durante el proceso de rotación.

Al reiniciar el servicio, filebeat leerá del registro la información sobre las últimas entradas leídas y entregadas y comenzará a leer las entradas en los archivos de log, basándose en la información del registro.

Esto permite minimizar el riesgo de pérdida de información sobre los logs que deben enviarse a los servidores elasticlogstash durante interrupciones imprevistas y durante las operaciones de mantenimiento de los servidores.

Más detalles sobre esto se pueden encontrar en la documentación en los párrafos: ¿Cómo mantiene Filebeat el estado de los archivos? y ¿Cómo asegura Filebeat la entrega al menos una vez?

Configuración

Toda la configuración se realiza en un archivo de configuración en formato yml, que está dividido en varias secciones. Veamos algunas de ellas que participan en el proceso de recolección de logs desde los servidores de Exchange.

Bloque de procesamiento de logs

El bloque de procesamiento de logs comienza con el campo:

filebeat.inputs:

Vamos a utilizar una herramienta general de recolección de logs:

- type: log

Luego indicamos el estado (activado) y las rutas a la carpeta con los logs. Por ejemplo, en el caso de los logs de IIS, la configuración podría ser la siguiente:

    enabled: true
    paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log

Otra configuración importante: cómo filebeat debe leer entradas multislínea. Por defecto, filebeat considera que una línea del archivo de log es una entrada. Esto funciona bien hasta que comienzan a aparecer excepciones relacionadas con el mal funcionamiento del servicio. En este caso, las excepciones pueden constar de varias líneas. Por lo tanto, filebeat debe considerar la entrada multislínea como una sola, si la siguiente línea comienza con una fecha. El formato de las entradas en los logs de Exchange es el siguiente: cada nueva entrada en el archivo de log comienza con una fecha. En la configuración, esta condición se ve así:

multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after

Tiene sentido agregar etiquetas a la entrada enviada, por ejemplo:

  tags: ['IIS', 'ex-srv1']

Y no olvides excluir las líneas que comienzan con el símbolo de hash:

  exclude_lines: ['^#']

Así que el bloque de lectura de registros se verá de la siguiente manera:

filebeat.inputs:
- type: log
  enabled: true
  paths:
	- C:inetpublogsLogFilesW3SVC1*.log
	- C:inetpublogsLogFilesW3SVC2*.log
  multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']

Bloque de envío de registros

Las entradas individuales en el archivo de registro de filebeat se envían como un objeto json, en el cual una entrada particular del registro se contiene en un único campo message. Si queremos trabajar con esta información, necesitamos desglosar este campo en campos separados. Esto se puede hacer, por ejemplo, en logstash. Este será el receptor de las entradas de filebeat. Así es como puede verse en el archivo de configuración de filebeat:

output.logstash:
  hosts: ["logstash1.domain.com:5044"]

Si hay varios servidores, se puede habilitar el balanceo de carga: entonces filebeat enviará los registros no al primer servidor disponible de la lista, sino que distribuirá los registros enviados entre varios servidores:

hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true 

Al procesar registros, filebeat agrega metadatos al json enviado además de la entrada del registro que se encuentra en el campo message, lo que afecta el tamaño del documento que llega a elastic. Estos metadatos se pueden eliminar selectivamente del envío. Esto se hace en el bloque processor utilizando el procesador drop_fields. Se pueden excluir, por ejemplo, los siguientes campos:

processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

Hay que ser cuidadoso al elegir los campos a excluir, ya que algunos de ellos pueden ser utilizados en elastic para construir índices.

Así que el bloque de envío de registros se verá de la siguiente manera:

output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]

Configuraciones de registro de filebeat

Tiene sentido establecer las siguientes configuraciones de registro:

  • Nivel de registro info;
  • Grabar los registros en archivos ubicados por defecto (directorio logs, en el directorio de instalación de filebeat);
  • Nombre del archivo de registro — filebeat;
  • Conservar los últimos 10 archivos de registro;
  • Realizar rotación al alcanzar un tamaño de 1 MB.

La configuración final del registro se verá así:

logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Configuración final

Hemos recopilado la configuración, y ahora se ve de la siguiente manera:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:inetpublogsLogFilesW3SVC1*.log
    - C:inetpublogsLogFilesW3SVC2*.log
  multiline:
    pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    negate: true
    match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']
 
output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
    fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]
 
logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576

Es importante entender que el formato del archivo de configuración es yml. Por lo tanto, es esencial colocar correctamente los espacios y los signos de menos.

Filebeat puede verificar el archivo de configuración y, si la sintaxis contiene errores, indicará en qué línea y en qué lugar de la línea la sintaxis es incorrecta. La verificación se realiza de la siguiente manera:

.filebeat.exe test config

Además, filebeat puede verificar la disponibilidad de red del receptor de registros. La verificación se inicia así:

.filebeat.exe test output

En las siguientes partes, hablaré sobre la conexión y la interacción de Exchange con los componentes de Logstash y Kibana.

Enlaces útiles

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster