Introduction
Guacamole est une solution Open Source gratuite qui permet de mettre en place des accès à distance à travers un portail Web sur différents équipements avec différents protocoles comme le 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 connexion …) et d’enregistrer les sessions en vidéo. L’un des principaux avantages de cette solution est qu’il n’est pas nécessaire de communiquer les identifiants des différents à machines à l’utilisateur, il faut seulement donner les identifiants d’accès au portail web où l’utilisateur pourra se connecter aux différentes machines voulues. Tous les accès sont enregistrés dans Guacamole, il est donc facile de suivre l’activité des prestataires, enregistrer en vidéo les sessions, ou configurer des horaires d’accès sur les comptes.
Le fonctionnement
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 nous permet de nous connecter à nos serveurs/ordinateurs de bureau distants. Ceci est soutenu par le serveur Tomcat.
Initialisation de la VM
Tout d’abord nous allons utiliser une VM Ubuntu 20.04 avec la configuration ci-dessous pour réaliser ce projet :
Une fois la VM lancer nous devons la mettre à jour et installer le ssh pour pouvoir nous y connecter plus facilement :
apt update
apt upgrade
apt install openssh-server
systemctl enable ssh
systemctl start ssh
On édite ensuite le fichier de configuration du ssh pour autoriser la connexion avec l’utilisateur « root », en rajoutant la ligne suivante :
nano
/etc/ssh/sshd_config
PermitRootLogin yes
Il faut ensuite exécuter la commande suivante en root pour modifier le mot de passe, si nous n’effectuons pas cela nous ne pourrons pas nous connecter en ssh avec l’utilisateur « root » :
passwd
root
#On
renseigne le mot de passe que l’on souhaite
Installation de l’outil
Une fois connecter en ssh nous pouvons commencer l’installation de guacamole, pour cela il nous faut installer différents paquets nécessaires au bon fonctionnement de cet outil :
apt install build-essential libcairo2-dev libjpeg-turbo8-dev libpng-dev libtool-bin uuid-dev libossp-uuid-dev libavcodec-dev libavformat-dev libavutil-dev libswscale-dev freerdp2-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libwebsockets-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev -y
Ensuite, nous exécutons la commande ci-dessous pour installer le package Apache Tomcat 9 (tomcat9), que nous utiliserons plus tard pour exécuter l’application client Guacamole :
apt install tomcat9 -y
systemctl enable –now tomcat9
Une fois tomcat9 installé, nous pouvons installer guacamole :
wget https://dlcdn.apache.org/guacamole/1.4.0/source/guacamole-server-1.4.0.tar.gz
tar -xzf guacamole-server-1.4.0.tar.gz
cd guacamole-server-1.4.0/ ./configure —with-systemd-dir=/etc/systemd/system/ –disable-dependency-tracking
Nous exécutons maintenant la commande « make » qui permet de compiler le serveur Guacamole sur le serveur Linux et ainsi installer les fichiers du serveur dans le répertoire /usr/local/bin :
make
make install
ldconfig
systemctl daemon-reload
systemctl enable –now guacd
Configuration de Guacamole
Nous définissons le répertoire de configuration de Guacamole pour tomcat9 :
echo GUACAMOLE_HOME=/etc/guacamole >> /etc/default/tomcat9
Nous créons ensuite deux répertoires qui nous servirons par la suite :
- extensions : répertoire qui stocke les extensions Guacamole.
- lib : répertoire qui stocke les bibliothèques dont le serveur Guacamole a besoin.
mkdir -p /etc/guacamole/{extensions,lib}
Nous devons ensuite créer deux fichiers qui permettront la configuration de guacamole
touch /etc/guacamole/{guacamole.properties,guacd.conf}
Installation de MariaDB
Une fois Guacamole configurer, nous allons maintenant installer une méthode d’authentification grâce à MariaDB (système de gestion de base de données). Pour cela nous devons installer la version client et la version serveur :
apt install mariadb-server mariadb-client
On créer ensuite une base de données « guacamole_db » :
mysql -u root -p
CREATE DATABASE guacamole_db;
exit
On installe ensuite l’extension d’authentification de la base de données Guacamole :
wget https://dlcdn.apache.org/guacamole/1.4.0/binary/guacamole-auth-jdbc-1.4.0.tar.gz
tar -xf guacamole-auth-jdbc-1.4.0.tar.gz
cd guacamole-auth-jdbc-1.4.0/mysql/
Nous exécutons la commande « cat » ci-dessous pour importer le schéma de base de données Apache Guacamole MariaDB dans la base de données « guacamole_db » :
ls
cat schema/*.sql | mysql -u root -p guacamole_db
Enfin, nous exécutons les requêtes MariaDB ci-dessous pour créer un utilisateur de base de données :
mysql -u root -p
CREATE USER ‘guacamole_user’@‘localhost’ IDENTIFIED BY ‘StrongPassword’;
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO ‘guacamole_user’@‘localhost’;
FLUSH PRIVILEGES;
exit
Installation de l'extension d'authentification de base de données
On copie l’extension dans le répertoire de Guacamole :
cp guacamole-auth-jdbc-mysql-1.4.0.jar /etc/guacamole/extensions/guacamole-auth-jdbc-mysql.jar
On télécharge ensuite le connecteur MySQL/Java et on déplace le fichier dans le répertoire de Guacamole :
wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java_8.0.30-1ubuntu20.04_all.deb
dpkg -i mysql-connector-java_8.0.30–1ubuntu20.04_all.deb
cp /usr/share/java/mysql-connector-java-8.0.30.jar /etc/guacamole/lib/mysql-connector.jar
Configuration d'Apache Guacamole avec la base de données MariaDB
Maintenant que l’on a installé les extensions nous pouvons les configurer pour cela il faut aller modifier le fichier « guacamole.properties » et rajouter les lignes suivantes :
nano /etc/guacamole/guacamole.properties
#MySQL
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: StrongPassword
mysql-auto-create-accounts: true
On configure ensuite le fichier guacd.conf en rajoutant les informations du serveur :
nano /etc/guacamole/guacd.conf
[server]
bind_host = 0.0.0.0
bind_port = 4822
On redémarre les services pour que les changements soient pris en compte :
sudo systemctl restart guacd
sudo systemctl restart tomcat9
Installation de l'application Web client Guacamole
Maintenant que nous avons installé la partie serveur, il faut installer la partie client en exécutant les commandes suivantes :
wget https://dlcdn.apache.org/guacamole/1.4.0/binary/guacamole-1.4.0.war
mv guacamole-1.4.0.war guacamole.war
cp guacamole.war /var/lib/tomcat9/webapps
ls /var/lib/tomcat9/webapps
Configuration d'Apache en tant que proxy inverse pour le client Guacamole
Afin d’accéder à la page web de manière sécurisée nous allons mettre en place un proxy inverse avec un serveur web Apache et un chiffrement SSL.
Pour cela nous installons apache2 et nous activons le différent module nécessaire à la mise en place d’un proxy inverse :
sudo apt install apache2 -y
sudo a2enmod proxy proxy_wstunnel proxy_http ssl rewrite
systemctl restart apache2
Nous créons ensuite nos certificats grâce à OpenSSL :
mkdir /etc/openssl/
openssl req –new -x509 -sha256 -newkey rsa :2048 -nodes -keyout guacamole.key.pem -days 3650 –out guacamole.cert.pem
cp guacamole.cert.pem /etc/openssl/guacamole.cert.pem
cp guacamole.key.pem /etc/openssl/guacamole.key.pem
Maintenant, nous créons un nouveau fichier de configuration d’hôte virtuel :
nano /etc/apache2/sites-available/guacamole.conf
<VirtualHost * :80>
ServerName afo-bastion.cerealog.fr
ServerAlias afo-bastion.cerealog.fr
Redirect permanent / https://afo-bastion.cerealog.fr/
</VirtualHost>
<VirtualHost * :443>
ServerName afo-bastion.cerealog.fr
ServerAlias www.afo-bastion.cerealog.fr
<If « %{HTTP_HOST} == ‘www.afo-bastion.cerealog.fr’ »>
Redirect permanent / https://afo-bastion.cerealog.fr/
</If>
ErrorLog /var/log/apache2/example.io-error.log
CustomLog /var/log/apache2/example.io-access.log combined
SSLEngine On
SSLCertificateFile /etc/openssl/guacamole.cert.pem
SSLCertificateKeyFile /etc/openssl/guacamole.key.pem
<Location />
Order allow,deny
Allow from all
ProxyPass http ://127.0.0.1:8080/guacamole/flushpackets=on
ProxyPassReverse http://127.0.0.1:8080/guacamole/
</Location>
<Location /websocket-tunnel>
Order allow,deny
Allow from all
ProxyPass ws ://127.0.0.1 :8080/guacamole/websocket-tunnel
ProxyPassReverse ws ://127.0.0.1 :8080/guacamole/websocket-tunnel
</Location>
</VirtualHost>
Nous exécutons les commandes suivantes pour activer la configuration :
a2ensite guacamole.conf
apachectl configtest
Nous devons ensuite mettre en place la configuration suivante car elle permet à une
application dans Tomcat de voir la véritable adresse IP du client. Nous aurons
besoin de cette configuration car le client Guacamole de l’application
principale se trouve derrière le proxy inverse Apache.
Nano /etc/tomcat9/server.xml
<Valve className= »org.apache.catalina.valves.RemoteIpValve »
internalProxies= »127.0.0.1 »
remoteIpHeader= »x-forwarded-for »
remoteIpProxiesHeader= »x-forwarded-by »
protocolHeader= »x-forwarded-proto »
/>
Enfin nous redémarrons les services pour appliquer les modifications :
sudo systemctl restart apache2
sudo systemctl restart tomcat9
Mise en place de LDAP
Maintenant que nous pouvons nous connecter avec MySQL à Apache Guacamole, nous allons voir qu’il est aussi possible de lier un annuaire LDAP pour se connecter avec des comptes présents dans cet annuaire.
Dans cet exemple nous allons utiliser l’annuaire LDAP d’un Active Directory d’un Windows Server. Nous allons donc créer un compte qui va permettre à Guacamole de venir lire l’annuaire (ce compte n’a besoin d’aucun droit particulier) :
Plus-tard, il faudra ensuite renseigner le mot de passe du compte de lecture dans la configuration de Guacamole
Nous pouvons aussi créer un groupe « GRP_Guacamole » où nous renseignerons tous les utilisateurs ayant un accès à Guacamole :
Maintenant que notre annuaire LDAP est prêt, nous pouvons installer extension « guacamole-auth-ldap » sur le serveur :
wget https://downloads.apache.org/guacamole/1.4.0/binary/guacamole-auth-ldap-1.4.0.tar.gz
tar -xzf guacamole-auth-ldap-1.4.0.tar.gz
cd guacamole-auth-ldap-1.4.0/
cp guacamole-auth-ldap-1.4.0.jar /etc/guacamole/extensions/
On édite le fichier de configuration de guacamole en renseignant les lignes suivantes :
nano /etc/guacamole/guacamole.properties
guacd-hostname : localhost
guacd-port : 4822
auth-provider : net.sourceforge.guacamole.net.auth.ldap.LDAPAuthenticationProvider
On rajoute ensuite dans ce même fichier la configuration pour le LDAP :
#LDAP
ldap-hostname : IP
ldap-port : 389
ldap-encryption-method : none
ldap-username-attribute : sAMAccountName
ldap-search-bind-dn : CN=LectureLDAP,CN=Users,DC=alban,DC=local
ldap-search-bind-password : MotDePasse
ldap-user-base-dn : CN=Users,DC=alban,DC=local
ldap-follow-referrals : true
ldap-dereference-aliases : always
ldap-user-search-filter : (&(objectClass=person)(sAMAccountName=*)(memberOf :1.2.840.113556.1.4.1941 :=CN=GRP_Guacamole,CN=Users,DC=alban,DC=local)( !(userAccountControl :1.2.840.113556.1.4.803 :=2)))
Pour finir la configuration de LDAP nous allons devoir nous connecter en mode graphique avec le compte par défaut « guacadmin » ainsi lorsque nous nous connectons et que nous allons voir les utilisateurs présents, nous ne voyons qu’un compte (MySQL).
Pour faire apparaitre les comptes LDAP nous devons nous connecter avec un compte de l’annuaire LDAP une première fois, puis nous reconnecter avec le compte « guacadmin ».
Maintenant nous pouvons voir que notre compte LDAP apparaît bien. Ainsi, pour faire apparaitre tous les comptes présents dans le groupe « GRP_Guacamole » nous allons devoir mettre l’utilisateur (LDAP) avec lequel nous nous sommes connectés en administrateur :
Ainsi, lorsque nous nous connectons avec le compte LDAP administrateur nous voyons apparaitre tous les autres comptes de l’annuaire :
Mise en place double authentification
Pour mettre en place la double authentification qui apporte plus de sécurité, nous devons installer l’extension « guacamole-auth-totp » et la déplacer dans le répertoire de Guacamole :
wget https://dlcdn.apache.org/guacamole/1.4.0/binary/guacamole-auth-totp-1.4.0.tar.gz
tar -zxf guacamole-auth-totp-1.4.0.tar.gz
cd guacamole-auth-totp-1.4.0/
cp guacamole-auth-totp-1.4.0.jar /etc/guacamole/extensions/
On édite le fichier de configuration de guacamole en rajoutant les lignes suivantes :
nano /etc/guacamole/guacamole.properties
#TOTP
totp-issuer : apache_guacamole
totp-digits : 6
totp-period : 30
totp-mode : sha512
On redémarre les services suivants pour appliquer les modifications :
systemctl restart tomcat9
systemctl restart guacd
Ainsi, lorsque l’on se connecte pour la première fois, nous devons scanner un QR code avec l’application Google Authenticator :
Désormais
lorsque nous voulons nous connecter nous devons indiquer le code affiché dans
l’application :
Mise place des connexions
Une
fois que les utilisateurs sont bien configurés, nous pouvons passer à la partie
la plus intéressante : La configuration de la connexion sur les
équipements. Il est possible de configurer plusieurs types de connexions avec
Guacamole, comme Kubernetes, RDP, SSH, Telnet, VNC. Nous allons donc voir maintenant
deux types de connexion parmi les 5 : RDP et SSH.
Pour
commencer la configuration du RDP, il est nécessaire de rentrer les commandes
ci-dessous sur le serveur Guacamole pour qu’il n’y est pas d’erreurs lors de la
connexion :
useradd -M
-d /var/lib/guacd/ -r -s
/sbin/nologin -c « Guacd User » guacd
mkdir /var/lib/guacd
chown -R
guacd: /var/lib/guacd
sed -i ‘s/daemon/guacd/’
/etc/systemd/system/guacd.service
systemctl
daemon-reload
systemctl
restart guacd
Une
fois ces commandes entrées nous pouvons nous rendre dans les paramètres sur la
partie graphique de Guacaomle, dans l’onglet « Connexions » et
cliquer sur « Nouvelle Connexion » :
Tout d’abord nous devons définir le nom de la machine et sélectionner le protocole utilisé (RDP) :
Nous devons ensuite configurer la partie réseau en mettant le nom d’hôte (FQDN ou IP) le numéro de port 3389 qui correspond au protocole RDP. Nous devons aussi renseigner les identifiants d’authentification, le mot de passe et le domaine s’il y en a un. Il faut aussi penser à cocher la case « ignorer le certificat du serveur » sinon la connexion ne se fera pas.
Ainsi lorsque nous retournons sur la page d’accueil nous pouvons nous connecter à notre machine précédemment configurée :
Pour la connexion SSH, il faut effectuer la même manipulation mais choisir le protocole SSH :
Nous devons ensuite configurer la partie réseau en mettant le nom d’hôte (FQDN ou IP) le numéro de port 22 qui correspond au protocole SSH. Nous devons aussi renseigner les identifiants d’authentification et le mot de passe :
Ainsi, lorsque nous retournons sur la page d’accueil nous pouvons nous connecter à notre machine précédemment configurée :
Enregistrement des sessions
Pour
configurer l’enregistrement des sessions des utilisateurs nous devons tout d’abord
créer un répertoire records où seront stockées les vidéos nous devons ensuite
mettre l’utilisateur guacd propriétaire de ce fichier. Nous devons créé un
fichier que l’o nommera « vidéo » qui servira de base pour la
création des fichiers vidéo. Puis nous installons VLC qui nous permettra de visionner
les vidéos :
mkdir
/opt/guacamole/ /opt/guacamole/records/
touch /opt/guacamole/records/video
chown -R
guacd: /opt/guacamole/records/
apt install vlc
Il
faut ensuite se rendre sur la partie graphique de guacamole, aller dans les
paramètres d’une connexion en remplissant la partie « Enregistrement Ecran »
comme ceci :
Ainsi lorsque nous lançons une session, un fichier « video.1 » est créer :
Pour pouvoir visionner la vidéo il faut tout d’abord l’encoder, pour cela nous utilisons la commande « guacenc » :
Nous obtenons ensuite une vidéo en .mv4 que nous pouvons visionner avec VLC :