Apache Guacamole avec un reverse proxy Apache2 et un certificat Let’s Encrypt
Sommaire
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 !
- Comment installer Apache Guacamole sur Debian ?
- Comment publier Apache Guacamole avec pfSense et HAProxy ?
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.
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).
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."
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
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 :
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 !
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.
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 :
Désormais, suite à cette manipulation, Apache Guacamole est accessible en direct sans préciser "/guacamole/" :
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.
Bonjour
A quel url dois-je mettre /guacamole pour ?
Bonjour,
Juste une petite question : pour cette solution il faut avoir un nom de domaine ?
Merci d’avance pour votre aide 🙂
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 ?
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.
Finalement j’ai trouvé la solution
Bonjour,
Est-ce que vous pouvez partager la solution?
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