Clúster Elasticsearch. Logstash y Grafana. Análisis de logs. 4ta Parte.

Como les decía en el tercer artículo vamos ahora a configurar nuestro logstash para que filtre los logs de zimbra.
Logstash
Nos descargaremos los patrones y filtros que ya estan definidos para él y le haremos alguna que otra modificación. Instalamos git para clonar el repositorio de archivos

#apt-get install git

y seguidamente lo clonamos

#git clone https://github.com/ITLinuxCL/zimbra_logstash

Veremos que se crea una carpeta llamada zimbra_logstash y dentro estaran ya los filtros y patrones que vamos a utilizar en nuestro procesamiento de nuestros logs de zimbra.
Ahora modificaremos nuevamente el fichero output de logstash para su salida a elasticsearch pero en este caso para el zimbra, donde crea el indice.

#nano /etc/logstash/conf.d/output-elasticsearch.conf

Agregamos debajo de la salida de squid lo siguiente:

output {
if [host] == "squid" {
elasticsearch {
hosts => ["es-data-01.mpcfg.co.cu:9200","es-data-02.mpcfg.co.cu:9200","es-data-03.mpcfg.co.cu:9200"]
manage_template => false
index => "squid-%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
else if [host] == "mail" {
elasticsearch {
hosts => ["es-data-01.mpcfg.co.cu:9200","es-data-02.mpcfg.co.cu:9200","es-data-03.mpcfg.co.cu:9200"]
manage_template => false
index => "correo-%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}

}

Se agrega lo que esta en negrilla. Como vemos nuestro host se llama mail y esto debe coincidir con el nombre del host zimbra vuestro para que les funcione correctamente.
Vamos ahora a copiar los filtros necesarios de zimbra y los patrones de los cuales se van a auxiliar con el plugin grok para a partir de los mismos para hacer el parseo de los logs de zimbra.
En la carpeta donde clonamos con el git el repositorio de input, filtros, patrones y outputs.

#cd /root/zimbra_logstash/conf.d
#cp 10-filter-postfix.conf 15-filter-sasl.conf 16-filter-amavis.conf 17-filter-nginx.conf 18-filter-zimbra.conf 19-filter-mutate.conf /etc/logstash/conf.d

Copiamos la carpeta donde vienen definidos los patrones para la configuración de logstash.

#cp -R /root/zimbra_logstash/patterns /etc/logstash

Ahora modificaremos el fichero 10-filter-postfix.conf agregando estas lineas para usar la geolocalización de origen y destino de los mensajes de correo. Sugerencia para no equivocarse copiar lo siguente que esta en negrilla antes del ultimo corchete.

if [component] == "postsuper" {
grok {
patterns_dir => ["/etc/logstash/patterns/"]
match => [ "message", "%{POSTFIXPOSTSUPER}" ]
add_tag => [ "relay" ]
remove_tag => [ "unknown" ]
}
}

if [src_relayip] {
geoip {
source => "src_relayip"
target => "geoip"
database => "/etc/logstash/geoip/GeoLite2-City.mmdb"
fields => [ "country_code2", "country_name" ]
fields => [ "latitude", "longitude" ]
add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][location]", "%{[geoip][latitude]}" ]
add_tag => "geoip"
}
mutate {
convert => [ "[geoip][location]", "float"]
}
}
if [dst_relayip] {
geoip {
source => "dst_relayip"
target => "geoip"
database => "/etc/logstash/geoip/GeoLite2-City.mmdb"
fields => [ "country_code2", "country_name" ]
fields => [ "latitude", "longitude" ]
add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][location]", "%{[geoip][latitude]}" ]
add_tag => "geoip"
}
mutate {
convert => [ "[geoip][location]", "float"]
}
}

}

Ya casi tenemos todo listo pero nos falta aún pasarle la plantilla al elasticsearch, para el acomodo de algunos tipos de datos del índice como el de geoip para poder hacer bien los mapas de geolocalización. Recurrimos nuevamente la herramienta web del cluster de la primera parte cerebro. En el menu more seleccionamos index templates:

A la derecha crearemos el template con nombre correo-filebeat con el siguiente contenido:

{
"order": 0,
"template": "correo-filebeat-*",
"settings": {
"index": {
"number_of_replicas": "2",
"refresh_interval": "5s"
}
},
"mappings": {
"_default_": {
"dynamic_templates": [
{
"template1": {
"mapping": {
"ignore_above": 1024,
"index": "not_analyzed",
"type": "{dynamic_type}",
"doc_values": true
},
"match": "*"
}
}
],
"_all": {
"norms": false,
"enabled": true
},
"properties": {
"tls_info": {
"index": "false",
"type": "text"
},
"@timestamp": {
"type": "date"
},
"geoip": {
"dynamic": true,
"type": "object",
"properties": {
"ip": {
"type": "ip",
"doc_values": true
},
"latitude": {
"type": "float",
"doc_values": true
},
"country_code2": {
"index": "false",
"type": "text"
},
"country_name": {
"index": "false",
"type": "text"
},
"location": {
"type": "geo_point",
"doc_values": true
},
"longitude": {
"type": "float",
"doc_values": true
}
}
},
"offset": {
"type": "long",
"doc_values": "true"
},
"port": {
"index": "false",
"type": "integer"
},
"message": {
"index": "true",
"type": "text"
}
}
}
},
"aliases": {}
}


Reiniciamos el servicio logstash para que adquiera la nueva configuración

#service logstash restart

Verificamos inició bien.

#tail -100f /var/log/logstash/logstash-plain.log

[2017-06-07T21:00:02,920][INFO ][logstash.agent ] Successfully started
Logstash API endpoint {:port=>9600}

Zimbra

En el servidor zimbra instalaremos filebeat que es el servicio que le entregará los logs al logstash.
Lo descargamos:

# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-amd64.deb

Ya descargado lo instalamos.

#dpkg -i filebeat-5.4.1-amd64.deb

Ahora estamos listos para configurar el filebeat en el equipo remoto o sea el servidor de correo zimbra. En el servidor de correo editamos el fichero filebeat.yml. Como generamos para logstash un certificado debemos copiarselo también al servidor zimbra lo pondremos en la misma carpeta de filebeat en /etc/filebeat/ el fichero logstash.crt. Esto garantiza que la comunicación sea segura entre filebeat de zimbra y logstash como hemos mencionado anteriormente.

#nano /etc/filebeat/filebeat.yml

Solo modificaremos la sesiones de Filebeat prospectors y Logstash output.

#=================== Filebeat prospectors ======================

filebeat.prospectors:

# Each – is a prospector. Most options can be set at the prospector level, so
# you can use different prospectors for various configurations.
# Below are the prospector specific configurations.

– input_type: log
document_type: postfix
paths:
– /var/log/mail.log
# – /var/log/zimbra.log
– input_type: log
document_type: zimbra_audit
paths:
– /opt/zimbra/log/audit.log
– input_type: log
document_type: zimbra_mailbox
paths:
– /opt/zimbra/log/zmmailboxd.out
– input_type: log
document_type: nginx
paths:
– /opt/zimbra/log/nginx.access.log

#———————- Logstash output —————————
output.logstash:
# The Logstash hosts
hosts: [«logstash.dominio.com:5443«]

# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
bulk_max_size: 2048
ssl.certificate_authorities: [«/etc/filebeat/logstash.crt«]
template.name: «filebeat»
template.path: «filebeat.template.json»
template.overwrite: false
# Certificate for SSL client authentication
#ssl.certificate: «/etc/pki/client/cert.pem»

# Client Certificate Key
#ssl.key: «/etc/pki/client/cert.key»

Riniciamos el servicio de filebeat

#service filebeat restart

Verificamos el estado del servicio

#service filebeat status

filebeat.service – filebeat
Loaded: loaded (/lib/systemd/system/filebeat.service; disabled; vendor
preset: enabled)
Active: active (running) since dom 2017-06-25 21:13:41 CDT; 2s ago
Docs: https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Main PID: 9670 (filebeat)
CGroup: /system.slice/filebeat.service
└─9670 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml
-path.home /usr/share/filebeat -path.config /etc/filebeat

En este momento debe estar el filebeat de zimbra enviando ya los logs al logstash y este a su vez filtrándolos. Ya en nuestra web cerebro aparecerá el primer índice con el nombre correo-filebeat-YYYY-MM-dd y los shards primarios con sus respectivas replicas en el cluster.

Preparando Grafana para los dashboard de correo entrante y saliente

Establecemos el datasource de la misma forma que lo hicimos con el squid. Nuestro Data source debe llamarse correo-elastic para que el dashboard que les traigo no tengan que modificarlo.

Ahora solo nos queda importar en el grafana los dashboards que en este caso son dos y ya saben por el artículo anterior como hacerlo. Estos son los dashboards:

  1. Correo Saliente:correosaliente
  2. Correo Entrante.correoentrante

Captura de correo saliente:

Correo Entrante:

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4 / 5. Recuento de votos: 3

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

4 comentarios

  1. Google Chrome 97.0.4692.71 Google Chrome 97.0.4692.71 GNU/Linux x64 GNU/Linux x64
    Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36

    Hola, después de tanto tiempo, podrías actualizar el cluster a la versión más reciente de elastic, logstash y grafana?
    Va la 7.16

    Y si puede ser con Postfix como correo por favor…

  2. Google Chrome 92.0.4515.159 Google Chrome 92.0.4515.159 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36

    saludos cuando voy a crear el template con nombre correo-filebeat me da el siguiente error que puede ser.

    {
    «error»: {
    «root_cause»: [
    {
    «type»: «mapper_parsing_exception»,
    «reason»: «Root mapping definition has unsupported parameters: [_default_ : {dynamic_templates=[{template1={mapping={ignore_above=1024, index=not_analyzed, type={dynamic_type}, doc_values=true}, match=*}}], _all={norms=false, enabled=true}, properties={tls_info={index=false, type=text}, @timestamp={type=date}, geoip={dynamic=true, type=object, properties={ip={type=ip, doc_values=true}, latitude={type=float, doc_values=true}, country_code2={index=false, type=text}, country_name={index=false, type=text}, location={type=geo_point, doc_values=true}, longitude={type=float, doc_values=true}}}, offset={type=long, doc_values=true}, port={index=false, type=integer}, message={index=true, type=text}}}]»
    }
    ],
    «type»: «mapper_parsing_exception»,
    «reason»: «Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters: [_default_ : {dynamic_templates=[{template1={mapping={ignore_above=1024, index=not_analyzed, type={dynamic_type}, doc_values=true}, match=*}}], _all={norms=false, enabled=true}, properties={tls_info={index=false, type=text}, @timestamp={type=date}, geoip={dynamic=true, type=object, properties={ip={type=ip, doc_values=true}, latitude={type=float, doc_values=true}, country_code2={index=false, type=text}, country_name={index=false, type=text}, location={type=geo_point, doc_values=true}, longitude={type=float, doc_values=true}}}, offset={type=long, doc_values=true}, port={index=false, type=integer}, message={index=true, type=text}}}]»,
    «caused_by»: {
    «type»: «mapper_parsing_exception»,
    «reason»: «Root mapping definition has unsupported parameters: [_default_ : {dynamic_templates=[{template1={mapping={ignore_above=1024, index=not_analyzed, type={dynamic_type}, doc_values=true}, match=*}}], _all={norms=false, enabled=true}, properties={tls_info={index=false, type=text}, @timestamp={type=date}, geoip={dynamic=true, type=object, properties={ip={type=ip, doc_values=true}, latitude={type=float, doc_values=true}, country_code2={index=false, type=text}, country_name={index=false, type=text}, location={type=geo_point, doc_values=true}, longitude={type=float, doc_values=true}}}, offset={type=long, doc_values=true}, port={index=false, type=integer}, message={index=true, type=text}}}]»
    }
    },
    «status»: 400
    }

  3. Google Chrome 54.0.2840.99 Google Chrome 54.0.2840.99 Windows 8.1 x64 Edition Windows 8.1 x64 Edition
    Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36

    Saludos, excelente articulo, yo uso postfix-sql-dovecot, como puedo graficar

    • Firefox 60.0 Firefox 60.0 GNU/Linux x64 GNU/Linux x64
      Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0

      Un saludo. Tendrias que escoger que logs mandarías al logstash. Pero te sugiero que busques los artículos sobre graylog en este mismo blog. Creo que te ayudarian mucho.

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*