Wazuh
Installation et utilisation de wazuh
Wazuh est une plateforme de sécurité open-source qui offre des fonctionnalités de surveillance des menaces, de détection des intrusions, de gestion de la conformité et de réponse aux incidents. Elle combine des capacités d'analyse de sécurité, comme la détection des malwares, le monitoring de l'intégrité des fichiers, l'analyse des logs, et la gestion des vulnérabilités, pour fournir une visibilité complète sur l'infrastructure informatique. Wazuh est conçu pour être extensible et scalable, ce qui le rend adapté à une variété d'environnements, des petites entreprises aux grandes organisations.
On installera wazuh en single node.
Deux types d'installations seront faites, via le package manager APT puis via Docker
Installation via package manager APT
L'installation via package manager est disponible sur le blog de FIKARA Bilal sur une verison 4.8 de wazuh
Install wazuh on debian using apt
Installation via Docker
Nous installerons wazuh, configurerons un nginx en reverse proxy avec du SSL puis une authentification via LDAP
Installation de Docker
Exécuter le script d'installation de Docker
curl -sSL https://get.docker.com/ | sh
Démarrez le service Docker
systemctl start docker
Télécharger le binaire Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Accorder des autorisations d'exécution
chmod +x /usr/local/bin/docker-compose
Tester l'installation pour vous assurer que tout va bien
docker-compose --version
Installation de Wazuh Docker
Cloner le référentiel Wazuh
git clone https://github.com/wazuh/wazuh-docker.git -b v4.7.3
cd /etc/docker/wazuh-docker/single-node
Fournir un groupe de certificats pour chaque nœud de la pile afin de sécuriser la communication entre les nœuds

Editer le generate-indexer-certs.yml
avec un éditeur de votre choix.
vim /etc/docker/wazuh-docker/single-node/generate-indexer-certs.yml
Le fichier devrait ressembler à ça
# Wazuh App Copyright (C) 2021 Wazuh Inc. (License GPLv2)
version: '3'
services:
generator:
image: wazuh/wazuh-certs-generator:0.0.1
hostname: wazuh-certs-generator
volumes:
- ./config/wazuh_indexer_ssl_certs/:/certificates/
- ./config/certs.yml:/config/certs.yml
environment:
- HTTP_PROXY=YOUR_PROXY_ADDRESS_OR_DNS
Sinon, ignorez cette étape particulière
Exécuter la commande suivante pour obtenir les certificats souhaités
docker-compose -f generate-indexer-certs.yml run --rm generator
Cela enregistre les certificats dans le config/wazuh_indexer_ssl_certs
répertoire.
Démarrer le single node à l'aide de docker compose en arrière plan
docker-compose up -d
Wazuh est maintenant accessible sur https://<ip_de_votre_serveur>
Utilise les identifiants admin
Modification et ajout d'accès
Utilisateurs de l'indexeur Wazuh
Définir un nouveau hachage
Arrêter la pile de déploiement si elle est en cours d'exécution
docker-compose down
Exécuter cette commande pour générer le hachage de votre nouveau mot de passe. Une fois le conteneur lancé, saisissez le nouveau mot de passe et appuyez sur Entrée
docker run --rm -ti wazuh/wazuh-indexer:4.7.3 bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/hash.sh
Si vous comptez modifier deux users, vous devez donc générer deux hash avec la commande précédente
Copier le hachage généré
Ouvrir le config/wazuh_indexer/internal_users.yml
fichier. Localisez le bloc correspondant à l'utilisateur pour lequel vous modifiez le mot de passe
Remplacez le hachage
vi config/wazuh_indexer/internal_users.yml
admin
utilisateur :

kibanaserver
utilisateur

Définition du nouveau mot de passe
Utilisateur de l'Indexer et du Dashboard
Ouvrez le docker-compose.yml
fichier. Remplacez toutes les occurrences de l'ancien mot de passe par le nouveau
Avertissement
N'utilisez pas les caractères $ ou & dans votre nouveau mot de passe. Ces caractères peuvent provoquer des erreurs lors du déploiement.
vi docker-compose.yml
admin
utilisateur :
Modifier SecretPassword par le mot de passe défini lors de la génération du hash
kibanaserver
utilisateur
Modifier kibanaserver par le mot de passe défini lors de la génération du hash
Appliquer les modifications
Démarrer la pile de déploiement
docker-compose up -d
Exécuter et noter le nom du premier conteneur de l'indexeur Wazuh : single-node-wazuh.indexer-1
docker ps
Entrer dans le conteneur
docker exec -it single-node-wazuh.indexer-1 bash
Définir les variables suivantes
export INSTALLATION_DIR=/usr/share/wazuh-indexer
CACERT=$INSTALLATION_DIR/certs/root-ca.pem
KEY=$INSTALLATION_DIR/certs/admin-key.pem
CERT=$INSTALLATION_DIR/certs/admin.pem
export JAVA_HOME=/usr/share/wazuh-indexer/jdk
Attendre que l'indexeur Wazuh s'initialise correctement.
Le temps d'attente peut varier de deux à cinq minutes. Cela dépend de la taille du cluster, des ressources attribuées et de la vitesse du réseau.
Ensuite, exécutez le securityadmin.sh
script pour appliquer toutes les modifications.
bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -cd /usr/share/wazuh-indexer/opensearch-security/ -nhnv -cacert $CACERT -cert $CERT -key $KEY -p 9200 -icl
Quitter le conteneur de l'indexeur Wazuh
exit
Se connecter avec les nouvelles informations d'identification sur le tableau de bord Wazuh
La connexion se fera sans certificat ssl. Pour configurer le https il faut configurer Nginx
Utilisateurs de l'API Wazuh
Ouvrir le fichier config/wazuh_dashboard/wazuh.yml
et modifiez la valeur du password
paramètre
vi /wazuh-docker/single-node/config/wazuh_dashboard/wazuh.yml
Modifier le mot de passe surligné par celui souhaité
Ouvrir le docker-compose.yml
fichier. Remplacez toutes les occurrences de l'ancien mot de passe par le nouveau.
vi docker-compose.yml
Modifier le mot de passe surligné par celui défini au dessus pour le user wazuh-wui
Par défaut, le docker-composer expose les ports suivants :
1514
Wazuh TCP
1515
Wazuh TCP
514
Wazuh UDP
55000
API Wazuh
9200
Wazuh indexeur HTTPS
443
Tableau de bord Wazuh HTTPS
Installation et configuration de Nginx
apt install nginx
Dans notre configuration actuelle, le conteneur "single-node-wazuh.dashboard-1" est configuré pour écouter par défaut sur son port 5601 et sur le port 443 de son hôte (notre serveur). Cependant, l'installation de Nginx posera un conflit car Nginx écoute nativement sur les ports 80 et 443. Pour résoudre ce conflit, deux solutions sont envisageables : soit modifier le port d'écoute de Nginx en le configurant pour écouter sur d'autres ports tels que 8080 et 8443, soit modifier le port d'écoute de l'hôte du conteneur en changeant par exemple le port 443 du conteneur en 5601 sur l'hôte.

On stoppe le conteneur Dashboard, on le supprime des conteneurs actifs et on arrête l'instance Docker en cours
docker stop single-node-wazuh.dashboard-1
docker rm single-node-wazuh.dashboard-1
docker-compose down
On change le port d'écoute
On ouvre le fichier docker-compose. yml et on modifie le port d'écoute sur notre hôte :
vim docker-compose.yml
Précédemment en : 443:5601 on le passe en 5601:5601 ( en dessous de ports )
Ca veut dire que notre conteneur écoute sur son port 5601 et sur le port 5601 de notre machine

On redémarre notre instance docker compose
docker-compose up -d
On passe maintenant à la configuration de notre nginx
Dissocier le fichier de configuration NGINX par défaut
sudo unlink /etc/nginx/sites-enabled/default
Extraire clé du pfx :
openssl pkcs12 -in /etc/ssl/certs/wazuh.pfx -nocerts -out /etc/ssl/private/wazuh.key
Extraire certif
openssl rsa -in /etc/ssl/private/wazuh.key -out /etc/ssl/private/wazuh.pem
Configurer maintenant le site
La partie importante du site est la partie location qui redirige notre nginx reverse proxy vers notre serveur lui meme en port 5062 pour faire point vers notre conteneur single-node-wazuh.dashboard-1
vim /etc/nginx/sites-available/wazuh
server {
# Redirect HTTP to HTTPS
listen 80;
server_name soc.yrk.local;
location / { return 301 https://$host$request_uri;}
}
server {
#This config is for HTTPS setup
listen 443 ssl;
server_name soc.yrk.local;
#SSL Cert Location
#SSLCertificateFile /chemin/vers/certificat/en .pem pour le certificat lui meme
ssl_certificate /etc/ssl/certs/wazuh.crt;
#SSLCertificateFile /chemin/vers/certificat/en .pem pourla clé privée
ssl_certificate_key /etc/ssl/private/wazuh.pem;
#Disable NGINX current version reporting on error pages
server_tokens off;
#Force strong TLS
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
#Disable weak ciphers
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
#Increase Upload Size
client_max_body_size 12M;
location / {
proxy_pass https://127.0.0.1:5601;
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;
}
}
On lie le fichier de configuration.
ln -s /etc/nginx/sites-available/wazuh /etc/nginx/sites-enabled/wazuh
tester le site
nginx -t
redémarrer nginx
service nginx restart
Connexion LDAP
Config connexion et authentification
Le ldap se configure dans le wazuh indexer
docker exec -it -u 0 single-node-wazuh.indexer-1 /bin/bash
Config du fichier conf config.yml
vim opensearch-security/config.yml
Générer un certificat pour LDAPS avant de poursuivre. Si vous voulez continuez sans certificats supprimez ou commentez la ligne pemtrustedcas_filepath:
,changez le port au niveau du fichier de conf en 389 et ignorez la prochaine étape situées entre les deux lignes
Attribuer les droits du certificats au user wazuh-indexer
chown wazuh-indexer:wazuh-indexer /etc/wazuh-indexer/opensearch-security/ldapcacert.pem
Configurer le fichier de config comme suit :
# This is the main Open Distro Security configuration file where authentication
# and authorization is defined.
#
# You need to configure at least one authentication domain in the authc of this file.
# An authentication domain is responsible for extracting the user credentials from
# the request and for validating them against an authentication backend like Active Directory for example.
#
# If more than one authentication domain is configured the first one which succeeds wins.
# If all authentication domains fail then the request is unauthenticated.
# In this case an exception is thrown and/or the HTTP status is set to 401.
#
# After authentication authorization (authz) will be applied. There can be zero or more authorizers which collect
# the roles from a given backend for the authenticated user.
#
# Both, authc and auth can be enabled/disabled separately for REST and TRANSPORT layer. Default is true for both.
# http_enabled: true
# transport_enabled: true
#
# For HTTP it is possible to allow anonymous authentication. If that is the case then the HTTP authenticators try to
# find user credentials in the HTTP request. If credentials are found then the user gets regularly authenticated.
# If none can be found the user will be authenticated as an "anonymous" user. This user has always the username "anonymous"
# and one role named "anonymous_backendrole".
# If you enable anonymous authentication all HTTP authenticators will not challenge.
#
#
# Note: If you define more than one HTTP authenticators make sure to put non-challenging authenticators like "proxy" or "clientcert"
# first and the challenging one last.
# Because it's not possible to challenge a client with two different authentication methods (for example
# Kerberos and Basic) only one can have the challenge flag set to true. You can cope with this situation
# by using pre-authentication, e.g. sending a HTTP Basic authentication header in the request.
#
# Default value of the challenge flag is true.
#
#
# HTTP
# basic (challenging)
# proxy (not challenging, needs xff)
# kerberos (challenging)
# clientcert (not challenging, needs https)
# jwt (not challenging)
# host (not challenging) #DEPRECATED, will be removed in a future version.
# host based authentication is configurable in roles_mapping
# Authc
# internal
# noop
# ldap
# Authz
# ldap
# noop
_meta:
type: "config"
config_version: 2
config:
dynamic:
# Set filtered_alias_mode to 'disallow' to forbid more than 2 filtered aliases per index
# Set filtered_alias_mode to 'warn' to allow more than 2 filtered aliases per index but warns about it (default)
# Set filtered_alias_mode to 'nowarn' to allow more than 2 filtered aliases per index silently
#filtered_alias_mode: warn
#do_not_fail_on_forbidden: false
#kibana:
# Kibana multitenancy
#multitenancy_enabled: true
#server_username: kibanaserver
#index: '.kibana'
http:
anonymous_auth_enabled: false
xff:
enabled: false
internalProxies: '192\.168\.0\.10|192\.168\.0\.11' # regex pattern
#internalProxies: '.*' # trust all internal proxies, regex pattern
#remoteIpHeader: 'x-forwarded-for'
###### see https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html for regex help
###### more information about XFF https://en.wikipedia.org/wiki/X-Forwarded-For
###### and here https://tools.ietf.org/html/rfc7239
###### and https://tomcat.apache.org/tomcat-8.0-doc/config/valve.html#Remote_IP_Valve
authc:
basic_internal_auth_domain:
description: "Authenticate via HTTP Basic against internal users database"
http_enabled: true
transport_enabled: true
order: 0
http_authenticator:
type: basic
challenge: false
authentication_backend:
type: internal
ldap:
description: "Authenticate via LDAP or Active Directory"
http_enabled: true
transport_enabled: true
order: 1
http_authenticator:
type: basic
challenge: false
authentication_backend:
# LDAP authentication backend (authenticate users against a LDAP or Active Directory)
type: ldap
config:
enable_ssl: true
pemtrustedcas_filepath: /usr/share/wazuh-indexer/opensearch-security/ldapcacert.pem
enable_start_tls: false
enable_ssl_client_auth: false
verify_hostnames: false
hosts:
- ad1.yrk.local:636
bind_dn: 'cn=bind,ou=sys,ou=informatique,ou=users,dc=yrk,dc=local'
password: 'your_user_password'
userbase: 'DC=yrk,DC=local'
usersearch: '(sAMAccountName={0})'
username_attribute: cn
authz:
ldap:
http_enabled: true
transport_enabled: true
authorization_backend:
type: ldap
config:
enable_ssl: true
pemtrustedcas_filepath: /usr/share/wazuh-indexer/opensearch-security/ldapcacert.pem
enable_start_tls: false
enable_ssl_client_auth: false
verify_hostnames: false
hosts:
- ad1.yrk.local:636
bind_dn: 'cn=bind,ou=sys,ou=informatique,ou=users,dc=yrk,dc=local'
password: 'your_user_password'
userbase: 'DC=yrk,DC=local'
usersearch: '(uid={0})'
#username_attribute: uid
username_attribute: 'sAMAccountName'
rolesearch_enabled: true
rolebase: 'DC=yrk,DC=local'
rolesearch: '(member={0})'
userroleattribute: null
userrolename: 'memberOf'
rolename: cn
resolve_nested_roles: false
skip_users:
- kibanaserver
- admin
Exécuter le securityadmin.sh
pour charger les modifs apporter au config.yml
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -f /usr/share/wazuh-indexer/opensearch-security/config.yml -icl -key /usr/shar e/wazuh-indexer/certs/admin-key.pem -cert /usr/share/wazuh-indexer/certs/admin.pem -cacert /usr/share/wazuh-indexer/certs/root-ca.pem -h localhost -nhnv
Map role à wazuh-dashboard
Config role d'admin
Configurer le fichier roles_mapping.yml
pour mapper le rôle (CN) que nous avons dans notre serveur LDAP au rôle du Wazuh_indexer approprié. Dans notre cas, nous mappons les utilisateurs du groupe Sys dans notre AD au all_access
rôle sur le wazuh indexer.
vim opensearch-security/roles_mapping.yml
all_access:
reserved: false
backend_roles:
- "admin"
- "Sys"
description: "Maps admin to all_access"
Exécuter le securityadmin
script pour charger les modifications de configuration apportées dans le roles_mapping.yml
fichier
export JAVA_HOME=/usr/share/wazuh-indexer/jdk/ && bash /usr/share/wazuh-indexer/plugins/opensearch-security/tools/securityadmin.sh -f /usr/share/wazuh-indexer/opensearch-security/roles_mapping.yml -icl -key /usr/shar e/wazuh-indexer/certs/admin-key.pem -cert /usr/share/wazuh-indexer/certs/admin.pem -cacert /usr/share/wazuh-indexer/certs/root-ca.pem -h localhost -nhnv
Vérifier la valeur de run_as
dans le /usr/share/wazuh-dashboard/data/wazuh/config/wazuh.yml
fichier de configuration et passez le à false s'il ne l'est pas
Pour cette vérification il faut changer de conteneur :
docker exec -it -u 0 single-node-wazuh.dashboard-1 /bin/bash
vim data/wazuh/config/wazuh.yml
La conf ressemble à ca. Le mdp est celui du user pour l'API défini au plus haut ( wazuh-wui )

Sortir du conteneur et le relancer
Se connecter maintenant avec un user de Sys.
Last updated
Was this helpful?