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_zoneSumo 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
- Ingresar a Wazuh Dashboard con el usuario Admin (para que aparezcan las opciones ABM de usuarios)
- Hambueguesa -> OpenSearch Plugin -> Secuity -> Internal User
- Hambueguesa -> Indexer Management -> Secuity -> Internal User
- Username = nombre del usuario de servicio que va usar graylog para acceder a Wazu. Ej graylog
- Password = clave del usuario de servicio
- Backend role = admin
- 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 httpsHacemos 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].
En Wazuh Indexer editar el archivo /etc/wazuh-indexer/opensearch.yml
Cambiar el valor a false de la siguiente línea
compatibility.override_main_response_version: falseReiniciar 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