17/11/2024

Cybersécurité

Apache Guacamole avec un reverse proxy Apache2 et un certificat Let’s Encrypt

I. Présentation

Dans ce tutoriel, nous allons installer Apache2 en tant que reverse proxy sur un serveur Apache Guacamole. L'objectif est de publier Apache Guacamole en HTTPS, avec un certificat SSL valide obtenu via Let's Encrypt, sans s'appuyer sur une autre machine. Précédemment, nous avons vu comment atteindre le même objectif mais en utilisant un firewall pfSense avec HAProxy en guise de reverse proxy. Cette fois-ci, tout se fait sur la même machine !

Si l'on reprend le schéma présenté au sein du tutoriel d'introduction, le reverse proxy va être mis en place directement sur la machine Apache Guacamole située en DMZ. Dans ce cas pratique, le firewall pfSense, nommé "Pare-feu" sur le schéma, sera toujours présent. Sur ce firewall, que ce soit un pfSense ou un autre modèle, il conviendra de créer une règle de redirection de port pour que les flux sur le port 443 (HTTPS) soient redirigés vers le serveur Apache Guacamole (bien sûr, vous pouvez utiliser un port personnalisé).

Au final, l'objectif sera d'accéder à Apache Guacamole via l'URL suivante : https://guaca.it-connect.tech/ - Sans avoir besoin d'ajouter "/guacamole/#/" à la fin de l'URL.

Bastion Apache Guacamole - Schema

II. Configurer le pare-feu

Puisque le pare-feu gère l'adresse IP publique ainsi que les flux entrants et sortants entre Internet, la DMZ et le réseau local, c'est lui qui doit être configuré pour que les flux HTTPS soient redirigés vers le serveur Apache Guacamole.

Du côté du pare-feu, il y a deux règles à créer :

  • Rediriger le port 443 en externe vers le port 443 en interne, pour accéder à Apache Guacamole en HTTPS
    • Vous pouvez utiliser un port différent en externe, notamment pour masquer le service de l'extérieur
  • Rediriger le port 80 en externe vers le port 80 en interne
    • Si vous souhaitez rediriger les flux HTTP vers HTTPS pour les connexions à Apache Guacamole (facultatif)
    • Pour obtenir un certificat Let's Encrypt avec la méthode de vérification en mode Web (challenge de vérification)

Par contre, vous n'avez plus besoin d'une règle pour rediriger le port 8080 externe vers le port 8080 en interne (ce port étant celui utilisé par défaut par Guacamole).

Pfsense - NAT - Apache Guacamole

Cette configuration est à adapter selon le type de pare-feu que vous utilisez et sur quel port externe vous souhaitez publier Apache Guacamole.

III. Obtenir un certificat SSL (Let's Encrypt) pour Apache Guacamole

La suite va se dérouler sur le serveur Apache Guacamole en lui-même. La première étape consiste à demander un certificat Let's Encrypt. Pour cet exemple, ce sera pour le domaine "guaca.it-connect.tech" donc au préalable, il convient de créer l'enregistrement DNS pour associer l'adresse IP publique du pare-feu à ce nom de domaine.

Ensuite, direction la ligne de commande pour mettre à jour le cache des paquets :

sudo apt-get update

Puis, installez les paquets ci-dessous pour bénéficier de Certbot sur votre machine. Cet outil va nous permettre de demander un certificat Let's Encrypt.

sudo apt-get install certbot python3-certbot-apache

Une fois que les paquets sont installés, effectuez la demande de certificat à l'aide de la commande ci-dessous. Puisque la méthode de challenge "http" est utilisée, il faut que le serveur Web soit accessible sur le port 80 (d'où la règle de pare-feu précédente), le temps de demander le certificat. L'alternative consiste à utiliser la méthode "dns" basée sur la création d'un enregistrement DNS spécifique. Dans cette commande, précisez aussi le nom de domaine pour lequel vous souhaitez obtenir un certificat.

sudo certbot certonly --standalone --preferred-challenges http -d guaca.it-connect.tech

Quelques secondes plus tard, le certificat doit être délivré et stocké sur votre serveur !

Remarque : si vous avez déjà installé le paquet Apache2, vous devez stopper le processus "apache2" sur le serveur de manière à libérer le port 80. Sinon, vous allez obtenir le message d'erreur "Problem binding to port 80: Could not bind to IPv4 or IPv6."

Certificat SSL Lets Encrypt pour Apache Guacamole

Ainsi, vous avez deux fichiers :

/etc/letsencrypt/live/guaca.it-connect.tech/fullchain.pem
/etc/letsencrypt/live/guaca.it-connect.tech/privkey.pem

Ces deux fichiers seront utiles pour la suite de la configuration, car on va les déclarer dans la configuration du site Apache.

Note : ce certificat SSL doit être renouvelé automatiquement, grâce à la présence de la tâche planifiée déclarée dans le fichier "/etc/cron.d/certbot". Si un jour cela échoue et que vous devez renouveler manuellement le certificat, exécutez la commande suivant : sudo certbot renew --apache

IV. Reverse proxy Apache2 pour Apache Guacamole

Le certificat SSL étant en votre possession, vous pouvez passer à la suite : l'installation d'Apache2 que l'on va configurer en tant que reverse proxy.

Commencez par installer le paquet Apache2 :

sudo apt-get install apache2

Puis, activez le démarre automatique du service correspondant :

sudo systemctl enable apache2

De manière à pouvoir utiliser Apache2 en tant que reverse proxy et qu'Apache Guacamole puisse être accessible en HTTPS, vous devez activer plusieurs modules. Voici la commande à exécuter :

sudo a2enmod proxy proxy_wstunnel proxy_http ssl rewrite

Pour que les modules soient chargés par le serveur Web, il convient de redémarrer le service :

sudo systemctl restart apache2

Voilà, la première étape est effectuée. Désormais, vous devez configurer le reverse proxy.

Créez un nouveau site qui sera déclaré dans le fichier "guacamole.conf" :

sudo nano /etc/apache2/sites-available/guacamole.conf

Dans ce fichier, intégrez le contenu suivant :

<VirtualHost *:80>
   ServerName guaca.it-connect.tech
   Redirect permanent / https://guaca.it-connect.tech/
</VirtualHost>

<VirtualHost *:443>
   ServerName guaca.it-connect.tech

   SSLEngine On
   SSLCertificateFile /etc/letsencrypt/live/guaca.it-connect.tech/fullchain.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/guaca.it-connect.tech/privkey.pem

   ProxyPass / http://127.0.0.1:8080/ flushpackets=on
   ProxyPassReverse / http://127.0.0.1:8080/

   <Location /websocket-tunnel>
      Order allow,deny
      Allow from all
      ProxyPass ws://127.0.0.1:8080/websocket-tunnel
      ProxyPassReverse ws://127.0.0.1:8080/websocket-tunnel
   </Location>

</VirtualHost>

La première partie de la configuration (<VirtualHost *:80>) est facultative puisqu'elle sert seulement à rediriger les flux HTTP vers HTTPS, donc on peut s'en passer à condition de bien préciser HTTPS lorsque l'on accède à Apache Guacamole.

La seconde partie de la configuration (<VirtualHost *:443>) sert à configurer Apache2 en tant que reverse proxy pour les connexions en HTTPS. C'est pour cette raison que l'on spécifie les options ProxyPass et ProxyPassReverse prévues à cet usage. En fait, on précise que si l'on accède à la racine du site ("/"), on doit rediriger le flux en local sur le port 8080 ("http://127.0.0.1:8080/"). Par ailleurs, les options SSLCertificateFile et SSLCertificateKeyFile sont là pour préciser le chemin vers les fichiers du certificat Let's Encrypt.

Note : cette configuration part du principe que l'on va accéder à Apache Guacamole sans préciser "/guacamole"/ à la fin de l'URL. Si vous souhaitez le conserver, vous devez le rajouter dans les URL de la configuration.

Cette configuration est inspirée de la documentation officielle d'Apache Guacamole où vous pouvez obtenir des explications supplémentaires.

Enregistrez le fichier.

Activez le site et testez la configuration, avant de finir par un redémarrage du service Apache2 (si le test retourne "Syntax OK") :

sudo a2ensite guacamole.conf
sudo apachectl configtest
sudo systemctl restart apache2

Apache Guacamole - Test reverse proxy apache2

Le reverse proxy est prêt !

V. Configurer Tomcat

La dernière étape consiste à affiner la configuration du serveur Apache Guacamole pour récupérer l'adresse IP d'origine du client connecté dans l'historique des sessions (problématique évoquée dans mon précédent article avec l'utilisation de HAProxy comme reverse proxy). Puis, on modifiera aussi le serveur Tomcat pour ne pas avoir besoin de saisir "/guacamole/" dans l'URL d'accès à Guacamole.

A. Tomcat9 et l'IP d'origine

Avec la configuration actuelle, l'hôte distant dans l'historique des sessions Guacamole serait toujours égal à l'adresse IP du reverse proxy, que ce soit avec un client du réseau local ou un client distant. Pour que l'adresse IP d'origine du client soit visible dans Apache Guacamole, il faut adapter la configuration de Tomcat.

Depuis la ligne de commande du serveur Apache Guacamole, éditez le fichier de configuration de Tomcat9.

sudo nano /etc/tomcat9/server.xml

L'objectif va être d'ajouté ce bout de code (indiqué dans la documentation officielle) :

<Valve className="org.apache.catalina.valves.RemoteIpValve"
    internalProxies="127.0.0.1"
    remoteIpHeader="x-forwarded-for"
    remoteIpProxiesHeader="x-forwarded-by"
    protocolHeader="x-forwarded-proto" />

La seule valeur à modifier, c'est celle du champ "internalProxies" où vous devez indiquer l'adresse IP de votre reverse proxy (correspondante à l'interface qui communique avec Guacamole). Ici, ce sera "127.0.0.1", car il est en local.

Ce bloc s'ajoute à la fin du fichier de configuration, à cet endroit pour être précis :

Tomcat9 reverse proxy local Apache Guacamole

Sauvegardez et relancez le service Tomcat9.

sudo systemctl restart tomcat9

Suite à cette modification, c'est bien l'adresse IP d'origine du client qui est visible dans Apache Guacamole !

Apache Guacamole - Reverse Proxy - IP origine

B. Supprimer "guacamole" dans l'URL

Dernier point de configuration : se débarrasser de "/guacamole/" dans l'URL pour que l'on soit en mesure d'accéder à Apache Guacamole via l'URL "https://guaca.it-connect.tech". Bien sûr, cette étape est facultative.

Apache Guacamole - Guacamole dans URL Web

Pour cela, il faut renommer la WebApp d'Apache Guacamole, au niveau du répertoire de Tomcat9.

Commencez par accéder au répertoire des WebApps

cd /var/lib/tomcat9/webapps

Puis, arrêtez le service Tomcat9 :

sudo systemctl stop tomcat9

Actuellement, nous avons :

  • Le fichier guacamole.war qui correspond à la WebApp de Guacamole
  • Le répertoire guacamole qui contient les données de cette WebApp
  • Le répertoire ROOT qui contient la page par défaut de Tomcat9

L'objectif va être de faire en sorte que "guacamole.war" devienne "ROOT.war" pour prendre la place de la page par défaut. Ainsi, on pourra accéder à son interface sans préciser de suffixe dans l'URL.

Commencez par supprimer le répertoire "guacamole" (attention, je dis bien le répertoire).

sudo rm guacamole/ -Rf

Puis, renommez le dossier "ROOT" en "ROOT-ORIGINAL" pour "libérer la place". Et, renommez la WebApp de Guacamole :

sudo mv ROOT/ ROOT-ORIGINAL/
sudo mv guacamole.war ROOT.war

Démarrez le service Tomcat9 :

sudo systemctl start tomcat9

En image, cela donne l'enchaînement de commandes suivant :

Apache Guacamole - Supprimer guacamole dans URL

Désormais, suite à cette manipulation, Apache Guacamole est accessible en direct sans préciser "/guacamole/" :

Apache Guacamole - Sans guacamole dans URL Web

VI. Conclusion

Il ne vous reste plus qu'à mettre en place cette configuration et à effectuer vos tests de connexion ! Apache Guacamole doit être accessible en HTTPS grâce au reverse proxy mis en place en local ! Ainsi, les connexions entre votre PC et Apache Guacamole seront sécurisées.

Connexion Apache Guacamole HTTPS et Reverse Proxy - Exemple

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

7 commentaires sur “Apache Guacamole avec un reverse proxy Apache2 et un certificat Let’s Encrypt

  • Bonjour
    A quel url dois-je mettre /guacamole pour ?

    Répondre
    • Bonjour,

      Juste une petite question : pour cette solution il faut avoir un nom de domaine ?

      Merci d’avance pour votre aide 🙂

      Répondre
      • 2 éme question : Si je crée une VM Ubuntu ou debian avec Apache Guacamole avec un reverse proxy Apache2 et que j’ai seulement une live box cela peut fonctionner ? la sécurité serait-elle assez robuste ?

        Répondre
  • Bonjour merci pour la suite de guacamole.
    Par contre après avoir déployé le proxy j’ai un gros soucis avec l’affiche
    affichage n’est pas optimale parfois les tests qui sont censés être sur une même ligne se décale se qui emepche de bien lire
    un tour dans les logs de tomcat9 et j’ai remarquer ceci
    sudo tail -f /var/log/tomcat9/catalina.out

    INFO o.a.g.t.h.RestrictedGuacamoleHTTPTunnelServlet – Using HTTP tunnel (not WebSocket). Performance may be sub-optimal.

    Répondre
      • Bonjour,

        Est-ce que vous pouvez partager la solution?

        Répondre
  • Salut,
    Merci pour les articles, j’ai deployé un Guacamole en lab avec de l’auth SAML sur Azure AD, à noter que le proxy HTTPS Apache empeche les connexions en strict SAML à cause de la redirection tant que je n’ai pas ajouté les 3 lignes suivantes (proxyPort secure et scheme) à la fin du connector à la conf Tomcat :

    sudo nano /etc/tomcat9/server.xml

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.