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:
- Securitizando tu red: Sysmon y AuditD (Parte 3)
- Securitizando tu red: SQUID (Parte 2)
- Securitizando tu red: Pi-Hole (Parte 1)
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 RAM | Mínimo CPU Cores | Recomendado RAM | Recomendado CPU Cores | |
---|---|---|---|---|
Wazuh Indexer | 4 | 2 | 16 | 8 |
Wazuh Server | 2 | 2 | 4 | 8 |
Wazuh Dashboard | 4 | 2 | 8 | 4 |
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.
Endpoint | APS | Almacenamiento (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:
Componente | Puerto | Protocolo | Propó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 Indexer | sudo 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 Server | 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 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 Dashboard | sudo 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 Indexer | sudo 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 Server | sudo 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 Dashboard | sudo 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:
Servidor | IP 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:
Flag | Rol |
---|---|
–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> 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:
Campo | Descripció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:
|
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