Apache Guacamole : accès distant sans client, depuis un navigateur

Bannière : Apache Guacamole, accès distant RDP/VNC/SSH

Apache Guacamole est une passerelle d'accès distant "clientless" : elle retransmet du RDP, du VNC ou du SSH directement dans le navigateur via HTML5, sans rien installer côté poste client. C'est l'outil que j'utilise pour dépanner des postes clients à distance ou administrer mes serveurs depuis n'importe où, sans dépendre d'un logiciel spécifique installé sur chaque machine.

Pré-requis : Docker Compose, et un peu de patience pour la première initialisation de la base — c'est l'étape qui piège le plus de monde (voir plus bas).

1. Architecture

Guacamole repose sur trois conteneurs : guacd (le moteur qui traduit RDP/VNC/SSH vers le protocole web), une base de données pour l'authentification et les connexions enregistrées, et l'application web elle-même (Tomcat).

2. Générer le schéma SQL avant le premier démarrage

C'est l'étape la plus souvent oubliée : contrairement à beaucoup d'applications Docker, Guacamole ne crée pas son schéma de base automatiquement. Il faut le générer à part et le déposer dans un dossier d'initialisation :

terminal
$ mkdir -p guacamole/{init,drive,record,mysql-data}
$ docker run --rm guacamole/guacamole:1.6.0 \
    /opt/guacamole/bin/initdb.sh --mysql \
    > guacamole/init/initdb.sql
Important : ce fichier initdb.sql doit exister avant le tout premier docker compose up. MariaDB n'exécute les scripts d'initialisation que sur un dossier de données vide — si vous l'oubliez, la base démarre vide et il faut supprimer mysql-data pour recommencer proprement.

3. docker-compose.yml

docker-compose.yml
services:
  guacd:
    image: guacamole/guacd:1.6.0
    container_name: guacd
    restart: unless-stopped
    volumes:
      - ./drive:/drive
      - ./record:/record

  guacamole-mysql:
    image: mariadb:10.11
    container_name: guacamole-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: change-moi
      MYSQL_DATABASE: guacamole_db
      MYSQL_USER: guacamole_user
      MYSQL_PASSWORD: change-moi-aussi
    volumes:
      - ./mysql-data:/var/lib/mysql
      - ./init:/docker-entrypoint-initdb.d

  guacamole:
    image: guacamole/guacamole:1.6.0
    container_name: guacamole
    restart: unless-stopped
    environment:
      GUACD_HOSTNAME: guacd
      MYSQL_HOSTNAME: guacamole-mysql
      MYSQL_DATABASE: guacamole_db
      MYSQL_USER: guacamole_user
      MYSQL_PASSWORD: change-moi-aussi
    ports:
      - "8082:8080"
    depends_on:
      - guacd
      - guacamole-mysql

4. Lancement et connexion

terminal
$ docker compose up -d

Accès sur http://<IP_SERVEUR>:8082/guacamole/ — le /guacamole/ final est obligatoire, la racine / renvoie une 404 par conception. Identifiants par défaut : guacadmin / guacadmin, à changer immédiatement dans Settings → Preferences.

5. Reverse proxy : le point qui bloque le plus souvent

Guacamole utilise WebSocket en continu pour transmettre l'affichage distant. Sans les en-têtes adéquats sur votre reverse proxy, vous obtenez une page blanche après connexion :

En-têteValeur
Upgrade$http_upgrade
Connection$connection_upgrade

6. Ajouter une connexion

Dans Settings → Connections → New Connection, choisissez le protocole (RDP, VNC ou SSH), renseignez l'hôte, le port et les identifiants. Vous pouvez ensuite partager cette connexion à un utilisateur sans jamais lui communiquer le mot de passe de la machine cible.

Le dossier record/ permet d'activer l'enregistrement vidéo des sessions — utile pour garder une traçabilité des interventions à distance chez un client, avec son accord.

Conclusion

Guacamole demande un peu de rigueur au premier lancement (schéma SQL, en-têtes WebSocket), mais une fois en place c'est une solution d'accès distant très pratique : un simple lien, aucun client à installer, et un contrôle centralisé des accès.

R
Raph — Chronoassistance25 ans d'expérience en informatique, cybersécurité et infrastructure.