Apache Guacamole est un bastion d’administration prennant en charge les protocoles SSH, RDP et VNC. Un bastion est utile car il va permettre de centraliser ses connexions (homelab entre autres), ce qui est pratique car il nous évite d’installer sur chaque appareil un client SSH, RDP ou VNC. Seuls prérequis seront un client Tailscale et un navigateur internet (car dans ce guide on va utiliser Tailscale pour y accéder en dehors de chez soi). On est pas obligé de forcément tout centraliser dans Guacamole du sens où seule les connexions SSH ne pourront se faire seulement que dans Guacamole pas en parallèle dans un terminal ou client autre que Guacamole mais cela reste tout de même possible.

Les fonctionnalités clés
- Centralisation et suivi des connexions : qui, quand, où, combien de temps, depuis où
- Aucun client lourd à installer, l’accès s’effectue en mode web grâce au HTML5
- Authentification multi-facteurs pour l’accès aux connexions, via un code TOTP
- Authentification SSO, compatible avec SAML, OpenID Connect, CAS ou encore LDAP
- Enregistrements vidéos des sessions, c’est-à-dire quand une connexion est en cours d’utilisation
- Gestion des autorisations pour l’accès aux connexions, par groupes ou par utilisateurs
Mise en place du serveur
Guacamole sera installé pour ma part dans une machine virtuelle sous Ubuntu Server 24.04 LTS. Sous Debian 12 ça fonctionne aussi et c’est globalement la même chose.
Au moment de rédiger cette documentation, je dédiais cette installation à Debian 13 mais au vu des difficultés rencontrées (soucis de compatibilité entre Guacamole et FreeRDP 3.x…) j’ai préféré utiliser Ubuntu Server 24.04 LTS.
Conditions d’installation
Dans mon cas à titre personnel Guacamole sera :
- Installé sur Ubuntu Server 24.04.4.1 LTS
- Installé en version 1.6.0 (dernière version au moment de rédiger ces lignes)
- Tomcat en version 10.1.16 et MariaDB 10.11.14
Installation des prérequis
On s’assure que le système est à jour et on installe les dépendances via cette commande là :
sudo apt update && sudo apt full-upgrade
sudo apt-get install -y build-essential libcairo2-dev libjpeg-turbo8-dev libpng-dev libtool-bin uuid-dev libossp-uuid-dev \
libvncserver-dev freerdp2-dev libssh2-1-dev libssl-dev libtelnet-dev libpango1.0-dev libwebsockets-dev \
libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libvorbis-dev libwebp-dev libpulse-dev \
tomcat10 mariadb-server nginx certbot tomcat-jakartaee-migration wget curl
Jusqu’ici le serveur n’est pas encore prêt car nous n’avons pas encore installé de serveur Tomcat (et on s’en occupera après).
Compilation du serveur
Il y a une partie serveur à installer et à compiler localement sur la machine.
cd /tmp
wget https://downloads.apache.org/guacamole/1.6.0/source/guacamole-server-1.6.0.tar.gz
A l’heure de rédiger ces lignes la dernière version est la 1.6.0. Toutefois cela peut changer. Pour être sur de télécharger la bonne version on se rend sur le site officiel de Guacamole.
Pour extraire le contenu du fichier compressé :
tar -xzf guacamole-server-1.6.0.tar.gz
cd guacamole-server-1.6.0/
Puis pour préparer la compilation :
sudo ./configure --with-systemd-dir=/etc/systemd/system/
Si la sortie ressemble à ça :
------------------------------------------------
guacamole-server version 1.6.0
------------------------------------------------
Library status:
freerdp ............. yes (2.x)
pango ............... yes
libavcodec .......... yes
libavformat ......... yes
libavutil ........... yes
libssh2 ............. yes
libssl .............. yes
libswscale .......... yes
libtelnet ........... yes
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ yes
VNC ........... yes
Services / tools:
guacd ...... yes
guacenc .... yes
guaclog .... yes
FreeRDP plugins: /usr/lib/x86_64-linux-gnu/freerdp2
Init scripts: no
Systemd units: /etc/systemd/system/
Type "make" to compile guacamole-server.
C’est que Guacamole est prêt pour être compilé. En revanche si dans le support des protocoles tout n’est pas en yes c’est qu’il manque des dépendances à installer.
On compile :
sudo make
Et on installe :
sudo make install
Si tout s’est bien passé avec succès, on peut en conclure que la partie serveur s’est bien installée. Mais ce n’est pas encore fini il nous reste encore d’autre choses à faire.
On va saisir cette commande qui va mettre à jour les liens entre guacamole-server et les librairies :
sudo ldconfig
Il est normal que cette commande retourne aucun résultat.
Ensuite, on va démarrer le service “guacd” correspondant à Guacamole et activer son démarrage automatique :
sudo systemctl daemon-reload
sudo systemctl enable --now guacd
On vérifie l’état de guacd :
sudo systemctl status guacd
Déployer l’application web Guacamole
L’application web est un fichier WAR qui exécute à l’intérieur un Tomcat, on va le télécharger :
cd /tmp
wget https://downloads.apache.org/guacamole/1.6.0/binary/guacamole-1.6.0.war
Sous Ubuntu 24.04, Tomcat 10 utilise l’espace de noms Jakarta EE au lieu de l’ancien espace de noms javax. Le fichier WAR de Guacamole utilisant toujours javax en interne, il doit être converti. Sans cette étape, vous obtiendrez une page blanche après la connexion. Le paquet tomcat-jakartaee-migration, que vous avez installé précédemment, fournit l’outil de conversion :
sudo javax2jakarta /tmp/guacamole-1.6.0.war /var/lib/tomcat10/webapps/guacamole.war
Redémarrer Tomcat pour déployer le WAR converti :
sudo systemctl restart tomcat10
Tomcat devrait décompresser le fichier WAR dans /var/lib/tomcat10/webapps/guacamole/ en quelques secondes.
Configurer MariaDB
Bien que Guacamole puisse utiliser un simple fichier XML pour la gestion des utilisateurs, l’utilisation d’une base de données en arrière-plan est préférable pour un environnement de production. Cette solution offre une gestion des utilisateurs via l’interface web, le regroupement des connexions ainsi que l’historique des sessions.
Commencez par créer la base de données et l’utilisateur :
sudo mysql -e "CREATE DATABASE guacamole_db CHARACTER SET utf8mb4;"
sudo mysql -e "CREATE USER 'guacamole_user'@'localhost' IDENTIFIED BY 'MonMotDePasseSuperFort';"
sudo mysql -e "GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"
⚠ Remplacez bien
MonMotDePasseSuperFortpar un mot de passe robuste si cette instance sera mise en production.
Ensuite, on va télécharger l’extension d’authentification JDBC :
cd /tmp
wget https://downloads.apache.org/guacamole/1.6.0/binary/guacamole-auth-jdbc-1.6.0.tar.gz
tar -xzf guacamole-auth-jdbc-1.6.0.tar.gz
Importez le schéma MySQL dans la base de données :
cat /tmp/guacamole-auth-jdbc-1.6.0/mysql/schema/*.sql | sudo mysql guacamole_db
Créez le répertoire des extensions Guacamole et convertissez le fichier JAR JDBC vers l’espace de noms Jakarta :
sudo mkdir -p /etc/guacamole/extensions
sudo javax2jakarta /tmp/guacamole-auth-jdbc-1.6.0/mysql/guacamole-auth-jdbc-mysql-1.6.0.jar /etc/guacamole/extensions/guacamole-auth-jdbc-mysql-1.6.0.jar
Le fichier JAR JDBC nécessite également la conversion javax-vers-jakarta, car il s’exécute au sein de Tomcat 10. Omettre cette étape entraîne des échecs d’authentification.
Téléchargez maintenant le pilote MySQL Connector/J pour permettre à Guacamole de communiquer avec MariaDB :
sudo mkdir -p /etc/guacamole/lib
cd /tmp
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-9.2.0.tar.gz
tar -xzf mysql-connector-j-9.2.0.tar.gz
sudo cp mysql-connector-j-9.2.0/mysql-connector-j-9.2.0.jar /etc/guacamole/lib/
MySQL Connector/J 9.2.0 fonctionne aussi bien avec MySQL qu’avec MariaDB.
Configurer guacamole.properties
Guacamole lit sa configuration principale dans le fichier /etc/guacamole/guacamole.properties. Ce fichier indique à l’application web où trouver guacd et quelle base de données utiliser pour l’authentification.
echo "guacd-hostname: localhost
guacd-port: 4822
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: MonMotDePasseSuperFort
mysql-auto-create-accounts: true" | sudo tee /etc/guacamole/guacamole.properties
Utilisez le même mot de passe que celui défini lors de la création de l’utilisateur MariaDB.
Restreignez les permissions du fichier, car il contient un mot de passe de base de données :
sudo chmod 600 /etc/guacamole/guacamole.properties
sudo chown tomcat:tomcat /etc/guacamole/guacamole.properties
Créez un lien vers le répertoire d’accueil de Guacamole afin que Tomcat puisse le trouver :
sudo ln -sf /etc/guacamole /var/lib/tomcat10/.guacamole
Redémarrez Tomcat pour prendre en compte la nouvelle configuration :
sudo systemctl restart tomcat10
A partir de cet instant là Guacamole est accessible dans le navigateur via le port 8080 mais seulement si on ajoute /guacamole à la fin de l’URL. On peut mettre Guacamole derrière un reverse proxy pour pouvoir afficher normalement Guacamole sans à ajouter /guacamole à chaque fois et éventuellement si il est exposé sur Internet lui attribuer un certificat SSL.
Bonus : mettre Guacamole derrière un reverse proxy avec certificat SSL
Vous pouvez passer cette étape si vous ne souhaitez pas exposer Guacamole via un nom de domaine ou bien tout simplement que vous n’en possédez pas un. Si vous souhaitez tout de même y accéder en dehors de votre réseau local vous pouvez utiliser Tailscale.
On installe nginx via :
sudo apt install nginx
Exécuter Guacamole derrière Nginx avec un certificat SSL permet de bénéficier de connexions chiffrées et de le rendre accessible via une URL propre, sans le suffixe de chemin “/guacamole”. Commencez par obtenir un certificat Let’s Encrypt via cette commande :
sudo certbot certonly --standalone -d guacamole.domaine.fr --non-interactive --agree-tos -m mail@domaine.fr
Remplacez guacamole.domaine.fr par votre véritable nom de domaine. Certbot a besoin que le port 80 soit libre donc par conséquent, arrêtez temporairement Nginx s’il est déjà en cours d’exécution (sudo systemctl stop nginx) avant de lancer Certbot.
Créez la configuration de l’hôte virtuel Nginx :
sudo vim /etc/nginx/sites-available/guacamole
Ajoutez la configuration suivante. Les en-têtes WebSocket sont importantes car Guacamole utilise des WebSocket pour le tunnel du bureau distant :
server {
listen 443 ssl http2;
server_name guacamole.domaine.fr;
ssl_certificate /etc/letsencrypt/live/guacamole.domaine.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/guacamole.domaine.fr/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_cookie_path /guacamole/ /;
}
}
server {
listen 80;
server_name guacamole.domaine.fr;
return 301 https://$host$request_uri;
}
Activez le site et testez la configuration :
sudo ln -sf /etc/nginx/sites-available/guacamole /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
Si le resultat de la commande sudo nginx -t ne retourne aucune erreur alors démarrez Nginx :
sudo systemctl enable --now nginx
Si vous avez un pare-feu sur votre système :
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
Vérifiez que le renouvellement automatique du certificat fonctionne :
sudo certbot renew --dry-run
Apache Guacamole fonctionne dés à présent accessible via https://guacamole.domaine.fr.
Bien évidemment il s’agit d’un domaine fictif donc cela devrait fonctionner depuis votre nom de domaine ou adresse IP locale.
Créer un utilisateur
Par défaut le nom d’utilisateur et le mot de passe pour se connecter est guacadmin, il est recommandé de changer le mot de passe du compte ou de le désactiver puis par la suite de créer un utilisateur administrateur.
Pensez à créer un utilisateur qui possède le rôle d’administrateur avant de désactiver guacadmin si vous comptez le faire.

En ce qui est de la création de compte, le formulaire est assez complet puisque vous avez la possiblité d’y ajouter des restrictions au niveau du compte comme :
- forcer l’expiration du mot de passe qui va inviter l’utilisateur à le changer
- autoriser l’accès au compte pendant une plage horaire donnée
- activer et désactiver le compte pendant une plage horaire donnée
- modifier son fuseau horaire
Ainsi que des permissions :
- Administration du système
- Audit system
- Créer de nouveaux utilisateurs
- Créer de nouveaux groupes d’utilisateurs
- Créer de nouvelles connexions
- Créer de nouveaux groupes de connexion
- Créer de nouveaux profils de partage
- Modifier son propre mot de passe
Audit system : est une option permettant la traçabilité des évènements lié à l’utilisation de Guacamole sous un compte où l’option est activée. Les évènements enregistrés sont les connexions et déconnexions des utilisateurs, les tentatives d’authentification (réussies ou échouées), l’ouverture et la fermeture de sessions RDP, SSH ou VNC. les modifications de la configuration (création/suppression de connexions, changements de groupes, permissions, etc.) et les opérations d’administration (création d’utilisateurs, modification des droits, etc.).
Ajouter un hôte
Pour ajouter un hôte SSH, il faut se rendre dans le menu en haut à droite en cliquant sur l’utilisateur puis dans le menu qui se déroule il faut cliquer sur Paramètres. Dans cette section se trouve différents onglets et celui qui nous intéresse est Connexions.

Et on clique sur Nouvelle connexion. Par ailleurs il y a aussi possibilité de créer un groupe de connexions avec possibilité là encore d’ajouter des limites :
- Nombre maximum de connexions
- Nombre maximum de connexions par utilisateur
- Activer l’affinité de session
Pour ajouter un hôte il y a de nombreuses options qui sont à notre disposition. l’authentification par clé SSH est possible. Vous avez également possibilité de faire du Wake On LAN.