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.