Guacamole : Serveur de connexion à distance

Boris TougmaBoris Tougma
11 min read

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 :

guacamole_diagramme.png

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" :
libjpeg_error.jpg 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

wget_guacamole.jpg 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 :

.configure.jpg

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

status_guacd.jpg

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

status_tomcat.jpg 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

wget_client_guaca.jpg

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

connec_vide.png

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;

sql.jpg

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 netstat_guacd_bind.jpg 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

1er_connection.jpg

Pour accéder à la configuration de Guacamole, il faut cliquer sur le nom de l'utilisateur puis paramètres.

onglet_paramètres.png

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 :

groupe_1.jpg

Ici, vous pourrez choisir le nom du groupe, les membres, les permissions, etc. :

groupe_2.jpg

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.

user.jpg

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.

rdp_1.jpg

Dans la section Réseau, indiquez l'adresse IP de l'hôte et le port du RDP (3389) :

rdp_2.jpg

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

rdp_3.jpg

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.

rdp_4.jpg

Quand vous avez fini la configuration de la connexion, enregistrez-la.

connexions.jpg

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.

ssh_1.jpg

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 :

ssh_2.jpg

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 :

vnc_1.jpg

Dans la section Réseau, indiquez l'hôte et le port VNC (5900).

Dans la partie Authentification, indiquez le mot de passe :

vnc_2.jpg

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 :

groupe_connexions_1.jpg

groupe_connexions_2.jpg

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.

affectation_connexion.jpg

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

connec_client.jpg

Et voilà ! J'ai bien accès à mon serveur Debian en SSH via mon navigateur :)

accès_ssh.jpg

Pour se déconnecter, c'est simple, appuyez sur Ctrl + D :

accès_ssh_deco.jpg

RDP

Pour la connexion en RDP, je vais utiliser l'administrateur de Guacamole, guacadmin :

connect_guacadmin.jpg

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 :

acceuil.jpg

accès_rdp_conflit.jpg

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 :

rdp_tablette.jpg

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 :

connect_guacadmin.jpg

Je vais utiliser la connexion VNC_Windows :

liste_connection.jpg

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.

vnc_tablette.jpg

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.

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