Wazuh

Installation et utilisation de wazuh

Doc officielle 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

Entrez ensuite dans le single-noderépertoire pour exécuter toutes les commandes décrites ci-dessous dans ce répertoire.

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

Les noeuds Wazuh sont Wazuh_Indexer, Wazuh_Manager et Wazuh_Dashboard . Notre install Wazuh est en single node ( tout en un )

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

Si votre système utilise un proxy, ajoutez ce qui suit au generate-indexer-certs.ymlfichier. Sinon, ignorez cette étape particulière

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_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

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.shscript 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

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 :

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

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

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

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 :

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

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_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

all_access:
  reserved: false
  backend_roles:
  - "admin"
  - "Sys"
  description: "Maps admin to all_access"

Exécuter le securityadminscript pour charger les modifications de configuration apportées dans le roles_mapping.ymlfichier

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_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 :

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