Installation de MeshCentral

Crowdsec Open source meshcentral Remote desktop Contrôle à distance Télé-assistance RMM Monitoring

Dernier billet sur les alternatives à Teamviewer ou Anydesk avec l'installation du logiciel libre, auto-hébergeable et gratuit Meshcentral. Plus proche du RMM ((Remote Monitoring & Management) comme Remotely, il propose une configuration plus poussée que ce dernier malgré une interface un peu austère.

Démarré en 2008 par Ylian Saint-Hilaire, Meshcentral est une solution libre et gratuite que vous pouvez auto-héberger afin de gérer à distance à travers une interface web différents systèmes sur lesquels un agent est installé. Actuellement, l'agent peut être déployé sur les systèmes suivants :

  • Windows
  • GNU/Linux
  • BSD
  • MacOS
  • Android

Malgré une interface un peu "old school" qui peut rebuter, sa richesse en termes de fonctionnalités et son niveau de configuration en font une des solutions libres la plus avancée. À noter qu'il est même possible de faire tourner plusieurs serveurs Meshcentral en mode load-balancing.

mesh01

  • Un nom de domaine de portée globale (plus simple pour la mise en place du HTTPS avec Let's Encrypt).
  • Ubuntu 22.04 pour faire tourner la partie serveur / Conteneur LXC sur Proxmox VE 8.0.3.
  • Un reverse-proxy Nginx.
  • Des machines clientes sous Windows.

Dans cet exemple, je mets en place une configuration de base. On peut aller bien au delà en montant par exemple une architecture en mode load-balancing, en envoyant des notifications par SMS, etc...

server {
    listen 80;
    server_name mc.domaine.fr;
    location / {
        proxy_pass http://192.168.1.244:800/; # IP du serveur MeshCentral dans mon lab
        proxy_http_version 1.1;
        # Inform MeshCentral about the real host, port and protocol
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen        443 ssl http2;
    server_name   mc.domaine.fr;

    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    ssl_certificate /etc/letsencrypt/live/mc.domaine.fr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mc.domaine.fr/privkey.pem;

    access_log      /var/log/nginx/mc.access.log;
    error_log       /var/log/nginx/mc.error.log;

    # MeshCentral uses long standing web socket connections, set longer timeouts.
    proxy_send_timeout 330s;
    proxy_read_timeout 330s;    

    location / {
        proxy_pass http://192.168.1.244:4430/;  # IP du serveur MeshCentral dans mon lab
        proxy_http_version 1.1;
        # Allows websockets over HTTPS.
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        # Inform MeshCentral about the real host, port and protocol
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
   }
}

Dans cette configuration, j'utiliserai le backend MongoDB mais l'installation de celui-ci n'est pas indispensable.

# apt install gnupg gpg nodejs npm 
# wget https://pgp.mongodb.com/server-6.0.asc
# mv server-6.0.asc /etc/apt/trusted.gpg.d/
# chown 644 /etc/apt/trusted.gpg.d/server-6.0.asc

# vim /etc/apt/sources.list.d/mongodb.list

deb [signed-by=/etc/apt/trusted.gpg.d/server-6.0.asc] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse

# apt update && apt dist-upgrade -y
# apt install mongodb-org
# systemctl enable mongod
# systemctl start mongod

## Autoriser l'accès à NodeJS pour utiliser les ports inférieurs à 1024
# setcap cap_net_bind_service=+ep /usr/bin/node

## Ajout de l'utilisateur meshcentral qui fera tourner le service 
# adduser meshcentral

## Installation de Meshcentral
# sudo -i -u meshcentral
$ mkdir node_modules
## Installation du logiciel (version 1.1.6)
$ npm install meshcentral

## Configuration de Meshcentral
### Note : Dans cette dernière version, le dossier contenant le fichier de configuration se situe dans /home/meshcentral/meshcentral-data et non dans 
### /home/meshcentral/node_modules/meshcentral/meshcentral-data indiqué dans différentes documentations dont la documentation officielle.
$ vim ~/meshcentral-data/config.json

{
  "$schema": "https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json",
  "__comment1__": "This is a simple configuration file, all values and sections that start with underscore (_) are ignored. Edit a section and remove the _ in front of the name. Refer to the user's guide for details.",
  "settings": {
    "MongoDb": "mongodb://127.0.0.1:27017/meshcentral",
    "Cert": "mc.domaine.fr",
    "AliasPort": 443,
    "Port": 4430,
    "RedirPort": 800,
    "AgentPong": 300,
    "TlsOffload": "ADRESSE IP DU REVERSE-PROXY"
  },
  "domains": {
  "": {
        "certUrl": "https://ADRESSE IP DU REVERSE-PROXY:443"}
  }
}

## Il est possible de lancer Meshcentral directement façon de vérifier la configuration
$ node ./node_modules/meshcentral --debug
## Si c'est OK, on arrête le processus et on repasse en root
$ exit

## Création de l'unité de service
# vim /etc/systemd/system/meshcentral.service

[Unit]
Description=MeshCentral Server
[Service]
Type=simple
LimitNOFILE=1000000
ExecStart=/usr/bin/node /home/meshcentral/node_modules/meshcentral
WorkingDirectory=/home/meshcentral
Environment=NODE_ENV=production
User=meshcentral
Group=meshcentral
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10
# Set port permissions capability
AmbientCapabilities=cap_net_bind_service
[Install]
WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl enable meshcentral
# systemctl start meshcentral

Rdv sur sur https://mc.domaine.fr puis créez le premier utilisateur qui deviendra l'admin par défaut en cliquant sur le lien qui disparaîtra une fois le premier utilisateur créé.

mesh02

Avant de déployer le client, nous allons reprendre les scénarios vu dans le précédent billet portant sur Remotely.

Dans cet exemple, j'ai donc configuré deux groupes d'appareils :

  • Windows PC
  • Windows Serveurs

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2009-44-21

J'ai ensuite créé deux groupes :

  • Techadmin : accès aux serveurs et aux PC.
  • Techlog : accès uniquement au PC pour du support fonctionnel logiciel par exemple.

mesh03

Enfin j'ai créé deux utilisateurs :

  • techadmin01 faisant parti du groupe Techadmin .
  • techlog01 faisant parti du groupe Techlog.

mesh04

À partir de là, on entrevoit la puissance de Meshcentral par la finesse de la gestion les permissions façon ACL. En effet les permissions peuvent être réglées de manière granulaire : au niveau des groupes et/ou des utilisateurs sur un ou plusieurs groupes d'appareils et/ou sur un ou plusieurs appareils en particulier.

Ici, j'ai réglé les permissions au niveau des groupes :

  • Techadmin : le groupe a un accès complet aux groupes d'appareils "Windows PC" et "WIndows Serveurs".
  • Techlog : le groupe a un accès se limitant au groupe d'appareils "Windows PC" avec des permissions plus restreintes .

Ce qui donne :

meshgrp01 Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-03-31

Là aussi, Meshcentral démontre sa modularité en proposant différents modes d'installation. Je ferai pour ma part une installation classique de l'agent :

  1. Cliquez sur "Ajouter un agent"
  2. Récupérez l'agent Mesh correspondant à votre système.

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-13-16

  1. Lancez l'exécutable sur la machine à prendre à main puis cliquez sur Installer. meshinstall

L'agent doit tourner en tant que service sur Windows.

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-13-31

Sur la console web centrale, vous devez voir le PC remonté dans le groupe concerné.

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-17-58

Faites de même pour le serveur.

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-18-31

Scénario 1

  • Seuls les utilisateurs du groupe techadmin ont un accès complet aux deux groupes d'appareils.
  • Résultat : OK

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-21-53

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-22-35

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-23-25

Scénario 2

  • Les utilisateurs du groupe techlog ont un accès limité au groupe d'appareils Windows PC.
  • Resultat : OK

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-24-06

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-24-32

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2010-25-01

Nous allons lancer le client sur Windows 10 en tant que simple utilisateur puis exécuter le programme et non l'installer.

Récupérez l'agent en cliquant sur "Ajouter un agent" au niveau du groupe d'appareils "Windows PC". Puis choisissez Windows et "Interactif seulement" au niveau du type d'installation.

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2012-11-10

Sur Windows, lancez le programme puis cliquez sur "Se connecter". Etant simple utilisateur, Windows vous demandera le mot de passe admin, cliquez alors sur "Non" et le client se connectera tout de même. Le client remontera alors sur la console centrale dans le groupe d'appareils attribué.

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2012-17-14

Note : l'agent MeshCrentral permet également d'ouvrir une session RDP.

Je pense que c'est une des options qui va me faire adopter MeshCentral : l'intégration d'un bouncer Crowdsec.

Sur le serveur Crowdsec

## Ajout du bouncer
# cscli bouncer add srv-meshcrentral
Api key for 'srv-meshcentral':

   CLÉ_À_COPIER

Please keep this key since you will not be able to retrieve it!

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2012-31-25

Sur le serveur MeshCentral

# sudo -i -u meshcentral
$ vim ~/meshcentral-data/config.json

{
  "$schema": "https://raw.githubusercontent.com/Ylianst/MeshCentral/master/meshcentral-config-schema.json",
  "__comment1__": "This is a simple configuration file, all values and sections that start with underscore (_) are ignored. Edit a section and remove the _ in front of the name. Refer to the user's guide for details.",
  "__comment2__": "See node_modules/meshcentral/sample-config-advanced.json for a more advanced example.",
  "settings": {
    "MongoDb": "mongodb://127.0.0.1:27017/meshcentral",
    "Cert": "mc.raspot.in",
    "AliasPort": 443,
    "Port": 4430,
    "RedirPort": 800,
    "AgentPong": 300,
    "TlsOffload": "ADRESSE IP DU REVERSE-PROXY",
    "crowdsec": {
      "url": "http://IP_SERVEUR_CROWDSEC:8080",
      "apiKey": "CLÉ_DU_BOUNCER",
      "fallbackRemediation": "captcha"
    }
  },
  "domains": {
  "": {
    "certUrl": "https://ADRESSE IP DU REVERSE-PROXY:443/"}
  }
}

$ exit

## Redémarrage de MeshCentral
# systemctl restart meshcentral

## On constate l'installation du bouncer 
# journalctl -f -u meshcentral.service 
Jul 21 10:30:02 SRV-MESHCENTRAL systemd[1]: meshcentral.service: Consumed 18.860s CPU time.
Jul 21 10:30:02 SRV-MESHCENTRAL systemd[1]: Started MeshCentral Server.
Jul 21 10:30:02 SRV-MESHCENTRAL node[719]: Installing @crowdsec/express-bouncer...
Jul 21 10:30:18 SRV-MESHCENTRAL .....

On constate la connexion sur le serveur Crowdsec :

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2012-31-39

Test blocage avec Captcha

Sur le serveur Crowdsec :

# cscli decisions add --ip 192.168.1.194 --type captcha

Ce qui donne sur le poste ayant l'IP bloquée :

Capture%20d%E2%80%99%C3%A9cran%20du%202023-07-21%2014-03-33

Pour débloquer l'IP sur le serveur Crowdsec :

# cscli decisions remove -i 192.168.1.194
INFO[21-07-2023 14:05:20] 1 decision(s) deleted

J'étais au départ rebuté par le côté old school de MeshCentral mais durant mon test je me suis laissé convaincre par ses multiples possibilités qui lui permettent de répondre à un large éventail de besoins. Je comprends au passage le choix de TacticalRMM de l'intégrer à sa solution RMM.

Parmi les autres possibilités intéressantes :

  • Authentification LDAP
  • SSO
  • Intégration avec des technologies modernes

Avec une courbe d'apprentissage relativement faible et une maintenance qui apparaît simple, cette solution semble très bien adaptée à l'auto-hébergement sans prise de tête ou compétences spécifiques.

Sources :

Article précédent Article suivant