15 julio, 2025

Proyecto SIEM Open Source: Wazuh - Parte IIC: Dashboard

 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. Seguimos con Wazuh Dashboard


 

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

Instalado Wazuh Dashboard

IP asignada de Ejemplo: 192.168.20.148

 

Consideraciones

La primera vez que empiezo a desplegar el stack lo hice con la versión 4.7, la cual al final de la instalación me percato que tiene un bug que tiene hardcodeado el nombre del Indice donde va buscar la información trayendo muchos dolores de cabeza. Eso hizo que optara por la versión mas nueva en ese momento que es la 4.8.2 que ya lo tiene resuelto. Al ser modular el stack, preferí avanzar sobre un docker, ya que no hay operaciones de disco intensas (la base esta en el Indexer) y puedo sumar un dashboard en grafana ubicado en el mismo server concentando todo para visualización. 
La interfaz cambio respecto a ubicaciones de algunos elementos respecto a la 4.7, como que los eventos de seguridad están en Threat Hunting

Wazuh no dispnibiliza en forma directa el dashboard únicamente para docker, pero si su imagen, por lo que toco armar el docker-compose.yml basándome el en su instalación de single node

 

Instalo Docker

curl -sSL https://get.docker.com/ | sh

systemctl start docker

sudo apt install docker-compose

docker pull wazuh/wazuh-dashboard:4.8.2

Me traigo el archivo de https://github.com/wazuh/wazuh-docker/blob/v4.8.2/single-node/docker-compose.yml


Defino la carpeta del contenedor:

mkdir /srv/wazuh-dashboard

Genero las carpetas de configuración del contenedor:
mkdir /srv/wazuh-dashboard/config 
mkdir /srv/wazuh-dashboard/config/wazuh_dashboard  🠆 config del dashboard 
mkdir /srv/wazuh-dashboard/config/wazuh_indexer_ssl_certs  🠆 certificados para hablar con el indexer
 

Cargar certificados

Los mismos ya los tenemos creados previamente cuando instalamos el Indexer.
Se debe extraer del archivo wazuh-install-files.tar  (generado en este post cuando se instaló):
  • dashboard.pem
  • dashboard-key.pem
  • root-ca.pem
Copiar los archivos en /srv/wazuh-dashboard/config/wazuh_indexer_ssl_certs/
 

Copiar en 
/srv/wazuh-dashboard/config/wazuh_dashboard 
los archivos de
https://github.com/wazuh/wazuh-docker/tree/v4.8.2/single-node/config/wazuh_dashboard
 

Editar wazuh.yml

nano /srv/wazuh-dashboard/config/wazuh_dashboard/wazuh.yml 

Modificar la siguiente línea (color fucsia) colocando la IP del servidor Manager y user/pass

url: "https://192.168.20.149"

port: 55000
username: wazuh-wui
password: "<Clave_Generada>"
Por si no te acordas que clave se le generó al wazuh-wui, se puede consultar:
tar -axf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt -O | grep -P "\'wazuh\'" -A 1

Editar opensearch_dashboards.yml

nano /srv/wazuh-dashboard/config/wazuh_dashboard/opensearch_dashboards.yml
Modificar la siguiente línea (color fucsia) colocando la IP del servidor Indexer
opensearch.hosts: https://192.168.20.148:9200 

Armo el Docker-Compose

sudo nano docker-compose.yml
Basarme en https://github.com/wazuh/wazuh-docker/blob/v4.8.2/single-node/docker-compose.yml , defino usuarios, claves, certificados y carpetas

[colocar el texto que se encuentra debajo]
# Wazuh App Copyright (C) 2017, Wazuh Inc. (License GPLv2)
version: '3.7'

services:
  wazuh.dashboard:
    image: wazuh/wazuh-dashboard:4.8.2
    hostname: srvlwazuhdashboard
    restart: always
    ports:
      - 443:5601
    environment:
      - TZ=America/Argentina/Buenos_Aires
      - INDEXER_USERNAME=admin
      - INDEXER_PASSWORD=clave_indexer
      - WAZUH_API_URL=https://192.168.20.149
      - DASHBOARD_USERNAME=kibanaserver
      - DASHBOARD_PASSWORD=<clave>
      - API_USERNAME=wazuh-wui
      - API_PASSWORD=<clave>
    volumes:
      - ./config/wazuh_indexer_ssl_certs/dashboard.pem:/usr/share/wazuh-dashboard/certs/wazuh-dashboard.pem
      - ./config/wazuh_indexer_ssl_certs/dashboard-key.pem:/usr/share/wazuh-dashboard/certs/wazuh-dashboard-key.pem
      - ./config/wazuh_indexer_ssl_certs/root-ca.pem:/usr/share/wazuh-dashboard/certs/root-ca.pem
      - ./config/wazuh_dashboard/opensearch_dashboards.yml:/usr/share/wazuh-dashboard/config/opensearch_dashboards.yml
      - ./config/wazuh_dashboard/wazuh.yml:/usr/share/wazuh-dashboard/data/wazuh/config/wazuh.yml
      - wazuh-dashboard-config:/usr/share/wazuh-dashboard/data/wazuh/config
      - wazuh-dashboard-custom:/usr/share/wazuh-dashboard/plugins/wazuh/public/assets/custom

volumes:
  wazuh-dashboard-config:
  wazuh-dashboard-custom:
*La clave del Indexer es la generada en este post

Guardar las claves con Docker Swarm

Aunque especificamos las claves en el archivo docker-compose.yml, estamos dejando en texto plano claves con altos privilegios. Es MUY recomendable utilizar Docker Swarm para el almacenamientos de claves u otros sistema gestor de claves. En otro post abordaremos en forma general su almacenamiento seguro.

Reglas de Firewall

La única conexión entrante va ser https por el acceso web de la consola pero el resto son salientes

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow https
sudo ufw enable


Levantar Docker

docker-compose up -d

Opción de instalación SIN Docker

Puede surgir la necesidad de instalarlo fuera de un contenedor, por lo que se resumen a los pasos siguientes:

 Instalar dashboard

sudo bash wazuh-install.sh --wazuh-dashboard dashboard


Al finalizar muestra en consola la clave inicial para ingresar

INFO: --- Summary ---

INFO: You can access the web interface https://<wazuh-dashboard-ip>   

    User: admin   

    Password: <ADMIN_PASSWORD>

INFO: Installation finished.


Ahora ha instalado y configurado Wazuh. Encuentre todas las contraseñas que generó el asistente de instalación de Wazuh en el archivo wazuh-passwords.txt dentro del archivo wazuh-install-files.tar. Para imprimirlos, ejecute el siguiente comando:

Para ver todas las claves que generó el asistente de instalación de Wazuh (archivo wazuh-passwords.txt dentro del archivo wazuh-install-files.tar) ejecutar:

tar -O -xvf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt 

 

Certificado dashboard

Copiar los certificados a

/etc/wazuh-dashboard/certs

Cambio los permisos del los certificados

chown -R wazuh-dashboard:wazuh-dashboard /etc/wazuh-dashboard/ 
chmod -R 500 /etc/wazuh-dashboard/certs/ 
chmod 400 /etc/wazuh-dashboard/certs/*

Modifico el archivo

/etc/wazuh-dashboard/opensearch_dashboards.yml

 

Busco las lineas:

  • server.ssl.key: "/etc/wazuh-dashboard/certs/privkey.pem"
  • server.ssl.certificate: "/etc/wazuh-dashboard/certs/fullchain.pem"

Las reemplazo con los nombres de los certificados copiados anteriormente


Configuración del TimeZone

Listo los timezone disponibles para tomar el mismo código

timedatectl list-timezones

En base al listado anterior seteo el timezone correspondiente

sudo timedatectl set-timezone your_time_zone 

 Verifico el timezone se encuentre aplicado correctamente

timedatectl


Parametría del Dashboard 

Dark Mode

Ir al menú

  • En v4.7: Management -> Stack Management -> Advanced Settings -> Dark mode
  • En v4.8:  -> Dashboard Management -> Advanced Settings -> Dark Mode


Creación de Usuarios locales

Para poder ingresar con usuarios distinto al admin, es necesario crear los roles con los permisos que vamos asignar y luego los usuarios tanto en el Opensearch como en panel de Wazuh. Vamos a utilizar usuarios internos en esta primera etapa.

Tener en cuenta, el User Maping primero se crea en OpenSearch y luego se mapea con los roles

Dentro del Wazuh Dasboard, ir a

☰ -> Indexer management -> Security -> Internal User -> botón Create internal user 

 Cargar el usurname y clave, guardar

☰ -> Indexer management > Security -> Roles 

buscar all_access -> botón Duplicate Role

  • Name = nombre que le vamos al dar al nuevo rol ej all_access_agusoft

botón Create para confirmar

Seleccionar el nuevo rol creado (hacer click) -> tab Mapped Users -> botón Manage Mapping 

Buscar el usuario creado para darlos los atributos del nuevo rol dentro de Indexer

 

Ahora mapeamos el user con Wazuh, para ello 

Menu prinicipal -> Wazuh -> Security -> Roles Mapping -> botón Create Role Mapping

Completamos los datos con:

  • Role mapping name: Asignar el nombre al mapeo
  • Roles:  administrator
  • Internal users: seleccionar el (los) usuario creado previamente


botón Save role mapping para guardar y mapear el usuario con Wazuh como administrador.

 

Ya tenemos los usuarios locales creados con permisos de admin para un primera entrega

En próximos post abordaré la integración con Active Directory


Para profundizar sobre la gestión de usuario, ver documentación oficial:

https://documentation.wazuh.com/current/user-manual/user-administration/rbac.html


Index Life Management (ILM)

Las políticas de ILM se crean en el dashboard de Wazuh, accediendo a Stack Management -> Index Management > State management policies. Allí, se crea una nueva política usando el editor visual o el editor JSON (este último es el que voy a utilizar)

Utilicé los nombres por default, para este caso definí 7 días para la retención en caliente (hot) y 90 días para la retención en frío (cold), superando los 90 días se eliminan los registros.

Ajustar la retención según el espacio disponible y las normativas a cumplir

[JSON a cargar]

{
  "policy": {
    "description": "Política de retención de 7 días en caliente y 90 en frío.",
    "default_state": "hot",
    "states": [
      {
        "name": "hot",
        "actions": [],
        "transitions": [
          {
            "state_name": "cold",
            "conditions": {
              "min_index_age": "7d"
            }
          }
        ]
      },
      {
        "name": "cold",
        "actions": [
          {
            "read_only": {}
          }
        ],
        "transitions": [
          {
            "state_name": "delete",
            "conditions": {
              "min_index_age": "90d"
            }
          }
        ]
      },
      {
        "name": "delete",
        "actions": [
          {
            "delete": {}
          }
        ],
        "transitions": []
      }
    ]
  }
}


  • hot: Esta es la fase inicial donde se almacenan los datos de los últimos 7 días. Los datos están activos y listos para ser consultados.
  • cold: Después de 7 días ("min_index_age": "7d"), los índices pasan a esta fase. La acción "read_only": {} los hace de solo lectura para reducir el consumo de recursos.
  • delete: Después de 90 días en la fase "fría" ("min_index_age": "90d"), los índices se eliminan permanentemente con la acción "delete": {}.


Aplicar la política a los índices

Una vez creada la política, se debe aplicarla a los índices de alertas de Wazuh. Los índices de alertas siguen el patrón wazuh-alerts-*.


Se aplica la política de dos maneras:

  • Para nuevos índices: Asignar la política a la plantilla de índices de Wazuh para que cualquier índice nuevo herede automáticamente la configuración. Esto se hace en Index Management > Index Templates.
  • Para índices existentes: Usar la consola de Dev Tools en el dashboard de Wazuh (a la izquierda, dentro de  Stack Management) para aplicar la política a los índices que ya existen. El comando es similar a esto:

POST _ilm/start/wazuh-alerts-*
{
  "policy_id": "<nombre_de_la_politica>"
}

Donde nombre_de_la_politica corresponde al nombre utilizado al crear el ILM (paso anterior)


Se puede ampliar los concepto viendo la siguiente documentación:

  • https://documentation.wazuh.com/current/user-manual/wazuh-indexer/index-life-management.html
  • https://benheater.com/wazuh-index-management-policy/

Bonus Track: NGINX

Para facilitar la gestión de varias consolas, ya que la intención es colocar otros contenedores con consolas web (ej InfluxDB para el monitoreo de recursos) se recomienda la instalación de un proxy reverso. 


Mas Referencias

  • https://documentation.wazuh.com/current/deployment-options/docker/index.html
  • https://documentation.wazuh.com/current/getting-started/components/wazuh-dashboard.html
  • https://documentation.wazuh.com/current/installation-guide/wazuh-dashboard/index.html
  • https://documentation.wazuh.com/current/user-manual/wazuh-dashboard/index.html

0 comments:

Publicar un comentario