Guacamole : Serveur de connexion à distance
Qu’est-ce que Guacamole ?
Apache Guacamole de son vrai nom est une solution Open Source gratuite qui permet de mettre en place des accès à distance à travers un portail Web sur différents équipements.
Les différents protocoles supportés sont :
- RDP
- SSH
- Telnet
- VNC
Il est possible à travers le portail Web de gérer plusieurs utilisateurs et connexions, de les regrouper dans des groupes, de configurer des contraintes d’accès (horaire, nombre de connexions, …) et d’enregistrer les sessions en vidéo.
Ainsi avec guacamole, il est possible d'avoir accès à son ordinateur à distance via son navigateur par exemple.
De quoi est composé Guacamole ?
Voici tout d'abord un petit diagramme résumant tout cela :
Apache Guacamole comprend 2 composants principaux :
- Guacamole Server : Cela fournit tous les composants côté serveur et natifs requis par Guacamole pour se connecter à des ordinateurs de bureau distants.
- Guacamole Client : Il s’agit d’une application Web HTML 5 et d’un client qui vous permet de vous connecter à vos serveurs/ordinateurs de bureau distants. Ceci est soutenu par le serveur Tomcat.
Installation de Guacamole-Server
Installation des prérequis
Je fais cette installation sur un serveur Debian 11, mais si vous utilisez unr distribution telle que Ubuntu par exemple, il ne devrait pas y avoir de grosses différences.
Tout d'abord, on va devoir compiler Guacamole, on aura donc besoin de make :
sudo apt install make -y
Puis les prérequis suivants :
sudo apt install gcc g++ libcairo2-dev libjpeg-turbo8-dev libpng-dev libtool-bin libossp-uuid-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev freerdp2-dev libpango1.0-dev libssh2-1-dev libvncserver-dev libtelnet-dev libssl-dev libvorbis-dev libwebp-dev libpango1.0-dev libwebsockets-dev libpulse-dev -y
Si jamais vous avez un problème avec le paquet "libjpeg-turbo8-dev" :
Remplacez le par "libjpeg62-turbo-dev" et ça devrait fonctionner normalement.
Installation de Guacamole-Server
On commence l'installation du premier composant essentiel
Au moment ou je rédige, la dernière version disponible est la 1.4.0
On télécharge l'archive sur le serveur :
wget https://downloads.apache.org/guacamole/1.4.0/source/guacamole-server-1.4.0.tar.gz
On décompresse l'archive :
tar xvf guacamole-server-1.4.0.tar.gz
On va dans le dossier qui vient d'être décompressé :
cd guacamole-server-1.4.0/
On vérifie que toutes les dépendances nécessaires sont installées sur le serveur à l’aide de configure :
sudo ./configure --with-init-dir=/etc/init.d
S'il n'y a pas de soucis, vous devriez globalement avoir que des yes :
Maintenant on va compiler puis installer Guacamole-Server :
sudo make
On passe à l'installation :
sudo make install
On créer les différents liens avec les librairies :
sudo ldconfig
On active le service de Guacamole :
sudo systemctl enable guacd
Puis on démarre le service :
sudo systemctl start guacd
Et enfin on vérifie bien que le service est actif :
systemctl status guacd
Installation de Guacamole-Client
Installation
Ici, on va installer le client qui nous fournie l'interface HTML5 et pour cela, on a besoin de Tomcat.
sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user -y
Vérifions que le serveur Tomcat fonctionne :
systemctl status tomcat9
On créer un dossier où l'on va stocker la configuration et le client :
sudo mkdir /etc/guacamole
Maintenant on va télécharger le client et le stocker dans le dossier que l’on vient de créer :
sudo wget https://downloads.apache.org/guacamole/1.4.0/binary/guacamole-1.4.0.war -O /etc/guacamole/guacamole.war
Maintenant, on va devoir créer un lien symbolique vers Tomcat9 WebApps pour « activer l’utilisation du client » :
sudo ln -s /etc/guacamole/guacamole.war /var/lib/tomcat9/webapps/
Et enfin, pour que l'application soit totalement déployée, on va redémarrer les services :
sudo systemctl restart tomcat9
sudo systemctl restart guacd
Normalement, vous devriez avoir accès à la page d'authentification en vous rendant sur la page http://IP_SERVER:8080/guacamole
Configuration Guacamole-Server|Client
Configuration du serveur
On a installé tous les principaux services, il faut maintenant les configurer et faire en sorte qu'ils fonctionnent tous ensemble.
On créer les dossiers extensions
et lib
dans le dossier /etc/guacamole :
sudo mkdir /etc/guacamole/{extensions,lib}
On rajoute la variable d'environnement de Guacamole :
sudo echo "GUACAMOLE_HOME=/etc/guacamole" /etc/default/tomcat9
On va installer un gestionnaire de base de données SQL, car c'est par lui qu'on gérera l'authentification des utilisateurs. Vous pouvez installer MySQL ou MariaDB.
sudo apt install mariadb-server mariadb-client
On va créer un utilisateur et la base de données, on commence tout d'abord par se connecter au serveur de base de données :
sudo mysql
Il faudra exécuter la requête ci-dessous. Vous pouvez changer le nom d'utilisateur, mais surtout le mot de passe bien évidement et sécurisé si possible ;)
CREATE DATABASE guacamole_db;
CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'P@$sW0rd';
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
FLUSH PRIVILEGES;
quit;
Télécharger l’extension mysql pour Guacamole :
wget https://dlcdn.apache.org/guacamole/1.4.0/binary/guacamole-auth-jdbc-1.4.0.tar.gz
Décompresser l’archive :
tar vfx guacamole-auth-jdbc-1.4.0.tar.gz
Ajouter les tables nécessaires dans la base de donnée créée :
cat guacamole-auth-jdbc-1.4.0/mysql/schema/*.sql | sudo mysql guacamole_db
Installation de l'extension :
sudo cp guacamole-auth-jdbc-1.4.0/mysql/guacamole-auth-jdbc-mysql-1.4.0.jar /etc/guacamole/extensions/
Télécharger le driver JDBC :
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.28.tar.gz
Décompresser l’archive :
tar xvzf mysql-connector-java-8.0.28.tar.gz
Installer le driver pour Guacamole :
sudo cp mysql-connector-java-8.0.28/mysql-connector-java-8.0.28.jar /etc/guacamole/lib/
Configuration du client
On passe désormais à la configuration du client pour utiliser la base de données.
Tout d'abord, on crée le fichier de configuration :
sudo nano /etc/guacamole/guacamole.properties
Ici, on va ajouter la configuration en l'adaptant à notre environnement MySQL :
De base pour le guacd-hostname, j'avais mis localhost, mais il se trouve que cela forcait guacd à chercher mon interface IPv6 au lieu de IPv4, ce qui faisait que quand j'essayais de me connecter aux différentes sessions plus tard, ça ne fonctionnait pas. J'ai donc choisi de mettre directement en 127.0.0.1 pour régler potentiellement ce soucis même si au final ça revient à la même.
# Hostname et port du serveur Guacamole
guacd-hostname: 127.0.0.1
guacd-port: 4822
# MySQL properties
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: P@$sW0rd
Finalement la manip du guacd-hostname n'aura pas suffit, il a fallut aussi que je créer un fichier guacd.conf ou j'indique l'adresse de mon localhost en IPv4 pour que ça fonctionne.
On peut voir la différence avant/après la modif grâce à netstat -ntpl
Après cela, mes connexions ont bien pu se lancer :
sudo nano /etc/guacamole/guacd.conf
Rajouter ceci dans le fichier et enregistrez :
[server]
bind_host = 127.0.0.1
La configuration est enfin terminée, on va maintenant lier le dossier de configuration à Tomcat :
sudo ln -s /etc/guacamole /usr/share/tomcat9/.guacamole
On redémarre les services :
sudo systemctl restart tomcat9
sudo systemctl restart guacd
Facultatif : on peut créer un dossier guacamole dans le dossier /var pour le stockage des enregistrements vidéos :
sudo mkdir /var/guacamole
L’installation et la configuration de base est terminée, nous allons maintenant voir comment utiliser Guacamole.
Utilisation
Nous allons voir comment utiliser Guacamole et le personnaliser
Utilisation de Guacamole
Pour rappel, pour accéder à Guacamole depuis un navigateur Web, aller à l’adresse : http://IP_SERVER:8080/guacamole
Les identifiants par défaut sont : guacadmin:guacadmin
Pour accéder à la configuration de Guacamole, il faut cliquer sur le nom de l'utilisateur puis paramètres.
Création de groupes de connexion
Il est bien évidemment possible de créer différents groupes et utilisateurs de connexion pour une gestion plus fine des accès aux différents modes de connexion.
Pour créer un groupe, depuis les paramètres, on se rend dans l'onglet groupe et on clique sur Nouveau groupe :
Ici, vous pourrez choisir le nom du groupe, les membres, les permissions, etc. :
Création d'utilisateurs :
Pour créer des utilisateurs, rendez-vous sur l'onglet utilisateurs et cliquez sur Nouvel utilisateur.
Vous pourrez renseigner ses informations personnels, ses permissions, les restrictions du compte, etc.
Création d'une connexion
On va maintenant passer à ce pourquoi on a monté ce serveur Guacamole, la création des connexions à distances. Il faut savoir que la création de connexions est assez souple, on peut très bien créer plusieurs connexions pour un seul même équipement, avec des règles différentes, etc. Par exemple, on peut très bien créer une connexion SSH et une connexion VNC vers le même équipement.
Pour créer une connexion, rendez-vous sur l'onglet Connexion et cliquez sur Nouvelle connexion.
Connexion RDP
Pour la création de la première connexion, je vais établir une connexion RDP vers mon PC.
Comme vous allez le voir, il y a beaucoup d'options de configurations. On va se concentrer sur les principales.
Choisissez le nom que vous voulez et sélectionnez le protocole RDP. Pour ce qui est du lieu, ça dépends des groupes de connexion que vous avez créés.
Vous pouvez définir le nombre de connexions simultanées maximum dans Limites de concurrences.
Dans la section Réseau, indiquez l'adresse IP de l'hôte et le port du RDP (3389) :
Dans la partie Authentification, on doit indiquer le compte auquel on veut se connecter ainsi que son mot de passe. Indiquez le nom de domaine s'il y a besoin.
Pour le mode de sécurité, choisissez "Négociation automatique" et cochez l'option "Ignorer le certificat du serveur" :
Encore une fois, vous verrez qu'il y a beaucoup d'options, mais comme dit précédemment, on se concentre sur l'essentiel, vous pourrez toujours les tester par vous-même plus tard.
Enfin, cette partie est facultative, mais je vous la présente si vous voulez enregistrer des vidéos des sessions.
Dans la section Enregistrement, définissez "/var/guacamole/" comme chemin d'enregistrement. Attention, il faudra au préalable avoir créé le dossier sur le serveur pour que cela fonctionne. Puis, choisissez un nom d'enregistrement pour les enregistrements.
Quand vous avez fini la configuration de la connexion, enregistrez-la.
Connexion SSH
Cette fois-ci, on va créer une connexion SSH. Comme pour le RDP, on va se concentrer sur l'essentiel.
Nommer la connexion et sélectionner le protocole SSH.
Dans la section Réseau, indiquez l'hôte et le port SSH (22).
Dans la partie Authentification, indiquer le couple utilisateur et mot de passe :
Enregistrez la connexion une fois la configuration finie.
Connexion VNC
Enfin, voici comment créer une connexion VNC. Pour la partie serveur VNC sur le client Windows, j'utilise TightVNC.
Nommer la connexion et sélectionner le protocole VNC :
Dans la section Réseau, indiquez l'hôte et le port VNC (5900).
Dans la partie Authentification, indiquez le mot de passe :
Enregistrez la connexion une fois la configuration finie.
Groupes de connexions
Les groupes de connexions permettent de regrouper plusieurs connexions dans des groupes, ce qui permet une gestion plus fine des accès. Par exemple, imaginons qu'il y a le même type de connexions que vous voulez affecter à différents prestataires, vous n'avez qu"a regroupé ces connexions dans un groupe de connexion que vous vous pourrez affecter à un utilisateur ou un groupe. Vous pourrez ainsi créer une arborescence complète de connexions.
Pour ce faire, dans l'onglet connexions, cliquez sur Nouveau groupe.
Choisissez le nom du groupe et l'emplacement racine. Pour le type, laissez-le en organisationnel. Vous pouvez aussi définir le nombre maximum de connexions à l'intérieur du groupe.
Enregistrez :
Affectation des connexions
Il faut faire attention. Pour qu'une connexion fonctionne, il faut d'abord qu'elle soit affecté à un utilisateur ou à un groupe, sinon ça ne fonctionnera pas !
Pour ce faire, allez dans l'onglet Utilisateurs/Groupes puis sélectionner l'utilisateur/groupe auquel vous voulez affecter une connexion. Je vais utiliser l'utilisateur client_test dans mon cas.
Tout en bas de la page, dans la section connexion, choisissez lesquels vous désirez affecter. Je vais tester celle en SSH. Puis enregistrez-les modifications.
Connexion
Nous allons maintenant voir comment nous connecter aux différentes connexions qu'on a créées précédemment.
SSH
Pour la connexion SSH, je vais utiliser l'utilisateur client_test. Tout d'abord on se connecte à l'interface de guacamole avec notre identifiant :
Si le compte n'a qu'une seule connexion d'affecté, elle s'établira automatiquement
Et voilà ! J'ai bien accès à mon serveur Debian en SSH via mon navigateur :)
Pour se déconnecter, c'est simple, appuyez sur Ctrl + D :
RDP
Pour la connexion en RDP, je vais utiliser l'administrateur de Guacamole, guacadmin :
On arrive sur la page d'accueil qui nous montre les connexions récentes et les connexions auquel on a accès. Je clique sur la connexion RDP PC_Home pour m'y connecter :
Et j'y ai bien accès ! Mais par contre comme on peut le voir il y a un petit souci. C'est tout simplement que dans mon cas, j'ai essayé de me connecter à distance directement depuis l'ordinateur sur lequel je veux avoir accès à distance. Bien évidemment, ça a créé un petit conflit ^^
Je vais donc essayer de m'y connecter depuis ma tablette par exemple :
C'est parfait, j'ai accès et je peux contrôler mon ordinateur Windows depuis ma tablette via un simple navigateur internet.
VNC
Pour la connexion en VNC, c'est encore guacadmin :
Je vais utiliser la connexion VNC_Windows :
Si jamais vous avez un problème de connexion VNC, il se peut que ce soit un problème de librairies non installés. J'ai pu découvrir ça en regarder les logs de guacd : sudo tail -f /var/log/syslog
Apr 22 21:09:00 debian-bobo guacd[1648]: Creating new client for protocol "vnc"
Apr 22 21:09:00 debian-bobo guacd[1648]: Connection ID is "$f38955e6-e551-4cfa-8735-bcf0d7666dd0"
Apr 22 21:09:00 debian-bobo guacd[6027]: Support for protocol "vnc" is not installed
Apr 22 21:09:00 debian-bobo guacd[1648]: Connection "$f38955e6-e551-4cfa-8735-bcf0d7666dd0" removed.
Si les librairies adéquates ne sont pas installés, il se peut que Guacamole ne supporte pas certains protocoles. J'ai donc installé la librairie adéquate pour du VNC et cela a fonctionné après : sudo apt install libvncserver-dev
N'oubliez pas de redémarrez tomcat et guacamole pour que les changements soient pris en compte.
Bien, j'ai accès à mon ordinateur Windows en VNC :)
Résumé
Nous avons vu ensemble comment configurer un serveur Guacamole pour gérer les différentes connexions à distances dans notre infrastructure. Bien évidemment, on a vu les bases, il y a beaucoup d'options et de choses à expérimenter, il faudra aussi évidemment améliorer la sécurité globale du serveur, mais pour une première prise en main et voir comment cela fonctionne, cela devrait suffire.
Subscribe to my newsletter
Read articles from Boris Tougma directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Boris Tougma
Boris Tougma
I'm a cybersecurity student who loves high-tech, but also music, cinema and Japanese culture.