22 julio, 2025

Proyecto SIEM Open Source: Wazuh - Parte IID - Graylog

Continuando con mi proyecto de SIEM Open Source (Wazuh) voy a detallar los pasos de instalación básicos del stack. De la nada a empezar a tener identificación de eventos. Toca el turno de Graylog con su integración


 

Resumen práctico de la instalación del Wazuh

Disclaimer: Esto describe la instalación que realice por mano propia con las versiones descriptas y los recursos que me disponibilizaron, puede existir mejoras o variaciones para otros casos.

Parto de que los servidores ya poseen el sistema operativo instalador y actualizado

 

Instalando GrayLog

IP asignada de Ejemplo 192.168.20.27
 

Documentación:

 

Consideraciones:

La utilización de Graylog es para aprovechar la ventaja de tener conectores mas versátiles para integrar otros componentes, enriquecer mediante APIs los logs y poder depurar mejor mediante interfaz gráfica los eventos recibidos antes de enviarlo al indexer. Por ese motivo NO se va instalar el OpenSearch si no que se va utilizar el de Wazuh, lo usamos de Forwarder (reenviador) de eventos para hacer mas eficiente la ingesta. Al utilizarlo de forwarder el Graylog no tenemos limitación de software sobre la cantidad de EPS a procesar.


Preparación

Actualizo el server

sudo apt update && sudo apt upgrade

Configuro el TimeZone

sudo timedatectl set-timezone your_time_zone

Sumo más keyservers

wget -qO-'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xf5679a222c647c87527c2f8cb00a0bd1e2c63c11' | sudo apt-key add -

 

Instalo MongoDB

Importo la key

curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor

Creo un list file para MongoDB

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

Vuelva a cargar la base de datos del paquete local e instalo la última versión estable de MongoDB.

sudo apt-get update
sudo apt-get install -y mongodb-org

Habilito MongoDB para que inicie con el sistema operativo y verifique que se esté ejecutando

sudo systemctl daemon-reload
sudo systemctl enable mongod.service
sudo systemctl restart mongod.service
sudo systemctl --type=service --state=active | grep mongod

Para evitar que se actualice automáticamente el MongoDB a una versión más nueva cuando se instalen las actualizaciones.

sudo apt-mark hold mongodb-org        

Para actualizarlo, es necesario quitar el hold

sudo apt-mark unhold mongodb-org

  

Instalar GrayLog Community

wget https://packages.graylog2.org/repo/packages/graylog-6.0-repository_latest.deb
sudo dpkg -i graylog-6.0-repository_latest.deb
sudo apt-get update 
sudo apt-get install graylog-server

 

Marcar el paquete en hold para que no actualicen accidentalmente el servidor Graylog.

sudo apt-mark hold graylog-server

    

Generar password de Admin en  GrayLog (password_secret y root_password_sha2) 

  • password_secret
pwgen -N 1 -s 96

Va dar un resultado algo así:

Dja7K1mO6i7bMnKPnQtumXrs8uISNnIFHIriZPwTuVuijf7DnFbltp2Xgh0rPWxaidUoKhOipL5PSTRDLPO3wQLEkTGoVTK9
 

  •  root_password_sha2
echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1

Resultado va dar algo así

1be352e2ec932aa0de5e617dfd0b991cc1f02b6899f73d7ad25eb788dbfd62be

Tomar nota de la clave y su resultado


Crear un usuario de servicio en Wazuh Indexer  con permisos de Admin para Graylog

Crear el usuario de servicio graylog user and darle el backend role of admin -> in Wazuh se crea
 

  1. Ingresar a Wazuh Dashboard con el usuario Admin (para que aparezcan las opciones ABM de usuarios)     
  2. Hambueguesa  -> OpenSearch Plugin -> Secuity -> Internal User
  3. Hambueguesa  -> Indexer Management -> Secuity -> Internal User
  4. Username = nombre del usuario de servicio que va usar graylog para acceder a Wazu. Ej graylog
  5. Password = clave del usuario de servicio
  6. Backend role = admin
  7. Save Changes
No usar caracteres especiales ya que Graylog no lo lee en el archivo de configuracion


 

 

Editar /etc/graylog/server/server.conf  

  • Configurar la conexión con Indexer Wazuh 
    • En la línea que dice "elasticsearch_hosts" colocar:

    • elasticsearch_hosts = https://user:pass@wazuh-indexerhostname:9200

    • Donde 

      • user = el usuario de servicio (creado en el paso anterior) de Wazuh Indexer

      • pass = clave del usuario de servicio  

      • wazuh-indexerhostname = dirección del servidor Wazuh Indexer (puede ser IP o DNS, en caso de DNS debe poder resolverlo)

  • Configurar la clave de Admin
    • Buscar la líneas y completar

      • password_secret = el resultado del paso password_secret

      • root_password_sha2 = el resultado root_password_sha2

    

Copio los certificados del Wazuh Indexer

Es para que pueda establecer una comunicación segura entre el Wazuh Indexer y el Graylog

sudo mkdir /etc/graylog/server/certs

Copio el cacerts e importo el rootCA.crt dentro del Java Keystore

cp -a /usr/share/graylog-server/jvm/lib/security/cacerts /etc/graylog/server/certs/cacerts

Copio en  /etc/graylog/server/certs/ el certificado de Wauzh Indexer (/etc/wazuh-indexer/certs/root-ca.pem)
    
Importo en el keystore los certificados con keytool

sudo /usr/share/graylog-server/jvm/bin/keytool -importcert -keystore /etc/graylog/server/certs/cacerts -storepass changeit -alias root_ca -file /etc/graylog/server/certs/root-ca.pem  

Cuando pregunte si "Confío en el certificado" responder SI

 

Agregar el almacenamiento de claves cacerts que copiamos

Editar /etc/default/graylog-server

Buscar la línea GRAYLOG_SERVER_JAVA_OPTS

Comentar la que esta y agregar

GRAYLOG_SERVER_JAVA_OPTS="$GRAYLOG_SERVER_JAVA_OPTS 
-Dlog4j2.formatMsgNoLookups=true 
-Djavax.net.ssl.trustStore=/etc/graylog/server/certs/cacerts 
-Djavax.net.ssl.trustStorePassword=changeit"

En caso que debamos actualizar el root-ca.pem (por una resintalación del Wazuh Indexer) debemos borrar el archivo  /etc/graylog/server/certs/cacerts y vover a importar en el keystore

 

Configuro el servicio de Graylog

sudo systemctl daemon-reload
sudo systemctl enable graylog-server.service
sudo systemctl start graylog-server.service

Verifico si esta activo el servicio

sudo systemctl --type=service --state=active | grep graylog

Verifico el inicio de Graylog

tail -f /var/log/graylog-server/server.log


Reglas de Firewall

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 514    #Syslog
sudo ufw allow 12201 #GELF
sudo ufw allow proto tcp from 192.168.20.151 to any port 9200  #Para Wazuh Indexer
sudo ufw allow proto tcp from 192.168.20.151 to any port 9300  #Para Wazuh Indexer
sudo ufw allow 9000/tcp #Acceso Web
sudo ufw allow proto tcp from 192.168.20.149 to any port 5555  #Para Wazuh Server (Fluent Bit)
sudo ufw enable
sudo ufw status verbose

 

Primer ingreso a Garylog

Ya se encuentra listo para ingresar a Graylog mediante su configuración con la URL:

http://graylog.midominio.com:9000 

 

Por default instala en puerto 9000 sin https
Hacemos un primer ingreso para verificar que este OK.

 

Portal de Graylog bajo HTTPS

La opción má spráctica para que la interfaz web (GUI) tenga https es usando un NGINX, evito lidiar con el keystore que tiene los certificados para hablar con el Indexer.

Lleva una configuración estándar, para redireccionar el puerto 443 al 9000

Crear archivo de configuración con la siguiente configuración

server {
listen 80;
server_name graylog.midominio.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
listen [::]:443 default_server;

server_name graylog.midominio.com;

ssl_certificate /etc/ssl/certificado_ssl.crt;
ssl_certificate_key /etc/ssl/private/certificado_ssl.key;

location / {

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass http://localhost:9000;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://graylog.midominio.com;
include proxy_params;

}
}

 

Recepción de mensajes en Graylog desde Wazuh server

Configuro el Input

Dentro de Graylog

System -> Inputs -> desplegable Select "Raw/Plaintext TCP" -> botón Launch New Input 

Valores

  • Title = Wazuh Server 
  • Resto de los valores x default

 


🔧Para resolver el siguiente problema en Graylog cuando se consulta los eventos en el OpenSearch del Wazuh Indexer:
 

    While retrieving data for this widget, the following error(s) occurred:
    Elasticsearch exception [type=illegal_argument_exception, reason=key [types] is not supported in the metadata section].

 

  1. En Wazuh Indexer editar el archivo /etc/wazuh-indexer/opensearch.yml

  2. Cambiar el valor a false de la siguiente línea
    compatibility.override_main_response_version: false

  3. Reiniciar el servidor Wazuh Indexer y Graylog


  • Configurar JSON Extractor en Graylog

En Graylog Ir a 

System -> Inputs -> (en Local Inputs) Wazuh Server- > Show received messages  


Hacer click en un mensaje cualquiera para ampliar su contenido (no en el título sino en los datos en sí), se abrirá un menú en el cual seleccionamos Create extractor


Seleccionamos tipo de extractor: JSON -> botón Submit

Valores a colocar:

  • Key/Value Separator  :
  • Extractor Title FLUENTD - JSON EXTRACTOR
  • Resto de valores por default



Botón Try para ver como queda, algo así debe mostrar

Botón Create Extractor para crear el extractor
 

Con esto evitamos que todos los datos se escriben en el campo de mensaje. El motor de ingesta debe poder analizar claves y sus valores, o tendremos dificultades para detectar, visualizar y responder a eventos de seguridad.

Si no se tiene eventos suficientes, es necesario instalar algún agente para que reporte los primerios eventos y poder hacer el extractor

 

  • Configurar Indice en Graylog

Ir al menú System -> Indices
Botón "Create index set"

Valores a colocar:

    Title: Wazuh Alerts
    Description: Wazuh Alerts
    Index prefix: wazuh-alerts
    Index shards: 4
    
    Rotation and Retention
        Date Tiering
        Max. days in storage = 90
        Min. days in storage = 30

En caso de querer limitar por espacio (ej en un entorno tipo AWS que nos cobran por cada byte consumido) debemos utilizar lo siguiente:

    Rotation and Retention
        Legacy
        Select rotation strategy = Index Size
        Max size per index = 10737418240
        Max number of indices = 10

 

 

 
Opción por tiempo

 


Opción por espacio   


Explicación de algunos valores claves

  • Index Prefix — Nombre del índice que se utiliza para almacenar los datos en nuestro Wazuh-Indexer

  • Rotation Strategy — Con qué frecuencia rotará el índice. Por ejemplo, nuestro primer índice creado se llamará wazuh-alerts_0. Una vez que ese índice alcance un tamaño de 10 GB, Graylog rotará al siguiente índice, wazuh-alerts-socfortress_1.

  • Retention Strategy — Cuánto tiempo permanecerá un índice en nuestro Wazuh Indexer. Por ejemplo, tengo una estrategia de rotación de 10 GB y una estrategia de retención de 10. Esto significa que mantendré un máximo de 100 GB (10 x 10) de datos totales de Alertas Wazuh. Una vez que se alcancen los 10 índices, Graylog eliminará el primer índice, wazuh-alerts_0, para dejar espacio para wazuh-alerts_11. Tener en cuenta que estos datos se eliminan permanentemente.


botón "Create index set" para crear el índice

  • Creación del Stream en Graylog

Seleccionar en la parte superior del menú Streams -> botón Create Stream


Valores a colocar:

  •     Title = WAZUH ALERTS
  •     Description = WAZUH ALERTS
  •     Index Set = Wazuh Alerts
  •     Remove matcehs from Default Stream = Yes

botón Create Stream


Con esto logramos que se se envíe la data de los mensajes al índice de Wazuh (creado anteriormente).

En el menú superior System -> Inputs -> (en Local Inputs) Wazuh Server -> More actions -> Add static field
    Field name = log_type
    Field value = wazuh

botón Add field


Con esto agregará el par key-value de log_type:wazuh a cada registro ingerido por el input "Wazuh Server". Ahora podemos usar este nombre de campo como regla para que el stream dirija todas las alertas de Wazuh al índice correcto.

Seleccionar  Streams -> Sobre la línea WAZUH ALERTS -> More -> Manage Rules
 -> (boton derecha)  Add stream rules

Valores

  •  Field = log_type
  •  Value = wazuh
  •  Description = Route Wazuh Logs to Wazuh Stream


 


 

botón Create rule para crear la regla

botón "I'm done" para guardar los cambios

 

 

Iniciar el stream, en la línea de WAZUH ALERTS a la derecha presionar sobre el botón Paused





Bien, con esto queda completo el hito "Instalación de Servidores"


 

 

Arquitectura de lo instalado

Las IP son meramente ilustraivas con el fin practico de identificación. Adecuar según las necesidades


En los siguientes post esta arquitectura se irá ampliando a fin de integrar e enriquercer los eventos.


Referencias

  • https://go2docs.graylog.org/current/downloading_and_installing_graylog/ubuntu_installation.html
  • https://socfortress.medium.com/part-2-graylog-install-log-ingestion-da149c4844dc 
  • https://docs.graylog.org/docs/extractors
  • https://www.youtube.com/@taylorwalton_socfortress/playlists
  • https://wazuh.com/community/join-us-on-slack/
  • https://groups.google.com/g/wazuh

 

0 comments:

Publicar un comentario