Securitizando tu red: Instalando servidores de Wazuh (Parte 4)

Escrito por Daniel Olivares

Introducción

Esta es la parte 4 de nuestra serie de artículos para mejorar la seguridad de nuestras PYMES y Hogar, los artículos anteriores son:

Hoy queremos presentar una solución SIEM/XDR open source que nos permitirá integrar y analizar los logs que genera nuestra infraestructura y alertar cuando se detecte un comportamiento anómalo. 

La solución que utilizaremos en este artículo será Wazuh y como ya se mencionó es una herramienta open source bajo licencia GPLv2, que utiliza Opensearch para el procesamiento de datos. Para mayor detalle de las funciones que tiene pueden visitar el siguiente enlace Capabilities – Wazuh documentation.

Es importante mencionar que ésta es la primera de una mini-serie de artículos. Aquí solo abarcaremos la instalación y configuración inicial de la plataforma, en los siguientes artículos profundizaremos más.

Arquitectura Propuesta

Para el desarrollo de este articulo proponemos una arquitectura de red segmentada en 3 principales áreas: 

  • VLAN de Usuarios: En la VLAN de usuarios dispondremos de dos estaciones de trabajo, una con Windows y otra con Linux para probar el envío de LOG. 
  • DMZ Interna: en la DMZ Interna tendremos el servidor PiHole para DNS y el servidor SQUID en modo Proxy Fordward, ambos enviaran sus LOG al servidor Wazuh Server. 
  • DMZ Externa: en la DMZ Externa dispondremos los tres servidores necesarios para que el cluster de Wazuh funcione. 

Esta red se resume en el siguiente diagrama: 

Es importante destacar que la configuración de los Firewall de cada equipo debe ser lo más acotada posible, solo permitiendo los accesos desde origines específicos y autorizados 

Sin más que decir, comencemos… 

Prerrequisitos

Hardware

Para instalar Wazuh, idealmente necesitarás tres instalaciones limpias, con acceso a Internet y actualizada de la distribución Linux de tu preferencia. En este tutorial usaremos Ubuntu 22. 

Además, tu sistema debe cumplir con los siguientes requisitos mínimos según especificaciones del fabricante: 

Mínimo RAMMínimo CPU CoresRecomendado RAMRecomendado CPU Cores
Wazuh Indexer 16 
Wazuh Server 
Wazuh Dashboard 

Respecto al espacio de disco requerido, este dependerá de la cantidad de equipos que envíen eventos a Wazuh. El cálculo de espacio se realiza utilizando las Alertas Por Segundo (APS) que se generen en el SIEM y para esto el fabricante dispone de la siguiente tabla. 

EndpointAPSAlmacenamiento (GB/90 días)
Servidor 0,25 3,7 
Workstation 0,1 1,5 
Network Device 0,5 7,4 

Con esto tenemos que, por ejemplo, para un ambiente de 80 estaciones de trabajo, 10 servidores y 10 dispositivos de red, el servidor Indexer necesita 230GB para almacenar 90 días. 

Ref: Wazuh indexer – Installation guide · Wazuh documentation 

Firewall

Finalmente, el firewall de cada servidor deberá permitir los siguientes puertos según el rol del servidor: 

ComponentePuertoProtocoloPropósito
Wazuh server 1514 TCP (default) Agent connection service 
1514 UDP (opcional) Agent connection service
1515 TCP Agent enrollment service 
1516 TCP Wazuh cluster daemon 
514 UDP (default) Wazuh Syslog collector
514 TCP (opcional) Wazuh Syslog collector
55000 TCP Wazuh server RESTful API 
Wazuh indexer 9200 TCP Wazuh indexer RESTful API 
9300-9400 TCP Wazuh indexer cluster communication 
Wazuh dashboard 443 TCP Wazuh web user interface 

Ref: Architecture – Getting started with Wazuh · Wazuh documentation 

Para esto, y según el firewall que tengas configurado, tendremos como base la siguiente configuración: 

UFW
Wazuh Indexersudo ufw allow from <ip_server> to any port 9200 proto tcp comment "Wazuh indexer RESTful API." 
sudo ufw allow from <ip_dashboard> to any port 9200 proto tcp comment "Wazuh indexer RESTful API." 
sudo ufw allow from <ip_server> to any port 9300:9400 proto tcp comment "Wazuh indexer cluster communication." 
sudo ufw allow from <ip_dashboard> to any port 9300:9400 proto tcp comment "Wazuh indexer cluster communication." 
Wazuh Serversudo ufw allow from to any port 1514:1516 proto tcp comment "Wazuh Agent Connection and Wazuh Cluester Daemon"
sudo ufw allow from to any port 1514:1516 proto tcp comment "Wazuh Agent Connection and Wazuh Cluester Daemon"
sudo ufw allow from to any port 514 proto udp comment "Wazuh Syslog collector"
sudo ufw allow from to any port 514 proto udp comment "Wazuh Syslog collector"
sudo ufw allow from to any port 55000 proto tcp comment "Wazuh server RESTful API"
Wazuh Dashboardsudo ufw allow from to any port 443 proto tcp comment "Wazuh web user interface"
NFTABLES
Wazuh Indexer$ nano /etc/nftables.conf
table ip filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ip saddr { <ip_server>, <ip_dashboard> } tcp dport 9200 accept
ip saddr { <ip_server>, <ip_dashboard> } tcp dport { 9300 : 9400 } accept
}
}
$ sudo nft -f /etc/nftables.conf
$ sudo nft list ruleset
Wazuh Server$ nano /etc/nftables.conf
table ip filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ip saddr { <vlan_usuarios>, <DMZ_Interna> } tcp dport { 1514 : 1516 } accept
ip saddr { <vlan_usuarios>, <DMZ_Interna> } udp dport 514 accept
ip saddr { <vlan_usuarios>, <DMZ_Interna> } tcp dport 55000 accept
}
}
$ sudo nft -f /etc/nftables.conf
$ sudo nft list ruleset
Wazuh Dashboard$ nano /etc/nftables.conf
table ip filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
ip saddr { <vlan_usuarios>, <DMZ_Interna> } tcp dport { 1514 : 1516 } accept
ip saddr { <vlan_usuarios> } tcp dport 443 accept
}
}
$ sudo nft -f /etc/nftables.conf
$ sudo nft list ruleset
IPTABLES
Wazuh Indexersudo iptables -A INPUT -p tcp --dport 9200 -s <ip_server>, <ip_dashboard>, -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9300:9400 -s <ip_server>, <ip_dashboard>, -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4
Wazuh Serversudo iptables -A INPUT -p tcp --dport 1514:1516 -s <vlan_usuarios>, <DMZ_Interna>, -j ACCEPT
sudo iptables -A INPUT -p udp --dport 514 -s <vlan_usuarios>, <DMZ_Interna>, -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 55000 -s <vlan_usuarios>, <DMZ_Interna>, -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4 
Wazuh Dashboardsudo iptables -A INPUT -p tcp --dport 443-s <vlan_usuarios> -j ACCEPT 
sudo iptables-save > /etc/iptables/rules.v4 

En caso de requerir conectar algún agente desde internet (WAN) se deberá configurar en el Firewall de borde una regla que permita el tráfico entrante 1514-1515/TCP con dirección hacía el servidor con rol “Wazuh Server”. 

Instalación

Generación del archivo de configuración del instalador 

Como se vio en los puntos anteriores, para la instalación necesitamos 3 servidores, para este ejemplo utilizaremos las siguientes IP:

ServidorIP de ejemplo
Wazuh Indexer 20.20.20.10 
Wazuh Server 20.20.20.11 
Wazuh Dashboard 20.20.20.12 

Para realizar la instalación se utilizará el proceso asistido descrito en la documentación oficial. Comenzaremos la instalación en el servidor que será utilizado de Indexer, conectándose mediante SSH y ejecutaremos los siguientes comandos: 

$ curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh 
$ curl -sO https://packages.wazuh.com/4.7/config.yml 

Luego se debe editar el equipo config.yml con la IP que tiene configurado el servidor Indexer, Server y Dashboard. La configuración debería verse de la siguiente manera: 

El script de instalación Wazuh permite configurar múltiples nodos de Indexer o Servers. Esto se realiza agregando otra sección “- name: node-X” donde X debe ser el número consecutivo bajo el rol que corresponda. 

Guardamos el archivo y luego ejecutamos el siguiente comando: 

$ sudo bash wazuh-install.sh --generate-config-files 

Este generará el archivo wazuh-install-files.tar, conteniendo todos los archivos y configuraciones necesarias para configurar el cluster.

Una vez generado el archivo se debe copiar en los otros dos servidores, para esto le cambiaremos el dueño del archivo de root al de la cuenta que estes utilizando con el siguiente comando:

$ sudo chown <user>:<user> wazuh-install-files.tar

Para luego copiarlo a los dos servidores faltantes utilizando los siguientes comandos 

$ scp wazuh-install-files.tar <user>@<IP_server>:/home/<user>/

Instalación de Wazuh Indexer

Es importante destacar que durante el proceso de instalación se deberá indicar el rol del servidor utilizando un flag y el nombre del nodo que será instalado en cada servidor
Los flag de rol disponibles son:  

FlagRol
–wazuh-indexer Wazuh Indexer 
–wazuh-server Wazuh Server 
–wazuh-dashboard Wazuh Dashboard 

Tambien se debe tener en cuenta que SIEMPRE el primer nodo en ser configurado será el “Maestro” y los siguientes serán “Workers”

Con los archivos de instalación en cada equipo, se puede continuar la instalación. En el servidor definido como Indexer (20.20.20.10) ejecutaremos el siguiente comando:

$ sudo bash wazuh-install.sh --wazuh-indexer node-1 

El flag “–wazuh-indexer” le indicará al script cual es el rol que se deberá instalar el script, en este caso será un nodo tipo “indexer”. La sección “node-1” es sencillamente el nombre que se le asignará al nodo, en caso de tener más de un indexer para instalar se deberá cambiar el número de indexer para que la instalación se realice correctamente, por ej. dejar “node-2” para el siguiente.

Y finalizaremos la instalación inicializando el nodo con el siguiente comando:

sudo bash wazuh-install.sh --start-cluster

Luego de la inicialización se nos asignará una clave aleatoria para la cuenta de administrador, esta queda registrada en el log, pero para reconocerla más facilmente utilizaremos el siguiente comando:

$ tar -axf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt -O | grep -P "\'admin\'" -A 1

Para poder validar que el nodo se instaló correctamente utilizaremos “curl” con el usuario admin y la contraseña encontrada anteriormente:

$ curl -k -u admin:<ADMIN_PASSWORD> https://<WAZUH_INDEXER_IP>:9200 

Si la instalación finalizó correctamente, se visualizará un output similar al siguiente: 

Felicidades! Ya tienes el primer componente instalado.

Instalación de Wazuh Server

Luego continuaremos la instalación del servidor con rol Wazuh Server (20.20.20.11), para esto nos deberemos conectar al equipo por SSH y ejecutar los siguientes comandos: 

$ curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh 
$ sudo bash wazuh-install.sh --wazuh-server wazuh-1

El flag “–wazuh-server” le indicará al script cual es el rol que se deberá instalar el script. Esta parte toma relevancia en caso de tener más de un “Servidor” para instalar, en ese caso se deberá cambiar el número de “Server” para que la instalación se realice correctamente.

El flag “–wazuh-server” le indicará al script cual es el rol que se deberá instalar el script, en este caso será un nodo tipo “server”. La sección “wazuh-1” es sencillamente el nombre que se le asignará al servidor, en caso de tener más de un equipo tipo “server” para instalar se deberá cambiar el número para que la instalación se realice correctamente, por ej. dejar “wazuh-2” para el siguiente.

Para validar que el servicio se encuentre en ejecución, utilizaremos el comando:

service wazuh-manager status

Si la instalación terminó correctamente deberías tener un output como el siguiente:

Felicidades! Ya tienes el segundo componente instalado.

Instalación Wazuh Dashboard

Continuamos con la instalación del servidor con rol Wazuh Dashboard (20.20.20.12), para esto nos deberemos conectar al equipo por SSH y ejecutar los siguientes comandos: 

$ curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh
$ sudo bash wazuh-install.sh --wazuh-dashboard dashboard

Con este último paso habremos terminado de instalar los tres componentes del cluster Wazuh y podremos acceder al portal de administración utilizando nuestro navegador favorito en la URL https://<ip_wazuh-dashboard&gt; utilizando el usuario y contraseña que muestra al finalizar el proceso de instalación.

Configuración inicial

Antes de continuar con la integración de los eventos del DNS, Proxy, SYSMON y AuditD realizaremos las siguientes configuración base en Wazuh: 

  • Configurar Index State Management (ISM) 
  • Habilitar el servidor SYSLOG. 
  • Configurar una contraseña de autenticación del agente. 

Configurar Index State Management (ISM)

La primera configuración que realizaremos será establecer los tiempos de retención de los eventos. Para esto configuraremos una política de index utilizando el siguiente archivo de configuración: 

A continuación, se explicarán los puntos esenciales para entender la configuración planteada para ISM. En caso de querer entender en mayor profundidad como se manejan los ciclos de vida de los index puedes revisar el siguiente enlace Policies – OpenSearch Documentation  

{
    "policy": {
        "description": "Wazuh index state management for OpenDistro to move indices into a cold state after 7 days and delete them after 60 days.",
        "last_updated_time": 1673675076501,
        "schema_version": 12,
        "error_notification": null,
        "default_state": "hot",
        "states": [
            {
                "name": "hot",
                "actions": [
                    {
                        "replica_count": {
                            "number_of_replicas": 0
                        }
                    }
                ],
                "transitions": [
                    {
                        "state_name": "cold",
                        "conditions": {
                            "min_index_age": "7d"
                        }
                    }
                ]
            },
            {
                "name": "cold",
                "actions": [
                    {
                        "read_only": {}
                    }
                ],
                "transitions": [
                    {
                        "state_name": "delete",
                        "conditions": {
                            "min_index_age": "60d"
                        }
                    }
                ]
            },
            {
                "name": "delete",
                "actions": [
                    {
                        "delete": {}
                    }
                ],
                "transitions": []
            }
        ],
        "ism_template": [ 
            { 
                "index_patterns": [ 
                    "wazuh-alerts*" 
                ], 
                "priority": 100, 
                "last_updated_time": 1673675076501 
            }
        ]
    }
}

La siguiente tabla detalla los aspectos más importantes del archivo: 

CampoDescripción
default_state Estado base del ciclo de vida que se le asignara a los index cuando sean creados.  
En el archivo de configuración propuesto el estado base de los index será “hot”. 
states En esta sección se definirá la configuración para cada estado.
Estos pueden ser:  
  • Hot: Los index “hot” contienen los datos más recientes y de mayor uso.
  • Warm: Los index “warm” contienen datos que no son activamente utilizados, aun así, se podrían requerir.
  • Cold: Los index “cold” son datos históricos que no son consultados frecuentemente. Generalmente son usados como índices “solo lectura”.
  • Delete: Cuando un index cambia al estado “Delete” será borrado dado que ya cumplio su ciclo de vida.
En este caso solo utilizaremos tres: Hot, Cold, Delete. 
states.name Nombre del estado. 
states.actions Acciones que se ejecutaran cuando se entre en el estado. 
states.transitions Define el siguiente estado al que pasara el index y bajo que condiciones.  
En la configuración propuesta los datos en el índice “hot” tienen definida una primera transición al estado “cold” después de 7 días de antigüedad.
La segunda transición será desde el estado “cold” (sólo lectura) al estado “delete” despues de 60 días de antigüedad del index.
Una vez se el index pase al estado “delete” este será eliminado.

Para configurarlo en el servidor haremos clic en el icono de menú y luego haremos clic en “Index Management”:

Luego en “Policy managed indices” haremos clic en “create policy”:

Luego seleccionaremos como método de configuración “JSON editor”. Lo primero será indicar el nombre de la política y esto se hará escribiendo “wazuh-index-state-policy” en el recuadro “Policy ID”.

Luego se pegará la configuración propuesta en la sección “Define Policy”.

Ref: Index life management – Wazuh indexer · Wazuh documentation 

Habilitar el servidor SYSLOG

Para habilitar el servicio de syslog tendremos que conectarnos por SSH al servidor con rol “Wazuh Server” y editaremos el archivo de configuración “/var/ossec/etc/ossec.conf” y agregaremos la siguiente configuración.

  <remote>
    <connection>syslog</connection>
    <port>514</port>
    <protocol>udp</protocol>
  </remote>

Guardamos y reiniciamos el servicio wazuh-mananger

systemctl restart wazuh-manager

Configurar una contraseña de autenticación del agente

Para habilitar la autenticación por contraseña del que permitirá que solo los agentes que cuenten con la debida contraseña configurada podrán conectarse al cluster Wazuh.

Para esto tendremos que conectarnos por SSH al servidor con rol “Wazuh Server” y editaremos el archivo de configuración “/var/ossec/etc/ossec.conf” en la sección “auth” cambiando <use_password>no</use_password> por <use_password>yes</use_password>

Guardamos y reiniciamos el servicio wazuh-mananger

systemctl restart wazuh-manager

Para establecer la contraseña de los clientes, pordemos obtener una de cualquier manera. Para esta ocasión ejecutaremos el siguiente comando, que nos mostrará una contraseña aleatoria del registro de autenticación.

grep "Random password" /var/ossec/logs/ossec.log

Luego para dejarla como una contraseña permanente utilizamos los siguientes comandos:

$ echo "<CUSTOM_PASSWORD>" > /var/ossec/etc/authd.pass 
$ chmod 640 /var/ossec/etc/authd.pass 
$ chown root:wazuh /var/ossec/etc/authd.pass 

Finalizamos reiniciando el servicio wazuh-mananger 

systemctl restart wazuh-manager

Ref: Using password authentication – Additional security options (wazuh.com) 

Conclusión primera parte

Con esto tenemos armada la base de nuestro cluster Wazuh, se conectan entre ellos y nos podemos autenticar frente al “Dashboard”, que nos va a dar la facilidad para la mayoría de las configuraciones.

En los siguientes artículos conectaremos los servidores y las estaciones de trabajo a nuestro EDR para tener toda su información y luego avanzaremos con las detecciones iniciales de los comportamientos anómalos.

Muchas gracias por leer hasta acá, y los esperamos en el siguiente.

Deje un comentario

Crea una web o blog en WordPress.com

Subir ↑