Cómo instalar Elasticsearch, Logstash y Kibana (ELK Stack) en CentOS/RHEL 7


Si usted es una persona que está, o ha estado en el pasado, a cargo de inspeccionar y analizar los registros del sistema en Linux, sabe en qué pesadilla puede convertirse esa tarea si se monitorean múltiples servicios simultáneamente.

En días pasados, esa tarea tenía que realizarse principalmente de forma manual, y cada tipo de registro se manejaba por separado. Afortunadamente, la combinación de Elasticsearch, Logstash y Kibana en el lado del servidor, junto con Filebeat en el lado del cliente, hace que esa tarea una vez difícil parezca un paseo por el parque hoy.

Los primeros tres componentes forman lo que se llama una pila ELK, cuyo objetivo principal es recopilar registros de varios servidores al mismo tiempo (también conocido como registro centralizado).

Una interfaz web incorporada basada en Java le permite inspeccionar los registros rápidamente de un vistazo para facilitar la comparación y la resolución de problemas. Estos registros de cliente son enviados a un servidor central por Filebeat, que puede describirse como un agente de envío de registros.

Veamos cómo encajan todas estas piezas. Nuestro entorno de prueba constará de las siguientes máquinas:

Central Server: CentOS 7 (IP address: 192.168.0.29). 2 GB of RAM.
Client #1: CentOS 7 (IP address: 192.168.0.100). 1 GB of RAM.
Client #2: Debian 8 (IP address: 192.168.0.101). 1 GB of RAM.

Tenga en cuenta que los valores de RAM proporcionados aquí no son requisitos previos estrictos, sino valores recomendados para una implementación exitosa de la pila ELK en el servidor central. Menos RAM en los clientes no hará mucha diferencia, si es que hay alguna, en absoluto.

Instalación de ELK Stack en el servidor

Comencemos instalando la pila ELK en el servidor, junto con una breve explicación de lo que hace cada componente:

  1. Elasticsearch almacena los registros que envían los clientes.
  2. Logstash procesa esos registros.
  3. Kibana proporciona la interfaz web que nos ayudará a inspeccionar y analizar los registros.

Instale los siguientes paquetes en el servidor central. En primer lugar, instalaremos Java JDK versión 8 (actualización 102, la última en el momento de escribir este artículo), que es una dependencia de los componentes de ELK.

Es posible que desee verificar primero en la página de descargas de Java aquí para ver si hay una actualización más nueva disponible.

# yum update
# cd /opt
# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u102-b14/jre-8u102-linux-x64.rpm"
# rpm -Uvh jre-8u102-linux-x64.rpm

Es hora de comprobar si la instalación se completó correctamente:

# java -version

Para instalar las últimas versiones de Elasticsearch, Logstash y Kibana, tendremos que crear repositorios para yum manualmente de la siguiente manera:

1. Importe la clave GPG pública de Elasticsearch al administrador de paquetes rpm:

# rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

2. Inserte las siguientes líneas en el archivo de configuración del repositorio elasticsearch.repo :

[elasticsearch]
name=Elasticsearch repository
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

3. Instale el paquete Elasticsearch.

# yum install elasticsearch

Cuando se complete la instalación, se le pedirá que inicie y habilite elasticsearch:

4. Inicie y habilite el servicio.

# systemctl daemon-reload
# systemctl enable elasticsearch
# systemctl start elasticsearch

5. Permita el tráfico a través del puerto TCP 9200 en su firewall:

# firewall-cmd --add-port=9200/tcp
# firewall-cmd --add-port=9200/tcp --permanent

6. Verifique si Elasticsearch responde a solicitudes simples a través de HTTP:

# curl -X GET http://localhost:9200

La salida del comando anterior debería ser similar a:

Asegúrese de completar los pasos anteriores y luego continúe con Logstash. Dado que tanto Logstash como Kibana comparten la clave GPG de Elasticsearch, no es necesario volver a importarla antes de instalar los paquetes.

7. Inserte las siguientes líneas en el archivo de configuración del repositorio logstash.repo :

[logstash]
name=Logstash
baseurl=http://packages.elasticsearch.org/logstash/2.2/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

8. Instale el paquete Logstash:

# yum install logstash

9. Agregue un certificado SSL basado en la dirección IP del servidor ELK en la siguiente línea debajo de la sección [v3_ca] en /etc/pki/tls/openssl.cnf:

[ v3_ca ]
subjectAltName = IP: 192.168.0.29

10. Genere un certificado autofirmado válido por 365 días:

# cd /etc/pki/tls
# openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

11. Configure los archivos de entrada, salida y filtro de Logstash:

Entrada: Cree /etc/logstash/conf.d/input.conf e inserte las siguientes líneas en él. Esto es necesario para que Logstash "aprenda" a procesar ritmos provenientes de los clientes. Asegúrese de que la ruta al certificado y la clave coincidan con las rutas correctas como se describe en el paso anterior:

input {
  beats {
	port => 5044
	ssl => true
	ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
	ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

Archivo de salida ( /etc/logstash/conf.d/output.conf ):

output {
  elasticsearch {
	hosts => ["localhost:9200"]
	sniffing => true
	manage_template => false
	index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
	document_type => "%{[@metadata][type]}"
  }
}

Archivo de filtro ( /etc/logstash/conf.d/filter.conf ). Registraremos los mensajes de syslog para simplificar:

filter {
if [type] == "syslog" {
	grok {
  	match => { "message" => "%{SYSLOGLINE}" }
	}

	date {
match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
  }
}

12. Verifique los archivos de configuración de Logstash.

# service logstash configtest

13. Inicie y habilite logstash:

# systemctl daemon-reload
# systemctl start logstash
# systemctl enable logstash

14. Configure el firewall para permitir que Logstash obtenga los registros de los clientes (puerto TCP 5044):

# firewall-cmd --add-port=5044/tcp
# firewall-cmd --add-port=5044/tcp --permanent

14. Inserte las siguientes líneas en el archivo de configuración del repositorio kibana.repo :

[kibana]
name=Kibana repository
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

15. Instale el paquete Kibana:

# yum install kibana

16. Inicie y habilite Kibana.

# systemctl daemon-reload
# systemctl start kibana
# systemctl enable kibana

17. Asegúrese de que puede acceder a la interfaz web de Kibana desde otra computadora (permita el tráfico en el puerto TCP 5601):

# firewall-cmd --add-port=5601/tcp
# firewall-cmd --add-port=5601/tcp --permanent

18. Inicie Kibana ( http://192.168.0.29:5601 ) para verificar que puede acceder a la interfaz web:

Regresaremos aquí después de haber instalado y configurado Filebeat en los clientes.

Instalar Filebeat en los servidores cliente

Le mostraremos cómo hacer esto para el Cliente # 1 (repita para el Cliente # 2 después, cambiando las rutas si corresponde a su distribución).

1. Copie el certificado SSL del servidor a los clientes:

# scp /etc/pki/tls/certs/logstash-forwarder.crt [email protected]:/etc/pki/tls/certs/

2. Importe la clave GPG pública de Elasticsearch al administrador de paquetes rpm:

# rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

3. Cree un repositorio para Filebeat ( /etc/yum.repos.d/filebeat.repo ) en distribuciones basadas en CentOS:

[filebeat]
name=Filebeat for ELK clients
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1

4. Configure la fuente para instalar Filebeat en Debian y sus derivados:

# aptitude install apt-transport-https
# echo "deb https://packages.elastic.co/beats/apt stable main" > /etc/apt/sources.list.d/filebeat.list
# aptitude update

5. Instale el paquete Filebeat:

# yum install filebeat        [On CentOS and based Distros]
# aptitude install filebeat   [On Debian and its derivatives]

6. Inicie y habilite Filebeat:

# systemctl start filebeat
# systemctl enable filebeat

Una advertencia aquí. La configuración de Filebeat se almacena en un archivo YAML, que requiere una sangría estricta. Tenga cuidado con esto al editar /etc/filebeat/filebeat.yml de la siguiente manera:

  1. En las rutas, indique qué archivos de registro deben "enviarse" al servidor ELK.
  2. Bajo buscadores:

input_type: log
document_type: syslog

  1. Bajo resultado:
    1. Descomente la línea que comienza con logstash.
    2. Indique la dirección IP de su servidor ELK y el puerto donde Logstash escucha en los hosts.
    3. Asegúrese de que la ruta al certificado apunte al archivo real que creó en el Paso I (sección Logstash) anterior.

    Los pasos anteriores se ilustran en la siguiente imagen:

    Guarde los cambios y luego reinicie Filebeat en los clientes:

    # systemctl restart filebeat
    

    Una vez que hayamos completado los pasos anteriores con los clientes, no dude en continuar.

    Para verificar que los registros de los clientes se puedan enviar y recibir con éxito, ejecute el siguiente comando en el servidor ELK:

    # curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
    

    La salida debe ser similar a (observe cómo se reciben los mensajes de/var/log/messages y/var/log/secure de client1 y client2):

    De lo contrario, compruebe si hay errores en el archivo de configuración de Filebeat.

    # journalctl -xe
    

    después de intentar reiniciar, Filebeat le indicará las líneas infractoras.

    Una vez que hayamos verificado que los clientes envían los registros y se reciben correctamente en el servidor. Lo primero que tendremos que hacer en Kibana es configurar un patrón de índice y establecerlo por defecto.

    Puede describir un índice como una base de datos completa en un contexto de base de datos relacional. Iremos con filebeat- * (o puede utilizar un criterio de búsqueda más preciso como se explica en la documentación oficial).

    Ingrese filebeat- * en el campo Nombre de índice o patrón y luego haga clic en Crear:

    Tenga en cuenta que se le permitirá ingresar un criterio de búsqueda más detallado más adelante. A continuación, haga clic en la estrella dentro del rectángulo verde para configurarlo como el patrón de índice predeterminado:

    Finalmente, en el menú Descubrir encontrará varios campos para agregar al informe de visualización de registros. Simplemente coloque el cursor sobre ellos y haga clic en Agregar:

    Los resultados se mostrarán en el área central de la pantalla como se muestra arriba. Siéntase libre de jugar (agregar y eliminar campos del informe de registro) para familiarizarse con Kibana.

    De forma predeterminada, Kibana mostrará los registros que se procesaron durante los últimos 15 minutos (consulte la esquina superior derecha), pero puede cambiar ese comportamiento seleccionando otro período de tiempo:

    Resumen

    En este artículo, hemos explicado cómo configurar una pila ELK para recopilar los registros del sistema enviados por dos clientes, una máquina CentOS 7 y una Debian 8.

    Ahora puede consultar la documentación oficial de Elasticsearch y encontrar más detalles sobre cómo usar esta configuración para inspeccionar y analizar sus registros de manera más eficiente.

    Si tiene alguna pregunta, no dude en preguntar. Esperamos con interés escuchar de usted.