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
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_certsrépertoire.
Démarrer le single node à l'aide de docker compose en arrière plan
docker-compose up -d
Pour savoir quand l'indexeur Wazuh est opérationnel, le conteneur du tableau de bord Wazuh utilise curlpour exécuter plusieurs requêtes vers l'API de l'indexeur Wazuh. Vous pouvez vous attendre à voir plusieurs messages de journal ou «Wazuh dashboard server is not ready yet » jusqu'au démarrage de l'indexeur Wazuh. Ensuite, le processus de configuration se poursuit normalement. Le démarrage de l'indexeur Wazuh prend environ 1 minute. Vous pouvez trouver les informations d'identification par défaut de l'indexeur Wazuh dans le fichier docker-compose.ymldu conteneur
Wazuh est maintenant accessible sur https://<ip_de_votre_serveur>
Utilise les identifiants admin
Modification et ajout d'accès
Le nom d'utilisateur et le mot de passe par défaut du tableau de bord Wazuh sont adminet SecretPassword. Chose qui sera modifiée
Il existe deux types d'utilisateurs Wazuh : Utilisateurs de l'indexeur Wazuh et Utilisateurs de l'API Wazuh : Wazuh off
Pour changer le mot de passe de ces utilisateurs Wazuh, les étapes suivantes doivent être exécutées depuis le répertoire single-node/
Utilisateurs de l'indexeur Wazuh
Les users qu'on modifiera seront admin et kibanaserver ( les users par défaut )
admin : nom d'utilisateur pour l'indexer ( pourra se connecter à l'interface web avec tous les droits )
kibanaserver : nom d'utilisateur pour le dashboard ( se connecte également à l'interface web en droit limité si restreint )
wazuh-wui : username pour l'api ( ne pourra pas se connecter en web )
S'il y a des users personnalisés il faut les ajouter internal_users.ymlfichier. Dans le cas contraire, l'exécution de cette procédure les supprime
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
adminutilisateur :
Remplacez la ligne hash surlignée par le hash généré précédemment à l'intérieur des ""
kibanaserverutilisateur
Définition du nouveau mot de passe
Utilisateur de l'Indexer et du Dashboard
Ouvrez le docker-compose.ymlfichier. 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
adminutilisateur :
Modifier SecretPassword par le mot de passe défini lors de la génération du hash
kibanaserverutilisateur
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
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
wazuh-wui est l'utilisateur qui se connecte à l'API Wazuh par défaut. Suivez ces étapes pour modifier le mot de passe.
Le mot de passe des utilisateurs de l'API Wazuh doit comporter entre 8 et 64 caractères. Il doit contenir au moins une lettre majuscule et une lettre minuscule, un chiffre et un symbole.
Ouvrir le fichier config/wazuh_dashboard/wazuh.ymlet modifiez la valeur du passwordparamètre
vi /wazuh-docker/single-node/config/wazuh_dashboard/wazuh.yml
Modifier le mot de passe surligné par celui souhaité
Ouvrir le docker-compose.ymlfichier. 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.
Nous opterons pour la solution qui est de modifier le port d'écoute de l'hôte du conteneur. il passera de 443 à 5601 afin que Nginx puisse écouter en 443
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
Si certificat, le configurer au préalable et faire pointer dans le fichier de conf du 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;
}
}
Les commandes ici nécessitent de se connecter en bash à l'intérieur de conteneurs. les option -u 0 des commandes dcokers spécifie une connexion avec l'user root
Si des commandes ne s'effectuent pas ( introuvable par exemple ) installez les.
Lancez un apt-get update puis installez les paquets dont vous avez besoin
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
Regarder la doc officielle Opensearch pour plus d'info : Opensearch
La Doc officielle Wazuh n'explique pas la conf de LDAP avec Docker, mais elle est très utile. Les chemins de répertoires diffèrent lors d'une install docker : Wazuh DOC LDAP
# 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
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_accessrôle sur le wazuh indexer.
vim opensearch-security/roles_mapping.yml
Ne modifiez que la ligne all_acces. Si vous avez besoin de toucher aux autres blocs connaissez en les conséquences
Vérifier la valeur de run_asdans le /usr/share/wazuh-dashboard/data/wazuh/config/wazuh.ymlfichier de configuration et passez le à false s'il ne l'est pas
Pour cette vérification il faut changer de conteneur :