Guacamole simplifié pour petites structures

contact


Si vous souhaitez me remonter des informations, ne pas hésiter

contact

Intro


Guacamole est un produit qui va se situer entre vos serveurs et les personnes souhaitant y accéder (en général les prestataires), toutes les connexions seront loguer et les sessions pourront être enregistrées si vous le souhaitez. Le choix le plus judicieux est de le rendre accessible via VPN uniquement.
Pourquoi depuis des VPN ? Si le serveur est en accès direct sur internet et qu'il se fait compromettre. Vous risquez de mettre en péril votre infrastructure.

Le mieux serait de faire comme cela

  • Mettre en place des VPN avec des sous réseaux différents pour chaque prestataire ainsi que la double authentification (si possible). Depuis les VPN vous n'autorisez l'accès qu'à guacamole (donc guacamole doit être sur un réseau à part)
  • Créez des ACL permettant à Guacamole d'accéder à tous les serveurs dont les prestataires ont besoin, ne donnez pas l'accès à tout le réseau (sinon c'est inutile de mettre en place guacamole, car vous créez un trou de sécurité)

En image

Structure guacamole

Détail du produit mis en place


Comme je l'indique dans le titre, la version que nous allons mettre en place est rudimentaire, tout s'effectue depuis le terminal

  • Création des utilisateurs et mot de passe + attribution des machines
  • Visualisation de log de connexion aux machines
  • Visionnage des sessions d'enregistrement de texte (SSH uniquement) et conversion des vidéos d'enregistrement (Session graphique)

L'avantage de cette version, c'est sa légèreté est qu'elle et simplifiée, pas de MYSQL ni de plug-in (la plupart des plug-in fonctionnent conjointement avec une base de données)
L'entretien est plus simple et il n'y a que 2 fichiers à sauvegarder, celui des utilisateurs et le fichier de configuration de guacamole

La version par excellence pour des infrastructures de quelques serveurs, ou si les prestataires n'ont besoin de se connecter qu'à très peu de serveurs

Mise en place de Guacamole (debian 10)


Avant d'expliquer comment mettre en place guacamole, je vous recommande d'effectuer les étapes suivantes durant l'installation de l'OS

  • Chiffrer le disque de votre OS (demande de mot de passe au démarrage du GRUB), en cas de vol de la machine, les données sensibles seront préservées (fichiers de configuration, logs et éventuellement les vidéos des sessions si vous ne souhaitez pas les mettre sur un disque séparé), cela vous obligera à entrer le mot de passe à chaque démarrage
  • Crée ou ajouter un second disque chiffré pour stocker toutes les sessions vidéos et sessions d'enregistrement de textes des prestataires (recommandés)

Les vidéos et sessions d'enregistrement de texte ne sont pas volumineux, seules les vidéos après l'encodage prennent de la place.

Session d'enregistrement de texte ? elle sert lors de l'enregistrement d'une connexion SSH, elle crée deux fichiers.

  • 1 fichier texte avec tout le texte entré lors de la session.
  • 1 fichier de temps qui permet de vous présenter la session t-elle qu'elle s'est déroulée

ATTENTION j'ai vu avec la CNIL concernant les règles de stockage et de conservation des vidéos, il m'ont indiqué que ce sont les même règle que pour le reste (RGPD).

Du coup, il faut :

  • indiquer sur vos contrats que vous enregistrez les connexions aux serveurs
  • indiquer le temps de rétention des vidéos, il faut que ce ne soit pas abusif
  • sécuriser les données (d'où mon conseil sur le chiffrement du ou des disques)
  • indiquer pour quelle raison vous faites cela (questions de sécurité)

Si il manque quelque chose n'hésitez pas a me le soumettre par mail, je modifierai

Installation de Guacamole


Pour l'installation, nous allons utiliser le script présent sur le github de MysticRyuujin, il ne fonctionne qu'avec les distributions basées sur Debian (Debian, Ubuntu, Kali)
Si vous utilisez une distribution différente, suivez le script et cherchez les équivalents des paquets installés pour votre distribution

Allez sur Script d'installation

  • Cliquez sur le fichier guac-install-server.sh
  • Dans la fenêtre du code en haut à droite, cliquez sur raw
  • Le code va apparaitre dans une fenêtre. Copier l'URL

Télécharger le script d'installation minimale (coller le lien)

wget https://raw.githubusercontent.com/MysticRyuujin/guac-install/master/guac-install-server.sh

Il faut être admin pour lancer certaines commandes, utilisées sudo ou passer admin avant de lancer les commandes comportant un dièze (#)
sudo commande
su - pour passer admin provisoirement
su -l root -c "votre commande" l'alternative pour ne pas rester connecté en root

Le script est simple, lisez le avant de le lancer, ne faites pas confiance

wget https://raw.githubusercontent.com/MysticRyuujin/guac-install/master/guac-install-server.sh

Donner les droits d'exécution sur le script

chmod u+x guac-install-server.sh

Avant de lancer le script, nous allons le modifier.
Cela permettra de choisir l'utilisateur qui exécutera Guacd. Permettant de sécuriser le service, mais aussi d'éviter les problèmes avec FREERDP, qui a besoin d'écrire dans le répertoire home de l'utilisateur (certificat client RDP et fichiers de configuration)

A la ligne 67, modifier la ligne ci-dessous

./configure --with-init-dir=/etc/init.d

Remplacé la par la ligne ci-dessous

./configure --with-systemd-dir=/etc/systemd/system

On remplace l'antique init.d par systemd

Lancez le script après l'avoir vérifié

# ./guac-install-server.sh

Sur Debian 10.7, j'ai rencontré un problème lors de l'installation avec la version 1.3.0 de guacamole (voir rubrique Problèmes / Problèmes lors du lancement du script)

Attendez la fin de l'installation, si vous n'avez pas d'erreur continuez.
Dans le cas contraire, n'hésitez pas à me contacter en m'indiquant votre système ainsi que l'erreur rencontrée (screen si possible)
J'ajouterai les solutions dans la rubrique problèmes

Normalement vous avez le dossier /etc/guacamole qui s'est créé avec le fichier guacd.conf présent dedans

Installation de Tomcat et configuration


Nous allons avoir besoin de Tomcat pour lancer l'application web de guacamole permettant au prestataire de se connecter au serveur via une page web (Html5)

Tomcat contient un serveur web comme apache, mais il est fait pour exécuter des applications Java

Commençons par chercher la version disponible dans les dépôts APT

apt search tomcat

Vous devriez avoir TomcatX, X étant la version
Actuellement nous sommes en version 9

Installons le paquet

apt install tomcat9

Tomcat installé, nous allons ajouter l'application java de Guacamole dans les webapps de Tomcat

  • Télécharger l'application sur le site de Guacamole, pour cela allez sur https://guacamole.apache.org
  • Allez dans la rubrique download en haut à droite
  • Vous avez un tableau avec les versions, l'actuelle est la 1.3.0 cliquer sur la dernière version
  • Faites un clic droit sur guacamole-1.3.0.war et copiez le lien

Allez dans le terminal SSH de votre serveur et entrez la commande

curl -SLO "http://apache.org/dyn/closer.cgi?action=download&filename=guacamole/1.3.0/binary/guacamole-1.3.0.war"

Voici l'explication des options CURL

  • S affichent les erreurs
  • L suit les redirections pour télécharger le fichier final
  • O garde le nom proposé lors du téléchargement

Nous allons copier le fichier sans l'indication de version dans le dossier /etc/guacamole/

cp guacamole-1.3.0.war /etc/guacamole/guacamole.war

Puis faire un lien symbolique vers le dossier webapps de tomcat

ln -sf /etc/guacamole/guacamole.war /var/lib/tomcat9/webapps/

Le but étant d'avoir tous les fichiers au même endroit /etc/guacamole et de créer un lien symbolique vers le dossier webapps de Tomcat
J'ai mis le nom guacamole au lieu de guacamole-1.3.0.war, cela permet de taper dans le navigateur http://IP:8080/guacamole au lieu de http://IP:8080/guacamole-1.3.0
J'aurais pu créer un lien symbolique de /etc/guacamole/guacamole-1.3.0.war vers /var/lib/tomcat9/webapps/guacamole.war mais en cas de mise à jour, je serais obligé de refaire le lien symbolique

Si vous cherchez la version, il vous suffit de regarder en bas à droite de la page web de connexion à guacamole.

Nous allons restart Tomcat pour qu'il prenne en compte l'ajout de l'application Java

systemctl restart tomcat9

Entrez la commande suivante dans le terminal, pour avoir l'IP du serveur

ip a

Avec votre navigateur, entrez la valeur suivante en remplaçant IP par l'IP trouvée avec la commande ci-dessus
IP:8080/guacamole

Vous devriez avoir la page de connexion à Guacamole

Configuration du fichier principal de guacamole


Allez dans le répertoire de guacamole

cd /etc/guacamole

Crée le fichier de configuration principal

touch guacamole.properties

Modifions-le pour ajouter les informations permettant de l'utiliser comme on le souhaite

nano guacamole.properties

Voici les options principales

available-languages: fr, en
guacd-hostname: localhost 
guacd-port:     4822
basic-user-mapping: /etc/guacamole/user-mapping.xml

available-languages: fr, en cette ligne indique les langues disponibles depuis l'interface, gardez l'anglais (cela permet d'avoir les mots en anglais, si il non pas été traduit en français). Par défaut toutes les langues sont disponibles
guacd-hostname: localhost Indique ou se situe le serveur guacd. La valeur par défaut de cette ligne est localhost , si vous ne la changez pas, inutile de garder la ligne dans le fichier de configuration
guacd-port: 4822 indique le port de connexion. le port par défaut est 4822, si vous ne la changez pas, inutile de garder la ligne dans le fichier de configuration
basic-user-mapping: /etc/guacamole/user-mapping.xml indique ou se trouve le fichier des connexions utilisateur - serveur

Un fichier avec une config par défaut ressemblerait à cela

basic-user-mapping: /etc/guacamole/user-mapping.xml

Création des utilisateurs et accès aux machines


Crée le fichier de configuration des utilisateurs - serveurs

touch /etc/guacamole/user-mapping.xml

Allez dans le fichier de configuration des utilisateurs et serveurs (vide pour le moment)

nano /etc/guacamole/user-mapping.xml

Voici à quoi il peut ressembler avec un minimum d'informations

Attention, concernant le RDP vous pouvez rencontrer des difficultés pour vous connectez aux serveurs Windows. Si c'est le cas, suivez les instructions dans la rubrique Problèmes / Problèmes lors du lancement de session RDP ( tout en bas de la page)

<user-mapping>
    <authorize username="test" password="098f6bcd4621d373cade4e832627b4f6" encoding="md5" >
        <connection name="WinDC1">
            <protocol>rdp</protocol>
            <param name="hostname">192.168.1.52</param>
            <param name="username">${GUAC_USERNAME}</param>
            <param name="password">${GUAC_PASSWORD} </param>
            <param name="ignore-cert">true</param>
            <param name="domain">MonDomaine.lan</param>
        </connection>    
    </authorize>
</user-mapping>

Nous allons commencer par convertir le mot de passe en md5, pour cela utiliser la commande suivante

echo -n "mot de passe" | openssl dgst -md5 | sed 's/(stdin)= //g'

Ou

echo -n "mot de passe"|md5sum 

pour la deuxième commande copier le résultat sans les espaces et le tiret et coller le dans password="" de la ligne ci-dessous

ATTENTION seul le MD5 est supporté pour le moment, des demandes ont été faites pour ajouter le SHA512.
MD5 n'étant pas un algorithme très fiable, prenez en compte cela avant de faire vos choix (utilisation de compte AD et/ou utilisation des comptes locaux sur les serveurs sensibles, vue plus bas)

<authorize username="test" password="098f6bcd4621d373cade4e832627b4f6" encoding="md5" >

Nous allons définir un nom pour la connexion à une machine, je l'ai nommé WinDC1

<connection name="WinDC1">
</connection>

Ajoutons le paramétrage de cette connexion

<protocol>rdp</protocol>
<param name="hostname">192.168.1.52</param>
<param name="port">3389</param>
<param name="ignore-cert">true</param>
<param name="username"></param>
<param name="password"></param>

1 C'est du Windows nous allons définir le protocole RDP
2 Indiquer le nom d'hôte ou l'IP dans notre cas ca sera 192.168.1.52
3 Indiquer le port s'il est différent de celui par défaut, sinon vous pouvez supprimer cette ligne
4 Cela permet de ne pas vérifier le certificat (évite les erreurs liées aux certificats autosignés)
5 plusieurs façons d'indiquer le nom de l'utilisateur

  • Ne rien mettre. Lors de l'ouverture de la session, il sera demandé à l'utilisateur son identifiant et mot de passe.
  • Indiquer un nom et un mot de passe (pas très sécure), l'utilisateur sera connecté automatiquement
  • Mettre dans username ${GUAC_USERNAME} et dans password ${GUAC_PASSWORD} (exemple ci-dessous)

Dans le dernier cas ce sont les identifiants avec lequel votre prestataire se sera connecté à guacamole qui seront utilisés pour se connecter au serveur.

Attention cela vous oblige à créer un utilisateur avec les mêmes identifiants sur votre serveur que ceux définis dans la ligne ci-dessous (présentés dans le fichier /etc/guacamole/user-mapping.xml)

<authorize username="test" password="098f6bcd4621d373cade4e832627b4f6" encoding="md5" >

Donc dans le dernier cas cité au-dessus, vous aurez créé un utilisateur test avec le mot de passe test sur votre serveur Windows (c'est un exemple)

Si votre serveur est sur un domaine et que vous utilisez les valeurs ${GUAC_USERNAME} et ${GUAC_PASSWORD}. Il faudra créer l'utilisateur test avec le mot de passe test sur l'AD (ceci est un exemple). Dans ce cas, ajouter l'option ci-dessous au serveur que vous configurez.

<param name="domain">MonDomaine.lan</param>

Cela représente un risque pour la sécurité de votre AD à cause du chiffrement du mot de passe de l'utilisateur en MD5 dans le fichier user-mapping.xml

Exemples de fichiers de configuration


<user-mapping>
    <authorize username="test" password="098f6bcd4621d373cade4e832627b4f6" encoding="md5" >
        <!-- First authorized connection -->
        <connection name="localhost">
            <protocol>ssh</protocol>
            <param name="hostname">localhost</param>
            <param name="port">22</param>
            <param name="username">${GUAC_USERNAME}</param>
            <param name="password">${GUAC_PASSWORD}</param>
            <param name="create-typescript-path">true</param>
            <param name="typescript-path">/recording/ssh.localhost</param>
            <param name="enable-sftp">true</param>
            <param name="sftp-root-directory">/home/${GUAC_USERNAME}</param>
        </connection>

        <!-- Second authorized connection -->
        <connection name="otherhost">
            <protocol>vnc</protocol>
            <param name="hostname">otherhost</param>
            <param name="port">5900</param>
            <param name="password">VNCPASS</param>
        </connection>

        <connection name="WinDC1">
            <protocol>rdp</protocol>
            <param name="hostname">192.168.1.52</param>
            <param name="username">${GUAC_USERNAME}</param>
            <param name="password">${GUAC_PASSWORD} </param>
            <param name="domain">MonDomaine.lan</param>
        </connection>    

    </authorize>
</user-mapping>

Explication de certaines options

<param name="create-typescript-path">true</param>
<param name="typescript-path">/recording/ssh.localhost</param>
<param name="enable-sftp">true</param>
<param name="sftp-root-directory">/home/yoann</param>

create-typescript-path crée le chemin à partir de l'emplacement indiqué (Il faudra créer le répertoire racine que vous indiquez)
typescript-path vous indiquez le chemin ou il enregistrera les fichiers
enable-sftp autorisez l'envoi et la réception de fichiers (vous pouvez personnaliser les autorisations d'envoi et de téléchargement avec les options suivantes sftp-disable-download et sftp-disable-upload)
sftp-root-directory indique où sera situé le sftp lors de l'ouverture du client

Ne vous limitez pas aux options citées dans ma documentation. Cliquez sur le lien qui suit et peaufiner vos règles avec les autres options disponibles dans la documentation de guacamole Option protocole guacamole.

Utilisation de Guacamole


L'utilisation de guacamole est assez simple, une fois entrez dans la session, sélectionnée le serveur auquel vous souhaitez vous connecter.

Pour éviter les répétitions, je vais l'ensemble de touches suivantes, ainsi dès que vous verrez ce mot, il faudra appuyer simultanément sur CTRL + ALT + MAJ (les trois touches de gauche)
CTRL + ALT + MAJ = CAM

Après vous être connecté à guacamole et avoir sélectionné votre serveur, tapez sur CAM, une fenêtre apparaît sur la gauche de l'écran

Détaille des options de l'interface


Je vais vous présenter les deux options les plus importantes, n'oublier pas la documentation guacamole pourra vous aider

Presse papier

Le presse papier sert au copier-coller entre le serveur et la page web.

De la page web vers le serveur

collez votre texte dans le formulaire en dessous du mot presse papier, puis appuyez sur CAM, la fenêtre se referme

  • dans le terminal SSH faite un clique droit, le texte collé dans le formulaire apparait dans le terminal
  • Sous Windows, faites un clic droit puis coller

Du serveur vers la page web

SSH

  • Sélectionnez le texte à copier dans le terminal
  • Appuyer sur CAM
  • le texte apparait dans le formulaire

RDP

  • Copier le texte avec le clic droit de la souris puis copier
  • Appuyer sur CAM
  • le texte apparait dans le formulaire

Appareil (SFTP)


Le SFTP vous permet de faire du transfert de fichier entre votre ordinateur et le serveur (dans le cas ou vous l'avez autorisé sur le serveur dans le fichier user-mapping)
Suivant le répertoire source que vous avez indiqué, l'utilisateur ne se trouvera pas au même endroit, les retours en arrière ne sont pas possibles pour l'utilisateur
Si vous avez défini /home/user/ alors l'utilisateur ne pourra pas aller dans /home ni dans / ou /etc

A savoir, le client SFTP hérite des droits de l'utilisateur lors de la connexion, donc si dans le terminal vous passer admin, le SFTP ne passera pas administrateur

Télécharger depuis le serveur LINUX (SSH)

  • cliquez sur la petite case en dessous d'appareils
  • Allez dans le répertoire ou se situe le fichier à télécharger
  • Double cliquez sur le fichier que vous souhaitez télécharger

Envoyer vers le serveur Linux (SSH)

  • Cliquez sur la petite case en dessous d'appareils
  • Cliquez sur Envoyer fichiers en haut à côté de retour

Envoyer et recevoir depuis Windows (RDP)

Pour Windows le stockage des fichiers se fera sur le serveur guacamole contrairement au serveur LINUX qui recevra directement le fichier.
Lors de l'ajout des options enable-drive, drive-name, drive-path, create-drive-path dans le fichier user-mapping du serveur souhaitez, il faudra indiquer le chemin (drive-path) ou seront stockés les fichiers sur le serveur guacamole (Ex : /var/storage/WinDC1).
Puis guacamole montera un lecteur réseau (drive-name) (Ex: G:) sur le serveur Windows, qui l'amènera dans le dossier configuré avec drive-path (/var/storage/WinDC1)

Concernant le fonctionnement d'envois et de réceptions de fichiers, ce sont les mêmes que pour Linux

problèmes

problèmes lors du lancement du script


Lors du lancement du script, vous pouvez avoir le message suivant qui empêchera l'installation de guacd

   You are building against a development version of FreeRDP. Non-release
   versions of FreeRDP may have differences in behavior that are impossible to
   check for at build time. This may result in memory leaks or other strange
   behavior.

   *** PLEASE USE A RELEASED VERSION OF FREERDP IF POSSIBLE ***

   If you are ABSOLUTELY CERTAIN that building against this version of FreeRDP
   is OK, rerun configure with the --enable-allow-freerdp-snapshots

La version que vous avez installée de freerdp2-dev n'est pas la bonne. Vous avez surement installé une ancienne version alors qu'il faut la dernière.
C'est normal, la distribution Debian ne met pas les dernières versions des paquets, cela évite les problèmes de beug ou risque de sécurité
Pour remédier à cela, suivez les étapes suivantes

Pour cela, allez dans le fichier source.list de apt

nano /etc/apt/source.list

Ajouter un # devant cette ligne
deb http://deb.debian.org/debian buster main

Ajouter la ligne suivante en dessous
deb http://deb.debian.org/debian buster-backports main

Enregistrer et quitter le fichier

Dans le terminal, entrez les lignes suivantes

apt update
apt install freerdp2-dev -y

-y valide l'installation du paquet sans interaction de votre part

Normalement il va indiquer qu'il y a une mise à jour de disponible et l'installer

Retourner dans le fichier source.list

nano /etc/apt/source.list

mettre en commentaire en ajoutant un # devant la ligne suivante
deb http://deb.debian.org/debian buster-backports main

et enlever le # devant la ligne suivante
deb http://deb.debian.org/debian buster main

Dans le terminal, entrer la commande suivante

apt update

C'est important de remettre la ligne par défaut pour garder un système stable, mais vous ne recevrez plus les dernières mises à jour de Freerdp
Attention, si vous laissez la ligne backport, vous pouvez rencontrer un problème de dépendance lors de l'installation de tomcat9. c'est aussi pour cela qu'il faut remettre la ligne par défaut, après l'installation de la dernière version de FREERDP.

Relancer le script d'installation, normalement le message aura disparu et guacd sera installé

problèmes lors du lancement de session RDP


Quand vous lancez votre session RDP entrer la commande ci-dessous dans le terminal du serveur guacamole

tail -f /var/log/syslog

Vous devriez avoir ce type d'erreur

FreeRDP initialization may fail: The current user's home directory ("/usr/sbin") is not writable, but FreeRDP generally requires a writable home directory for storage of configuration files and certificates.
WARNING:#011FreeRDP initialization may fail: The current user's home directory ("/usr/sbin") is not writable, but FreeRDP generally requires a writable home directory for storage of configuration files and certificates.

Vous pouvez aussi trouver cette ligne dans catalina.out de Tomcat après avoir été déconnecté immédiatement lors de la connexion
disconnected (0 users remain)

Le problème vient du fait que Guacd n'a pas le droit d'écrire dans le dossier home de l'utilisateur qui le lance, dans notre cas l'utilisateur par défaut est daemon et son répertoire home et /usr/sbin (si vous avez installé guacamole avec systemd au lieu de init.d)

Pour éviter de modifier les droits de ce dossier, nous allons créer un utilisateur, mais aussi l'ajouter au groupe Tomcat. Ce qui permettra à guacd d'avoir les accès au répertoire de Tomcat pour effectuer les connexions aux serveurs depuis l'interface web

Créer un utilisateur

useradd --disabled-login --disabled-password guacd

Ajoutez l'utilisateur au groupe Tomcat

useradd guacd tomcat

Allez dans le fichier qui gère le service

nano /etc/systemd/system/guacd.service

modifier la ligne suivante
User=daemon

Par la ligne suivante
User=guacd

Enregistrer le fichier puis quitter

Entrez la commande suivante dans le terminal

systemctl daemon-reload

Redémarrez les services Tomcat et Guacd

systemctl restart guacd tomcat9

Refaites un essai, tout devrait fonctionner

SOURCES


https://guacamole.apache.org/doc/gug/
http://apache-guacamole-general-user-mailing-list.2363388.n4.nabble.com/Guacamole-v1-3-0-FreeRDP-v2-0-0-Debian-10-td9889.html#a9894
https://github.com/MysticRyuujin/guac-install