Clúster Elasticsearch. Logstash y Grafana. Análisis de logs. 3ra Parte.

En los dos artículos anteriores dejamos todo listo para empezar a programarle los filtros a Logstash y enviarlos a almacenar en el clúster elasticsearch. Empezaremos por un servicio popular en todas nuestras redes que es el servicio de navegación y en nuestro caso el más común Squid.
En el Servidor Logstash
Vamos a crear dos ficheros importantes que son el input y el output. Debemos tener en cuenta que los ficheros Input, Filters y Output se ubican en la carpeta /etc/logstash/conf.d.

#nano /etc/logstash/conf.d/filebeat-input.conf

con el contenido:

input {
beats {
port => 5443
type => syslog
ssl => true
ssl_certificate => "/etc/logstash/logstash.crt"
ssl_key => "/etc/logstash/logstash.key.pem"
}
}

Como vemos ponemos a escuchar el logstash por el puerto 5443 y los logs de tipo syslogs con la configuración de ssl de certificado y llave respectivamente para su comunicación segura desde los equipos remotos.
Crearemos también el fichero de filtro inicial para syslog de la siguiente manera:

#nano /etc/logstash/conf.d/syslog-filter.conf

Conteniendo lo siguiente:

filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}

Lo que esta en negrilla es plugin llamado grok para hacer el parseo de los ficheros.
Ahora crearemos el fichero output de logstash para su salida a elasticsearch, donde crea el indice.

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

Con el contenido:

output {
if [host] == "squid" {
elasticsearch {
hosts => ["es-data-01.dominio.com:9200","es-data-02.dominio.com:9200","es-data-03.dominio.com:9200"]
index => "squid-%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
}

Ponemos como condición el nombre del equipo que envía los logs. En este caso el nombre de mi server squid, que es squid para este ejemplo y más adelante en los próximos artículos para los logs de zimbra, nginx y pfsense poder tener separados los índices por cada host en cuestión ya que sería muy engorroso tener todos los parámetros a medir de cada uno de ellos en un solo indice. Como vemos en la sesión elasticsearch declaramos los tres nodos de datos a los cuales le podremos enviar los datos filtrados.

Creamos el filtro de logstash que se encargará de filtrar y etiquetear los logs de squid.

#nano /etc/logstash/conf.d/20-squid.conf

y copiamos dentro del mismo el siguiente contenido:

filter {
if [type] == "squid3" {
grok {
break_on_match => false
# add/change pattern
patterns_dir => [ "/etc/logstash/patterns/" ]
match => [ "message" , "%{INT:timestamp:int}.%{INT:timestamp_ms}\s+%{INT:response_time} %{IPORHOST:src_ip} %{WORD:squid_request_status}/%{INT:http_status} %{INT:reply_size_include_header} %{WORD:http_method} (%{URIHOST:request_url}|%{U$
# domain-name from url
match => [ "message" , "%{INT}.%{INT}\s+%{INT} %{IPORHOST} %{WORD}/%{INT} %{INT} %{WORD} (%{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{IPORHOST:domain}(?::%{POSINT:port})?)?(?:%{URIPATHPARAM})?|%{IPORHOST:domain}(?::%{POSINT:port})?) %{U$
}
date {
# convert unixtime to timestamp
match => [ "timestamp", "UNIX" ]
}

if [server_ip] {
geoip {
source => "server_ip"
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"]
}
}
}
}

Como vemos el tipo es squid3 y eso lo declararemos mas adelante cuando instalemos y configuremos el paquete filebeat en el propio server squid. O sea que si el tipo de documento coincide con squid3 aplicará este filtro.

Vamos a crear el patrón que va a usar squid.

#nano /etc/logstash/patterns/squid

Con el contenido:

# overwride URIPARAM
URIPARAM \?[ÄÖÜöäüßA-Za-z0-9$.+!*'|(){},~@#%&/=:;_?\-\[\]]*
# add new pattern
MYTEST [A-Za-z0-9]*
#########

Reiniciamos ahora logstash para que se cargue la configuración que añadimos para squid.

#service logstash restart

Verificamos inició bien.

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

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

Preparemos entonces la plantilla de squid para elasticsearch. Para ello usaremos 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 squid-filebeat con el siguiente contenido:

{
"order": 0,
"template": "squid-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": {
"@timestamp": {
"type": "date"
},
"reply_size_include_header": {
"index": "false",
"type": "long"
},
"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": {}
}

Ya tenemos preparado elasticsearch y  también configurado el fitro y la salida de logstash para los logs del squid.
En el servidor squid
En el squid 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 squid. Como generamos para logstash un certificado debemos copiárselo también al servidor squid lo pondremos en la misma carpeta de filebeat en /etc/filebeat/ el fichero logstash.crt como vimos en la 2da parte, lo cual garantiza que la comunicación sea
segura entre filebeat de squid y logstash como hemos mencionado anteriormente. Editamos el fichero filebeat.yml.

# 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: squid3
paths:
- /var/log/squid3/access.log

Y en Logstash output se define a que servidor logstash le va a entregar
el filebeat los logs de squid
#------------------------ 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"

Reiniciamos 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: e
nabled)
Active: active (running) since vie 2017-06-16 21:25:19 CDT; 2 days ago
Docs: https://www.elastic.co/guide/en/beats/filebeat/current/index.html
Main PID: 30975 (filebeat)
CGroup: /system.slice/filebeat.service
└─30975 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.hom
e /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -p
ath.logs /var/log/filebeat

Ya en nuestra web cerebro aparecerá el primer índice con el nombre squid-filebeat-YYYY-MM-dd y los shards primarios con sus respectivas replicas en el cluster,

Preparando de Grafana para nuestro primer dashboard

Plugins

Por defecto grafana trae unos cuantos plugins pero tenemos que tener instalados los plugins necesarios que utilizaremos en nuestro dashboards, el cual brindaré con gusto para que usen en sus redes.

Para instalar plugins de grafana vamos a https://grafana.com/plugins?utm_source=grafana_plugin_list donde encontraremos estos plugins. En nuestro caso usaremos los plugins de panel.

Por ejemplo, si queremos instalar el plugin Worldmap Panel lo seleccionamos y cuando abra la página vamos a Installation, por defecto los plugins se instalan en /var/lib/grafana/plugins así que podemos bajarlo manualmente y copiarlo descompactado en esa carpeta. Así haremos con todos los necesarios.

Data Sources

En la web de grafana crearemos el Data Source que se conecte a cualquiera de lo nodos master que tenemos en el cluster elasticsearch.

Agregamos el datasource con los siguientes datos:

Como ponemos ver nombramos la conexión y aconsejo pongan el mismo, «squid-elastic», para que no tengan que cambiarlo cuando importen el dashboard. El tipo de conexión es elasticsearch por supuesto y la url es la de uno de los nodos masters que configuramos anteriormente con el puerto 9200. El index name con [squid-filebeat-]YYYY.MM.DD con el patron Daily.

Importando Dashboard

Vamos a importar el dashboard de squid y lo hacemos seleccionando en la opción de igual nombre la acción de import.

Seguidamente nos abre un diálogo en el cual podemos subir nuestro fichero que podemos obtener de Grafana Dashboards

Y así ya podremos ver nuestro dashboard en acción.

Eso es todo por ahora en el próximo artículo veremos lo mismo pero con zimbra.

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

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 1

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

Sé el primero en comentar

Dejar una contestacion

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


*