Monitoreo de logs centralizado con ELK Stack (Elasticsearch, Logstash, Kibana)
Introducci贸n
En entornos de producci贸n modernos, la dispersi贸n de logs entre m煤ltiples servidores (aplicaciones web, bases de datos, balanceadores de carga) representa un desaf铆o cr铆tico para la operaci贸n y la resoluci贸n de incidentes. Sin una centralizaci贸n efectiva, el diagn贸stico de fallos se convierte en una tarea manual, lenta y propensa a errores. ELK Stack (Elasticsearch, Logstash, Kibana) se ha consolidado como la soluci贸n open-source de facto para la agregaci贸n, procesamiento y visualizaci贸n de logs a escala.
Este art铆culo desglosa la implementaci贸n de un pipeline completo de monitoreo centralizado con ELK, desde la arquitectura base hasta la configuraci贸n de Logstash para parsing y el env铆o seguro de logs desde clientes remotos mediante Filebeat. Se asume un entorno Linux (Ubuntu 22.04 LTS) y versiones recientes de la pila (8.x).
Arquitectura del Pipeline ELK
Antes de profundizar en la configuraci贸n, es vital comprender el flujo de datos. Un pipeline t铆pico consta de cuatro capas:
- Shipper (Filebeat): Agente ligero instalado en cada servidor fuente. Lee archivos de log, los env铆a de forma confiable a Logstash (o directamente a Elasticsearch) utilizando un protocolo de red (Beats).
- Parser/Transformador (Logstash): Servidor central que recibe eventos, los parsea (estructura), los filtra, los enriquece (ej. a帽adiendo geolocalizaci贸n desde una IP) y los env铆a a Elasticsearch.
- Almacenamiento/B煤squeda (Elasticsearch): Motor de b煤squeda y an谩lisis distribuido. Indexa los datos recibidos y los expone a trav茅s de una API RESTful.
- Visualizaci贸n (Kibana): Interfaz web que se conecta a Elasticsearch para construir dashboards, realizar b煤squedas ad-hoc y generar alertas.
Nota importante sobre versiones: Es imperativo mantener la compatibilidad de versiones entre todos los componentes de la pila. Utilizar Elasticsearch 8.4 con Logstash 8.4 y Filebeat 8.4. Mezclar versiones puede generar fallos en los protocolos de comunicaci贸n interna.
Instalaci贸n y Configuraci贸n de Elasticsearch
Elasticsearch es el n煤cleo del sistema. Su configuraci贸n debe priorizar la estabilidad y la seguridad.
Instalaci贸n desde el repositorio oficial
# Importar la clave GPG oficial de Elastic
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# A帽adir el repositorio (ajustar para la versi贸n 8.x)
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# Actualizar e instalar
sudo apt-get update && sudo apt-get install elasticsearch
驴Por qu茅 este m茅todo? Instalar desde el .deb oficial garantiza que las dependencias (como la JVM empaquetada de Elastic) est茅n correctamente gestionadas y que las actualizaciones de seguridad se apliquen mediante apt upgrade.
Configuraci贸n cr铆tica (/etc/elasticsearch/elasticsearch.yml)
# --- Red y Descubrimiento ---
# Escuchar en todas las interfaces (ajustar con firewall para restringir)
network.host: 0.0.0.0
# Puerto de comunicaci贸n entre nodos
transport.port: 9300
# Configuraci贸n para un cl煤ster de un solo nodo (entornos de desarrollo/prueba)
# En producci贸n, se debe configurar discovery.seed_hosts y cluster.initial_master_nodes
discovery.type: single-node
# --- Seguridad (Obligatorio en 8.x) ---
# Habilitar TLS para la capa de transporte
xpack.security.transport.ssl.enabled: true
# Autogenerar certificados (o especificar rutas)
xpack.security.enabled: true
# --- Memoria y Heap ---
# NO configurar aqu铆. Se configura en jvm.options.d/ o con variables de entorno
# ES_HEAP_SIZE=4g (m谩ximo 50% de la RAM del servidor, no superar 32GB)
El porqu茅 de discovery.type: single-node: En entornos de laboratorio o servidores peque帽os, esta configuraci贸n evita que Elasticsearch intente descubrir otros nodos y falle. En producci贸n con m煤ltiples nodos, esta l铆nea debe eliminarse y configurarse discovery.seed_hosts.
Configuraci贸n de la memoria Heap
# Crear archivo de configuraci贸n JVM personalizado
sudo mkdir -p /etc/elasticsearch/jvm.options.d/
cat <<EOF | sudo tee /etc/elasticsearch/jvm.options.d/heap.options
-Xms4g
-Xmx4g
EOF
驴Por qu茅 configurarlo as铆? La JVM de Elasticsearch tiene un comportamiento complejo. Establecer -Xms y -Xmx al mismo valor evita que el recolector de basura tenga que renegociar el tama帽o del heap en tiempo de ejecuci贸n, mejorando la predictibilidad del rendimiento.
Inicio y verificaci贸n
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
# Verificar que est茅 corriendo y autenticarse (se genera contrase帽a por defecto)
sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
# Probar conexi贸n
curl -k -u elastic:<password> https://localhost:9200
Alerta de seguridad: La contrase帽a del usuario
elastic(superusuario) se genera aleatoriamente durante la primera instalaci贸n. Gu谩rdala en un gestor de contrase帽as. Para entornos productivos, crea usuarios de API con roles espec铆ficos (ej.logstash_writer,kibana_system).
Instalaci贸n y Configuraci贸n de Kibana
Kibana es la ventana a los datos. Su configuraci贸n principal es apuntar al Elasticsearch correcto.
Instalaci贸n
sudo apt-get install kibana
Configuraci贸n (/etc/kibana/kibana.yml)
# --- Servidor Kibana ---
# Escuchar en todas las interfaces (o en localhost si usas proxy inverso)
server.host: "0.0.0.0"
# Puerto por defecto
server.port: 5601
# --- Conexi贸n a Elasticsearch ---
elasticsearch.hosts: ["https://localhost:9200"]
# Usar HTTPS y autenticaci贸n
elasticsearch.username: "kibana_system"
elasticsearch.password: "<contrase帽a_generada_para_kibana>"
# --- SSL ---
# Deshabilitar verificaci贸n SSL si usas certificados autofirmados (SOLO PRUEBAS)
elasticsearch.ssl.verificationMode: none
# --- Localizaci贸n (opcional) ---
i18n.locale: "es-ES"
Nota sobre
kibana_system: Este usuario es creado autom谩ticamente por Elasticsearch al habilitar la seguridad. No es un usuario para login humano, sino para que Kibana se comunique con el backend. Su contrase帽a se puede resetear desde la consola de Elasticsearch.
Inicio
sudo systemctl enable kibana
sudo systemctl start kibana
# Acceder a http://<ip-servidor>:5601
Instalaci贸n y Configuraci贸n de Logstash
Logstash act煤a como el cerebro del pipeline. Aqu铆 es donde se transforman l铆neas de texto plano en documentos JSON estructurados.
Instalaci贸n
sudo apt-get install logstash
Pipeline de ejemplo: Parseo de logs de Nginx
Crear un archivo de configuraci贸n en /etc/logstash/conf.d/nginx-pipeline.conf.
input {
beats {
port => 5044
# Habilitar SSL (MUY RECOMENDADO)
ssl => true
ssl_certificate => "/etc/logstash/certs/logstash.crt"
ssl_key => "/etc/logstash/certs/logstash.key"
}
}
filter {
if [fields][service] == "nginx" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
# Extraer timestamp del log, no del momento de recepci贸n
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp"
}
# Geolocalizaci贸n simple
geoip {
source => "clientip"
target => "geoip"
database => "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-filter-geoip-7.2.10/vendor/GeoLite2-City.mmdb"
}
# Eliminar campos innecesarios para ahorrar espacio
mutate {
remove_field => ["message", "path", "host", "tags"]
}
}
}
output {
elasticsearch {
hosts => ["https://localhost:9200"]
user => "logstash_writer"
password => "<contrase帽a>"
index => "nginx-logs-%{+YYYY.MM.dd}"
ssl => true
cacert => "/etc/logstash/certs/ca.crt"
}
}
Explicaci贸n detallada del pipeline:
input { beats { ... } }:port => 5044: Puerto est谩ndar para el protocolo Beats.ssl: Obligatorio en producci贸n para evitar que logs viajen en texto plano. Los certificados pueden ser autofirmados, pero deben ser los mismos que conf铆en los clientes Filebeat.
filter { grok { ... } }:%{COMBINEDAPACHELOG}es un patr贸n predefinido de Logstash que parsea autom谩ticamente logs en formato Combined de Apache/Nginx. Extrae campos comoclientip,ident,auth,timestamp,verb,request,httpversion,response,bytes,referrer,agent.- El bloque
if [fields][service] == "nginx"permite aplicar filtros diferentes seg煤n el tipo de log (ej. un pipeline para syslog, otro para logs de aplicaci贸n Java).
output { elasticsearch { ... } }:index => "nginx-logs-%{+YYYY.MM.dd}": Crea un 铆ndice diario. Esto es crucial para la retenci贸n de datos (puedes eliminar 铆ndices de m谩s de 30 d铆as usando Curator o ILM).userypassword: Crear un usuario en Elasticsearch con el rollogstash_writerque tenga permisos de escritura en los 铆ndicesnginx-logs-*.
Creaci贸n de usuario para Logstash en Elasticsearch
# Desde el servidor Elasticsearch
sudo /usr/share/elasticsearch/bin/elasticsearch-users useradd logstash_writer -p <contrase帽a> -r logstash_writer
Nota sobre roles: En versiones 8.x, se recomienda usar el API de seguridad de Elasticsearch para crear roles personalizados en lugar de los roles predefinidos. El rol
logstash_writerpor defecto es suficiente para entornos simples, pero en producci贸n, cr茅alo con permisos m铆nimos (create_index,write,managesobre el patr贸n de 铆ndices).
Configuraci贸n del Cliente: Filebeat
Filebeat es el shipper. Su configuraci贸n es ligera y debe ser segura.
Instalaci贸n en el servidor de aplicaci贸n (ej. servidor Nginx)
sudo apt-get install filebeat
Configuraci贸n (/etc/filebeat/filebeat.yml)
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: filestream
enabled: true
id: nginx-access
paths:
- /var/log/nginx/access.log
fields:
service: nginx
environment: production
fields_under_root: true
# ============================== Outputs ======================================
output.logstash:
hosts: ["<ip-logstash>:5044"]
# Habilitar SSL
ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
ssl.certificate: "/etc/filebeat/certs/filebeat.crt"
ssl.key: "/etc/filebeat/certs/filebeat.key"
# ============================== Processors ===================================
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
Explicaci贸n de la configuraci贸n:
type: filestream: El nuevo input de Filebeat (reemplaza alog). Es m谩s eficiente y maneja mejor la rotaci贸n de logs (log rotation).fields: A帽ade metadatos personalizados. El camposervice: nginxes el que Logstash usar谩 en su condicionalif [fields][service].output.logstash: Env铆a los eventos directamente a Logstash, no a Elasticsearch. Esto permite el filtrado centralizado.processors: A帽aden informaci贸n contextual (IP del host, metadata de cloud o Docker) sin necesidad de que Logstash lo haga, reduciendo la carga en el servidor central.
Gesti贸n de certificados SSL para Filebeat
La comunicaci贸n entre Filebeat y Logstash debe ser cifrada. La forma m谩s sencilla es usar una Autoridad Certificadora (CA) interna.
# En el servidor Logstash (o en una m谩quina de gesti贸n)
# 1. Crear CA
openssl req -x509 -days 3650 -nodes -newkey rsa:2048 \
-keyout /etc/logstash/certs/ca.key \
-out /etc/logstash/certs/ca.crt \
-subj "/CN=ELK-CA"
# 2. Crear certificado para Logstash (servidor)
openssl req -nodes -newkey rsa:2048 \
-keyout /etc/logstash/certs/logstash.key \
-out /etc/logstash/certs/logstash.csr \
-subj "/CN=logstash.sysprovider.local"
openssl x509 -req -days 365 \
-in /etc/logstash/certs/logstash.csr \
-CA /etc/logstash/certs/ca.crt \
-CAkey /etc/logstash/certs/ca.key \
-CAcreateserial \
-out /etc/logstash/certs/logstash.crt
# 3. Copiar ca.crt, filebeat.crt y filebeat.key a cada servidor Filebeat
# (en /etc/filebeat/certs/)
驴Por qu茅 este proceso? No usar SSL en el pipeline Beats es una vulnerabilidad cr铆tica. Cualquier m谩quina en la misma red podr铆a enviar logs falsos a tu Logstash, inyectando datos maliciosos o simplemente saturando el sistema. La autenticaci贸n mutua (mTLS) no es obligatoria pero es altamente recomendable.
Visualizaci贸n en Kibana: Creaci贸n de un Dashboard
Una vez que los datos fluyen, el siguiente paso es construir un dashboard.
Paso 1: Crear un Index Pattern
- Ve a Stack Management > Kibana > Data Views.
- Haz clic en Create data view.
- Nombre:
Nginx Logs. - Index pattern:
nginx-logs-*(debe coincidir con el patr贸n definido en Logstash). - Timestamp field:
@timestamp. - Guarda.
Paso 2: Crear una Visualizaci贸n (Ej: C贸digos de respuesta HTTP)
- Ve a Analytics > Visualize Library.
- Create visualization.
- Selecciona Pie (gr谩fico de pastel).
- Selecciona la data view
Nginx Logs. - Buckets: A帽ade un bucket de tipo Split slices.
- Aggregation:
Terms - Field:
response.keyword(el camporesponsemapeado como keyword). - Size: 10.
- Aggregation:
- Haz clic en Save y n贸mbrala
HTTP Status Codes.
Paso 3: Montar el Dashboard
- Analytics > Dashboard > Create dashboard.
- Add la visualizaci贸n creada.
- A帽ade otras visualizaciones 煤tiles:
- Line chart:
N煤mero de requests por minuto(usando@timestampycount). - Tag cloud:
Top URLs solicitadas(camporequest.keyword). - Data table: `Top 5 IPs con m谩s
- Line chart:
