Reenviar registros de Apache a OpenSearch a través de Logstash

Introducción

El manejo eficaz de los registros del servidor web es crucial para mantener el rendimiento de su sitio web, resolver problemas y obtener insumos sobre el comportamiento de los usuarios. Apache es uno de los servidores web más populares. Genera registros de acceso y errores que contienen información valiosa. Para manejar y analizar estos registros de manera eficiente, puede utilizar Logstash para procesar y enviarlos a Managed OpenSearch de DigitalOcean para su indexación y visualización.

En este tutorial, le guiaremos a través del proceso de instalación de Logstash en una Droplet, configurándolo para recolectar sus registros de Apache y enviándolos a Managed OpenSearch para su análisis.

Prerrequisitos

  1. Droplet/s con el Servidor Web Apache instalado.
  2. Cluster Managed OpenSearch

Paso 1 – Instalación de Logstash

Logstash se puede instalar utilizando los archivos binarios o a través de los repositorios de paquetes. Para un manejo y actualizaciones más fáciles, generalmente se recomienda utilizar repositorios de paquetes.

En esta sección, le guiaremos a través de la instalación de Logstash en su Droplet utilizando tanto el gestor de paquetes APT como YUM.

Vamos a identificar el SO:

cat /etc/os-release

Para Sistemas Basados en APT (Ubuntu/Debian)

Descargue e instale la Clave de Firma Pública:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

Puede que tenga que instalar el paquete apt-transport-https en Debian antes de proceder:

sudo apt-get install apt-transport-https

Guarde la definición del repositorio en /etc/apt/sources.list.d/elastic-8.x.list:

echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list

Utilice el método echo descrito anteriormente para agregar el repositorio de Logstash. No use add-apt-repository ya que agregará una entrada deb-src, pero no proporcionamos un paquete de origen. Si ha agregado la entrada deb-src, verá un error similar al siguiente:

Unable to find expected entry 'main/source/Sources' in Release file (Wrong sources.list entry or malformed file)

Sólo elimine la entrada deb-src del archivo /etc/apt/sources.list y la instalación debería funcionar como esperado.

Ejecute sudo apt-get update y el repositorio estará listo para usar. Puede instalarlo con:

sudo apt-get update && sudo apt-get install logstash

Para sistemas basados en YUM (CentOS/RHEL)

Descarga e instala la clave de firma pública:

sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Agrega lo siguiente en tu archivo /etc/yum.repos.d/logstash.repo. Puedes usar ‘tee’ para actualizar y crear el archivo.

sudo tee /etc/yum.repos.d/logstash.repo > /dev/null <<EOF
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

Tu repositorio está listo para usar. Puedes instalarlo con:

sudo yum install logstash

Para más información, consulta la guía Instalación de Logstash.

Paso 2 – Configurando Logstash para enviar registros a OpenSearch

Una pipeline de Logstash consta de tres etapas principales: entrada, filtro y salida. Las pipelines de Logstash hacen uso de complementos. Puedes utilizar complementos de la comunidad o crear los tuyos propios.

  • Entrada: Esta etapa recoge datos de varias fuentes. Logstash admite varios complementos de entrada para manejar fuentes de datos como archivos de registro, bases de datos, colas de mensajes y servicios en la nube.

  • Filtro: Esta etapa procesa y transforma los datos recopilados en la etapa de entrada. Los filtros pueden modificar, enriquecer y estructurar los datos para que sean más útiles y fáciles de analizar.

  • Salida: Esta etapa envía los datos procesados a un destino. Los destinos pueden incluir bases de datos, archivos y almacenes de datos como OpenSearch.

Paso 3 – Instalación del complemento de salida de Open Search

El complemento de salida de OpenSearch se puede instalar ejecutando el siguiente comando:

/usr/share/logstash/bin/logstash-plugin install logstash-output-opensearch

Se puede encontrar más información en este repositorio logstash-output-opensearch-plugin.

Ahora vamos a crear una pipeline:

Cree un nuevo archivo en la ruta /etc/logstash/conf.d/ llamado apache_pipeline.conf, y copie el siguiente contenido.

input {
  file {
    path => "/var/log/apache2/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    tags => "apache_access"
  }

  file {
    path => "/var/log/apache2/error.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    tags => "apache_error"
  }
}

filter {
  if "apache_access" in [tags] {
    grok {
        match => { "message" => "%{HTTPD_COMBINEDLOG}" }
    }
    mutate {
        remove_field => [ "message","[log][file][path]","[event][original]" ]
      }
   } else {
   grok {
        match => { "message" => "%{HTTPD24_ERRORLOG}" }
    }
   }
}

output {
  if "apache_access" in [tags] {
  opensearch {
    hosts       => "https://<OpenSearch-Hostname>:25060"
    user        => "doadmin"
    password    => "<your_password>"
    index       => "apache_access"
    ssl_certificate_verification => true
  }

  } else {
  opensearch {
    hosts       => "https://<OpenSearch-Hostname>:25060"
    user        => "doadmin"
    password    => "<your_password>"
    index       => "apache_error"
    ssl_certificate_verification => true
  }
  }
}

Reemplace el <OpenSearch_Host> con el nombre de host de su servidor OpenSearch y <OpenSearch_Password> con su contraseña de OpenSearch.

Veamos la configuración anterior en detalle.

  • ENTRADA: Esto se utiliza para configurar una fuente para los eventos. Aquí se utiliza el complemento de entrada ‘file’.

  • path => “/var/log/apache2/access.log” : Especifica la ruta al archivo de acceso de Apache que Logstash leerá

    Asegúrese de que el servicio Logstash tenga acceso a la ruta de entrada.

  • start_position => “beginning”: Define dónde Logstash debe comenzar a leer el archivo de registro. “beginning” indica que Logstash debe comenzar a procesar el archivo desde el principio, en lugar de desde el final

  • sincedb_path => “/dev/null”: Especifica la ruta a un archivo sincedb. Los archivos sincedb son utilizados por Logstash para mantener la posición actual en los archivos de registro, lo que le permite reanudar donde se interrumpió en caso de reinicios o fallas.

  • tags => “apache_access”: Asigna una etiqueta a eventos leídos desde esta entrada. Las etiquetas son útiles para identificar y filtrar eventos dentro de Logstash, y generalmente se utilizan en las etapas de salida o filtrado de la configuración. Aquí estamos utilizando etiquetas para lo último.

  • FILTRAR: se utiliza para procesar los eventos.

    Comenzando con condicionales:

    (if "apache_access" in [etiquetas]):
    

    Esto chequea si la etiqueta apache_access existe en el campo [etiquetas] de los eventos de registro entrantes. Usamos esta condición para aplicar el filtro GROK apropiado para los registros de acceso y errores de Apache.

  • Filtro Grok (para registros de acceso de Apache):

    grok {
        match => { "message" => "%{HTTPD_COMBINEDLOG}" }
    }
    

    El filtro grok %{HTTPD_COMBINEDLOG} es un patrón predefinido en Logstash utilizado para parsear el formato de registro de acceso combinado de Apache. Esto extrae campos como la dirección IP, fecha y hora, método HTTP, URI, código de estado, etc., del campo mensaje de eventos entrantes.

  • Eliminar campos con Filtro Mutate Remove (opcional): Después de que se analizan los registros de Apache, utilizamos mutate-remove para eliminar ciertos campos.
    mutate {
        remove_field => [ "message","[log][file][path]","[event][original]" ]
    }
    
  • Condición else: Se ejecuta el bloque else si no está presente la etiqueta apache_access en [tags]. Este bloque else contiene otro filtro GROK para los registros de error de Apache.

    grok {
        match => { "message" => "%{HTTPD24_ERRORLOG}" }
    }
    

    Este filtro GROK %{HTTPD24_ERRORLOG} analiza mensajes que concuerdan con el formato de los registros de error de Apache. Extrae campos relevantes a los registros de error, como fecha y hora, nivel de registro, mensaje de error, etc.

    Los patrones GROK pueden encontrarse en: https://github.com/logstash-plugins/logstash-patterns-core/tree/main/patterns.

  • OUTPUT: El plugin de salida envía eventos a una destino particular.

    El bloque de salida comienza con una condición if. Estamos utilizando condiciones if aquí

    si "apache_access" en [tags] {}
    

    Esta condición if se utiliza para enrutar los registros a OpenSearch en dos índices separados, apache_error y apache_access.

    Vamos a explorar el plugin de salida de OpenSearch:

    hosts            => "https://XXX:25060"  Su nombre de host de Open search
    user             => "doadmin"            Su nombre de usuario de Open search
    password         => "XXXXX"              Contraseña de OpenSearch
    index            => "apache_error"       Nombre del índice en OpenSearch
    ssl_certificate_verification => true     Habilita la verificación del certificado SSL
    

Paso 4 – Iniciar Logstash

Una vez que se configure la Pipeline, inicie el servicio Logstash:

systemctl enable logstash.service
systemctl start logstash.service
systemctl status logstash.service

Paso 5 – Solución de problemas

Comprobar Conectividad

Puede verificar que Logstash pueda conectar a OpenSearch probando la conectividad:

curl -u your_username:your_password -X GET "https://your-opensearch-server:25060/_cat/indices?v"

Reemplace <su-servidor-opensearch> con el nombre de host de su servidor OpenSearch y <su_usuario>, <su_contraseña> con sus credenciales de OpenSearch.

Ingestión de Datos

Asegúrese de que los datos se indexen correctamente en OpenSearch:

curl -u your_username:your_password -X GET "http://your-opensearch-server:25060/<your-index-name>/_search?pretty"

Reemplace <su-servidor-opensearch> con el nombre de host de su servidor OpenSearch y <su_usuario>, <su_contraseña> con sus credenciales de OpenSearch. Del mismo modo, <su_nombre-de-índice> con el nombre del índice.

Firewall y Configuración de Red

Asegúrese de que las reglas del firewall y la configuración de red permitan el tráfico entre Logstash y OpenSearch en el puerto 25060.

Logs

Los registros de Logstash se pueden encontrar en /var/log/logstash/logstash-plain.log

Para obtener detalles, consulte Solución de problemas.

Conclusión

En este guía, hemos pasado por el proceso de configurar Logstash para recolectar y reenviar registros de Apache a OpenSearch. Aquí hay un breve resumen de lo que hemos cubierto:

Instalación de Logstash: cubrimos cómo utilizar los gestores de paquetes APT o YUM, dependiendo de su distribución de Linux, para instalar Logstash en su Droplet.

Configuración de Logstash: creamos y ajustamos el archivo de configuración de Logstash para asegurarnos de que los registros de Apache se analizan correctamente y se envían a OpenSearch.

Verificación en OpenSearch: configuramos un patrón de índice en OpenSearch Dashboards para confirmar que sus registros se indexan correctamente y son visibles para análisis.

Con estos pasos completos, debería tener ahora una configuración funcional donde Logstash recoge registros de Apache y los envía a OpenSearch.

Source:
https://www.digitalocean.com/community/tutorials/forward-apache-logs-to-opensearch-via-logstash