Instalar ELK Stack (Elasticsearch, Logstash y Kibana) para el monitoreo de Logs. 1era Parte

En este tutorial les mostrare como instalar ELK Stack para usarlo en el monitoreo de logs. ¿Qué es ELK stack?? Bueno la compañía elastic ha creado un servidor web que ofrece información útil en tiempo real de casi cualquier tipo de fuente de datos estructurada y no estructurada. Para esto a combinado 3 potentes aplicaciones, elasticsearch, Logstash y Kibana.

  • Logstash: Procesa los logs que llegan
  • Elasticsearch: Almacena todos los logs
  • Kibana: Interfaz Web para buscar y visualizar los logs

La implementación de este server trae diversas dificultades, sobre todo; porque para su instalación debemos instalar oracle java y tanto el sitio de java como el sitio oficial del ELK están bloqueado para cuba. No obstante, les mostrare la forma de hacerlo a lo cubano.

Todo el tutorial lo he basado sobre debian 8, pero básicamente es lo mismo si usaran otra distro como ubuntu 16. Como los tengo acostumbrado en mis tutoriales les daré los pasos para un newbie en linux como yo. Cabe destacar que para la elaboración del mismo me base en más de 10 tutoriales distintos sobre el tema, y que cada vez que me trababa por algo tenía que investigar sobre el tema. Así que aquí hay mucha más información que en cualquier tutorial normal que exista sobre el tema en internet.

Durante todo el tutorial me referiré al server que se está creando como srvlogs.escfg.tur.cu que es el nombre real que le puse en mi dominio, lógicamente ustedes lo cambiaran por el suyo.

Empezamos instalando un debian 8, las características que recomiendo para este servidor son:

RAM: 4GB (con 2GB no levanta bien está probado)

CPU: 2 núcleos

HDD: 100 GB o mas (aquí se almacenará todos los logs parseados y analizados de tus servers)

seguido lo actualizaremos a lo más actual que haya en debian.

apt-get update
apt-get upgrade

Ahora instalaremos todas las herramientas que nos servirán o ayudarán en el proceso (paso opcional)

apt-get install mc
apt-get install tcpdump
apt-get install chkconfig

Instalamos curl que necesitaremos para comprobar elascticsearch.

apt-get install curl

Configuramos nuestro debian para poder acceder por SSH. Editamos el file sshd_config:

nano /etc/ssh/sshd_config

Comentamos y agregamos:

# Authentication:
LoginGraceTime 120
#PermitRootLogin without-password (comentamos esta linea)
PermitRootLogin yes (agregamos esta linea)
StrictModes yes

Ya tenemos acceso por SSH a nuestro debian así que podremos administrar remotamente y empezar a instalar nuestro ELK. Elasticsearch y Logstash necesitan ORACLE Java para funcionar, pero como todos sabemos ORACLE es una compañía de EUA por lo tanto nos aplica el bloqueo. Así que les mostrare un método para instalarlo y no morir en el intento. LOL

Nos bajamos el JDK 8 de ORACLE de cualquier otro sitio al que si le podamos llegar. Como, por ejemplo:

http://ftp.osuosl.org/pub/funtoo/distfiles/oracle-java/

NOTA: Mi preferencia es usar el JDK pero funciona bien con el JRE asi que si tienen mala conexion o les pesa bajar el JDK por ser más grande pueden hacer los siguientes pasos con el JRE.

Ya descargado el fichero jdk-8u121-linux-x64.tar.gz procederemos a descompactarlo en una carpeta para su uso. Yo opte por la carpeta OPT.

tar -zxf jdk-8u121-linux-x64.tar.gz -C /opt/

Debido a que hay muchas versiones del jdk 8 y puede que ustedes consigan otra diferente a la que use, para hacer este tutorial más universal entonces renombraremos la carpeta creada.

De /opt/jdk1.8.0_u121 a /opt/jdk1.8.0

Procederemos ahora a instalar nuestro java:

update-alternatives --install /usr/bin/java java /opt/jdk1.8.0/bin/java 100
update-alternatives --install /usr/bin/java java /opt/jdk1.8.0/bin/javac 100 (este es opcional)

Corremos este comando:

update-alternatives --display java

Y como solo tenemos una versión de java corriendo nos mostrara esto:

root@srvlogs:~# update-alternatives --display java
java - auto mode
link currently points to /opt/jdk1.8.0/bin/java
/opt/jdk1.8.0/bin/java - priority 100
Current 'best' version is '/opt/jdk1.8.0/bin/java'

Si quieren saber su version de java:

root@srvlogs:~# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

Procederemos ahora a instalar elasticserach. Al igual que el sitio de ORACLE la web https://www.elastic.co/ está sujeta a las leyes de EUA, por lo tanto, está bloqueada para cuba. Por lo que tendremos que bajarnos los ficheros manualmente usando TOR o Tunnel. Les dejo este TIPS corto para que sepan como hacerlo.

Al no poder acceder a la web de elasctic directamente me saltare los pasos de agregarla al repo local. A menos que tengamos una forma de saltarnos la prohibición impuesta por EUA esto no es relevante ahora.

Una vez descargado nuestro fichero de elastic elasticsearch-5.4.0.deb (el más reciente hasta la fecha de confeccion de este tutorial). Lo subimos a la carpeta Root y procederemos a instalarlo:

root@srvlogs:~# dpkg -i elasticsearch-5.4.0.deb
Selecting previously unselected package elasticsearch.
(Reading database ... 21030 files and directories currently installed.)
Preparing to unpack elasticsearch-5.4.0.deb ...
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Unpacking elasticsearch (5.4.0) ...
Setting up elasticsearch (5.4.0) ...

Estos servicios no levantan solo por lo que lo haremos despertar cada vez que nuestro debian arranque para esto usaremos el comando chkconfig que sirve para activar y desactivar servicios

root@srvlogs:~# chkconfig --add elasticsearch
elasticsearch 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Ya aseguramos que nuestro servicio de elasticsearch levante al iniciar el debian ahora levantaremos nuestro servicio. Aquí me detengo un poco, dependiendo de que distro tengamos será la forma de levantar el servicio. En debian 8 es muy fácil.

root@srvlogs:~# service elasticsearch start
[....] Starting Elasticsearch Server:sysctl: setting key "vm.max_map_count": Read-only file system
. ok

Si por cualquier motivo tuvieramos un error al arrancar el servicio, podremos encontrar los logs en la siguiente ubicación – /var/log/elasticsearch/

Ahora comprobaremos que todo está bien.

root@srvlogs:~# curl -i -XGET 'localhost:9200/'
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 327
{
"name" : "hAJ2L5S",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "LlxMguE3QGKS8uFoppvOPg",
"version" : {
"number" : "5.4.0",
"build_hash" : "780f8c4",
"build_date" : "2017-04-28T17:43:27.229Z",
"build_snapshot" : false,
"lucene_version" : "6.5.0"
},
"tagline" : "You Know, for Search"
}

Si hubiésemos puesto user y clave seria

curl 'http://user:pass@localhost:9200/'

Como pueden apreciar la respuesta fue satisfactoria así que nuestro elastic está funcionando. Ahora vamso a editar el fichero de configuración de elastic.

nano /etc/elasticsearch/elasticsearch.yml

Aquí solo cambie el nombre del servidor.

# Use a descriptive name for the node:
#
node.name: "srvlogs.escfg.tur.cu"            (descomente la línea y puse nombre al server)
#

Reiniciamos el servicio y comprobaremos el cambio.

service elasticsearch restart

root@srvlogs:~# curl http://localhost:9200/_nodes/process?pretty
{
"_nodes" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"cluster_name" : "elasticsearch",
"nodes" : {
"hAJ2L5SdQRmqZQT0hxWLEw" : {
"name" : "srvlogs.escfg.tur.cu",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1",
"version" : "5.4.0",
"build_hash" : "780f8c4",
"roles" : [
"master",
"data",
"ingest"
],
"process" : {
"refresh_interval_in_millis" : 1000,
"id" : 20031,
"mlockall" : false
}
}
}
}

Como veremos ya nuestro server tiene el nombre. Ahora nos detendremos en “mlockall” : false . Debido a que hacemos uso de oracle java nuestro servidor consumirá grandes cantidades de recursos, por lo tanto, trataremos de aliviar lo más que podamos eso. La variable mlockall debe quedarnos en true, esto significa que el proceso Java intentará bloquear el espacio de direcciones del proceso en la memoria. Impedir que cualquier memoria se intercambie en el disco. Como logramos esto:

Volvemos a editar la configuración de elastic.

nano /etc/elasticsearch/elasticsearch.yml

Buscamos y modificamos

# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: true    (descomentar y poner a true)
#

Paramos el servicio

service elasticsearch stop

Corremos este comando

ulimit -l unlimited

Iniciamos el servicio

service elasticsearch start

Y volvemos a probar

root@srvlogs:~# curl http://localhost:9200/_nodes/process?pretty
{
"_nodes" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"cluster_name" : "elasticsearch",
"nodes" : {
"hAJ2L5SdQRmqZQT0hxWLEw" : {
"name" : "srvlogs.escfg.tur.cu",
"transport_address" : "127.0.0.1:9300",
"host" : "127.0.0.1",
"ip" : "127.0.0.1",
"version" : "5.4.0",
"build_hash" : "780f8c4",
"roles" : [
"master",
"data",
"ingest"
],
"process" : {
"refresh_interval_in_millis" : 1000,
"id" : 21020,
"mlockall" : true
}
}
}
}

Con esto aseguramos que nuestro java no colapse cuando agota todos los recursos. Ahora procederemos a instalar KIBANA.

Nos bajamos kibana de la misma forma conque procedimos con elasticsearch, tengo que advertirles que las versiones de los 3 servicios deben coincidir.

Una vez bajado nuestro kibana-5.4.0-amd64.deb lo subimos a root. Y ahí lo instalamos.

root@srvlogs:~# dpkg -i kibana-5.4.0-amd64.deb
Selecting previously unselected package kibana.
(Reading database ... 21382 files and directories currently installed.)
Preparing to unpack kibana-5.4.0-amd64.deb ...
Unpacking kibana (5.4.0) ...
Setting up kibana (5.4.0) ...

Haremos el mismo procedimiento para el arranque que hicimos con elasticseach

root@srvlogs:~# chkconfig --add kibana
kibana 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Configuramos kibana

nano /etc/kibana/kibana.yml

# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 5601   (descomentar)
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback
address.
server.host: "srvlogs.escfg.tur.cu"    (descomentar y poner el nombre del server)

Arrancamos kibana

root@srvlogs:~# service kibana start
kibana started

Y comprobamos si ya podemos acceder a su web

http://srvlogs.escfg.tur.cu:5601

o

http://srvlogs.escfg.tur.cu:5601/status

Nuestro status debe estar en green si todo está bien. Mi consejo es que si están montando esto en proxmox y están probándolo hagan un backup del CT en este punto.

Status green

Por ultimo instalaremos Logstash. Del mismo modo en que bajamos los otros 2 ficheros hacemos este igual. Subimos el fichero 1494248522_logstash-5.4.0.deb a root para instalarlo

root@srvlogs:~# dpkg -i 1494248522_logstash-5.4.0.deb
Selecting previously unselected package logstash.
(Reading database ... 78876 files and directories currently installed.)
Preparing to unpack 1494248522_logstash-5.4.0.deb ...
Unpacking logstash (1:5.4.0-1) ...
Setting up logstash (1:5.4.0-1) ...
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash

Lo hacemos levantar al arrancar el debian

root@srvlogs:~# chkconfig --add logstash
logstash 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Levantamos el servicio

root@srvlogs:~# service logstash start
logstash started

La 1era vez que lo arrancamos nos dará un error, y es debido a que no tiene una configuración. Si miramos en:

/var/log/logstash/logstash-plain.log

[2017-05-12T22:05:34,242][INFO ][logstash.agent ] No config files found in path {:path=>"/etc/logstash/conf.d/*"}
[2017-05-12T22:05:34,248][ERROR][logstash.agent ] failed to fetch pipeline configuration {:message=>"No config files found: /etc/logstash/conf.d. Can you make sure this path is a logstash config file?"}

Le crearemos un fichero de configuración en blanco porque nos molesta tener errores

nano /etc/logstash/conf.d/empty.conf

Reiniciamos el servicio

service logstash restart

Con el siguiente comando pueden ver todo lo que puede hacer logstash

/usr/share/logstash/bin/logstash --help

Ahora les daré una idea resumida de cómo funciona.

Logstash recibe los logs y hace un análisis sintáctico de la estructura del log y se los pasa a elasticsearch con una estructura entendible para él. Pare ello usa 3 configuraciones:

INPUT (PLUGINS)

FILTER (PLUGINS)

OUTPUT (PLUGINS)

En Input le decimos que datos y que estructura de datos queremos procesar

En Filter usaremos una expresión regular con un patrón (grok) para dar forma, o analizar el dato. Podemos tener varios filtros plugins . Siempre el tiempo será nuestra variable llave.

Finalmente enviamos nuestra salida Output en forma de JSON a elasticsearch. Aunque podemos enviarla a cualquier otro servidor que haga lo mismo que elastic.

Como paso opcional podemos instalar X-PACK. Es de pago, pero nos da 30 días de trial, y puede sernos muy útil para ver nuestros errores y problemas. Este paso es completamente opcional.

Termino con algunas imagenes del server.

Esta 1era parte termina aquí en otros tutoriales entonces les mostrare como traer los logs de pfsense, squid y zimbra para su análisis y graficado.

alex out

 

4 Comments

  1. Usando Firefox 50.0 Firefox 50.0 en Windows 10 x64 Edition Windows 10 x64 Edition

    Tengo una duda cuando abro el kibana me sale la pantalla de (Configure an index patter), y en la parte de [time-field name] no me carga ningun dato

    • Usando Firefox 53.0 Firefox 53.0 en Windows 10 x64 Edition Windows 10 x64 Edition

      Es logico, el tutorial es la 1ra parte solo muestro como instalarlo. En los demas tutos les mostrare como traer sus logs y configurar los index…en dependencia del tipo de log….proxy, pfsense, iptable..postfix nginx..etc
      Cuando tu server empeice a recibir logs es cuando el index se desbloquea
      alex out

1 Trackback / Pingback

  1. Monitoreando logs de zimbra con ELK stack y graficado en grafana 2da parte | | Sysadmins de cuba

Dejar una contestacion

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


*