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:
- Correo Saliente:correosaliente
- Correo Entrante.correoentrante
Captura de correo saliente:
Correo Entrante:
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…
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
}
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
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.