Visión general del ecosistema ELK
El acrónimo ELK se refiere a tres proyectos de código abierto que proporcionan una pila completa para la gestión de registros. Elasticsearch es un motor de búsqueda y análisis distribuido. Logstash sirve como procesador de tubería (pipeline) para ingerir, transformar y enviar datos. Kibana ofrece una interfaz de usuario para la exploración y visualización. Filebeat, un miembro del ecosistema Beats, es un recolector ligero de datos instalado en los servidores de origen que reenvía los registros a Logstash o directamente a Elasticserach.
La necesidad de un sistema centralizado de análisis de registros surge de la dificultad de gestionar y correlacionar datos de logs distribuidos en múltiples servidores y aplicaciones. Un stack como ELK permite una recopilación, procesmaiento, almacenamiento y consulta eficientes de la información de registro, lo cual es crucial para el monitoreo operativo, la detección de problemas y el análisis de seguridad.
Los principios de funcionamiento son: 1) Los agentes (como Filebeat) recolectan datos de los archivos de registro. 2) Estos datos se envían a Logstash, donde pueden ser filtrados y transformados. 3) Los datos procesados se almacenan e indexan en Elasticsearch. 4) Kibana consulta Elasticsearch para presentar los datos en paneles y visualizaciones interactivas.
Preparación del entorno y componentes
Para esta implementación, se requiere un entorno con los siguientes nodos y roles asignados:
| Rol del nodo | Dirección IP | Software a instalar | Recursos recomendados |
|---|---|---|---|
| Nodo Maestro ES | 192.168.1.10 | Elasticsearch, Kibana | 2 CPU, 4 GB RAM |
| Nodo de Datos ES | 192.168.1.11 | Elasticsearch | 2 CPU, 4 GB RAM |
| Nodo de Procesamiento | 192.168.1.12 | Logstash, Nginx (ejemplo de servicio) | 2 CPU, 4 GB RAM |
| Nodo de Aplicación | 192.168.1.13 | Filebeat | 1 CPU, 2 GB RAM |
Es fundamental desactivar los firewalls y SELinux en todos los nodos durante la configuración inicial, o configurar las reglas apropiadas para los puertos necesarios (9200, 9300, 5601, 5044, etc.).
# Desactivar firewall y SELinux (ejemplo para CentOS/RHEL)
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
Despliegue del clúster de Elasticsearch
La instalación se realiza en los nodos dedicados (192.168.1.10 y 192.168.1.11). Primero, se aseguran los prerrequisitos.
# En ambos nodos: configurar nombres de host y archivo /etc/hosts
sudo hostnamectl set-hostname es-node1 # en 192.168.1.10
sudo hostnamectl set-hostname es-node2 # en 192.168.1.11
# Añadir al archivo /etc/hosts
192.168.1.10 es-node1
192.168.1.11 es-node2
# Verificar e instalar Java OpenJDK 8 si no está presente
java -version || sudo yum install -y java-1.8.0-openjdk
Descargar e instalar el paquete RPM de Elasticsearch. La configuración clave reside en el archivo /etc/elasticsearch/elasticsearch.yml.
# Ejemplo de configuración para es-node1 (192.168.1.10)
cluster.name: mi-cluster-de-logs
node.name: es-node1
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["es-node1", "es-node2"]
cluster.initial_master_nodes: ["es-node1", "es-node2"]
Después de configurar ambos nodos, iniciar el servicio y verificar la salud del clúster.
# Iniciar y habilitar Elasticsearch
sudo systemctl daemon-reload
sudo systemctl enable --now elasticsearch.service
# Verificar puertos y estado del clúster
curl -X GET "localhost:9200/_cluster/health?pretty"
curl -X GET "localhost:9200/_cat/nodes?v"
Para una mejor visualización, se puede instalar el plugin Elasticsearch-head. Esto requiere Node.js. La instalación típica implica compilar Node.js desde la fuente o usar un repositorio, luego instalar Elasticsearch-head con npm.
# Después de instalar Node.js, instalar y ejecutar Elasticsearch-head
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start &
# Habilitar CORS en Elasticsearch para que head funcione
# Añadir a elasticsearch.yml:
http.cors.enabled: true
http.cors.allow-origin: "*" # O especificar el origen en producción
Configuración de Logstash para el procesamiento de logs
En el nodo designado (192.168.1.12), instalar Logstash y Java. Logstash funciona bajo una configuración definida por el usuario, normalmente en archivos .conf dentro de /etc/logstash/conf.d/.
# Ejemplo de configuración mínima /etc/logstash/conf.d/base.conf
input {
# Escuchar conexiones entrantes de Filebeat
beats {
port => 5044
# Para ambiente seguro, configurar SSL
# ssl => true
# ssl_certificate => "/path/to/server.crt"
# ssl_key => "/path/to/server.key"
}
# También puede leer logs locales directamente
# file { path => "/var/log/nginx/access.log" type => "nginx-access" }
}
filter {
# Ejemplo de un filtro para parsear logs de Nginx en formato combinado
if [fields][service_type] == "nginx" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
mutate {
add_field => { "geoip_lookup" => "%{clientip}" }
}
geoip {
source => "geoip_lookup"
}
mutate {
remove_field => ["geoip_lookup"]
}
}
}
output {
# Enviar todos los datos procesados a Elasticsearch
elasticsearch {
hosts => ["http://es-node1:9200", "http://es-node2:9200"]
index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
# user => "elastic"
# password => "changeme"
}
# Opcional: enviar datos también a la salida estándar para depuración
# stdout { codec => rubydebug }
}
Iniciar Logstash y verificar que el puerto 5044 está a la escucha.
sudo systemctl enable --now logstash.service
# Verificar el estado
sudo -u logstash /usr/share/logstash/bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/
# Verificar puertos abiertos
ss -tlnp | grep 5044
Instalación y configuración de Kibana
Kibana se instala típicamente en el mismo nodo que el nodo maestro de Elasticsearch o en uno separado. Su configuración principal está en /etc/kibana/kibana.yml.
# Configuración clave en /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0" # Cambiar a "localhost" si se usa un proxy inverso
server.name: "kibana-servidor"
elasticsearch.hosts: ["http://es-node1:9200", "http://es-node2:9200"]
elasticsearch.username: "kibana_system" # Usuario built-in recomendado
elasticsearch.password: "tu_password_para_kibana_system"
# Configurar log
logging.dest: /var/log/kibana/kibana.log
Iniciar el servicio y acceder a la interfaz web.
sudo mkdir -p /var/log/kibana
sudo chown kibana:kibana /var/log/kibana
sudo systemctl enable --now kibana.service
# Acceder a http://192.168.1.10:5601
Dentro de Kibana, se deben crear Index Patterns para los índices generados por Logstash. Por ejemplo, si Logstash crea índices con el patrón app-logs-*, se define un Index Pattern con ese mismo patrón para poder visualizar los datos en la sección Discover.
Integración con Filebeat para la recolección de logs
Filebeat se despliega en cada servidor de aplicación (ej. 192.168.1.13) donde existen logs que se desean centralizar.
# Instalar Filebeat (ejemplo para distribuciones basadas en Debian)
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.0-amd64.deb
sudo dpkg -i filebeat-7.15.0-amd64.deb
La configuración de Filebeat (/etc/filebeat/filebeat.yml) define qué logs recolectar y hacia dónde enviarlos.
# Configuración de /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/*.log
- /var/log/auth.log
# Añadir campos personalizados para etiquetar los logs
fields:
app_layer: web_server
environment: production
log_source: nginx
fields_under_root: true
# Configuración de módulos (alternativa más simple para aplicaciones soportadas)
# filebeat.modules:
# - module: nginx
# access:
# enabled: true
# var.paths: ["/var/log/nginx/access.log*"]
# Enviar a Logstash en lugar de a Elasticsearch directamente
output.logstash:
hosts: ["192.168.1.12:5044"]
# Configurar SSL si Logstash lo requiere
# ssl.certificate_authorities: ["/etc/pki/tls/certs/ca.crt"]
# Deshabilitar la salida directa a Elasticsearch si se usa Logstash
# output.elasticsearch:
# hosts: ["http://es-node1:9200"]
# Procesador para añadir metadatos
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
Iniciar Filebeat y habilitar su inicio con el sistema.
sudo systemctl enable --now filebeat.service
# Verificar el estado y los logs del servicio
sudo systemctl status filebeat.service
sudo journalctl -u filebeat.service -f
El flujo completo queda: Archivo de Log (Nginx, Auth, etc.) → Filebeat → Logstash (Procesamiento y Enriquecimiento) → Elasticsearch (Almacenamiento e Indexación) → Kibana (Visualización y Análisis). Con este stack operativo, los equipos de operaciones y desarrollo pueden crear dashboards, configurar alertas y realizar consultas complejas sobre los datos de log centralizados.