Sistema de análisis de logs con ELK Stack y Filebeat

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.

Etiquetas: Elasticsearch Logstash Kibana Filebeat ELK Stack

Publicado el 8-4 07:30