# GUACAMOLE: Overview
{{INLINETOC}}
La prise de main à distance sur plusieurs machines fait partie intégrante du quotidien de l’administrateur réseau. Que se soit avec des clients multi-protocole (MobaXterm, MRemoteNG) ou avec des clients dédiés (Putty, Microsoft Remote Desktop), ses besoins sont en général pourvus. Cependant il peut arrivé de ne pouvoir se connecter à cause de restrictions de sécurité. Dans ces cas là, les ports web restaient ouvert, c’est là que Guacamole prends tout sont sens.
## Présentation
Guacamole est un logiciel libre sous licence ASF (Apache Software Foundation) permettant la connexion à distance sur de nombreux types de machines grâce à son coté multi-protocole. La particularité de Guacamole c’est qu’il est accessible via une interface web. Et c’est la toute l’utilité de la chose. Sur un serveur hébergé n’importe ou vous pourrez prendre la main sur vos machines.
Très simplement le serveur web publie l’interface graphique et réceptionne les ordres (clique, clavier, etc …) puis le service Guacd transforme ces informations pour les router vers le protocole souhaités (SSH, VNC, RDP).
Guacamole permet aussi la gestion d’utilisateurs différent et de droit différents en fonction de ce que l'on définit dans le fichier de configuration.
# Installation de guacamole
## Installation des paquets
### Installation du serveur
Pour installer Guacamole, rien de plus simple que d’installer le paquet correspondant par la commande ci dessous. Il est préférable d’être “root” pour cela.
```
sudo apt-get install guacamole
```
Durant l’installation, le système vous demandera si on veut redémarrez “le serveur Tomcat”, sélectionner “Oui”.
Le serveur Tomcat est une exigence car il sera utilisé pour servir le contenu du client Guacamole aux utilisateurs qui se connectent au serveur via un navigateur. Par conséquent, exécuter la commande suivante pour installer Tomcat:\\ \\ `sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user`\\ \\ Après l'installation, le serveur Tomcat doit être opérationnel, on peut confirmer l'état du serveur avec la commande suivante:\\ \\ `sudo systemctl status tomcat9`\\ \\ Si Tomcat n'est pas en cours d'exécution, il faut le démarrer et l'activer au démarrage:\\ \\ `sudo systemctl start tomcat9`\\ `sudo systemctl enable tomcat9`\\ \\ Par défaut, Tomcat s'exécute sur le port 8080 pour modifier cela il faut éditer le fichier `/var/lib/tomcat9/conf/server.xml` et redémarrer le serveur.
### Installation du client Guacamole
Une fois le serveur Tomcat installé, il faut procéder à l'installation du client Guacamole qui est une application Web basée sur Java qui permet aux utilisateurs de se connecter au serveur.
Tout d'abord, créer un répertoire de configuration comme indiqué.
```
sudo mkdir /etc/guacamole
```
Télécharger le binaire du client Guacamole dans le répertoire /etc/guacamole.
```
sudo wget https://downloads.apache.org/guacamole/1.2.0/binary/guacamole-1.2.0.war -O /etc/guacamole/guacamole.war
```
Une fois téléchargé, créer un lien symbolique vers le répertoire Tomcat WebApps.
```
ln -s /etc/guacamole/guacamole.war /var/lib/tomcat9/webapps/
```
Pour déployer l'application Web, redémarrer le serveur Tomcat et le démon Guacamole.
```
sudo systemctl redémarrer tomcat9
sudo systemctl redémarrer guacd
```
## Installation depuis les sources
### Prérequis
Tout d’abord, on commence par mettre à jour apt
```
apt update && apt upgrade -y
```
Installer toutes les dépendances et les paquets nécessaires:
```
apt -y install libcairo2-dev libjpeg62-turbo-dev libossp-uuid-dev libavcodec-dev libavutil-dev libswscale-dev libfreerdp-dev libpango1.0-dev libssh2-1-dev libtelnet-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev mariadb-server tomcat8 libmysql-java
```
### Construction des binaires
Se placer dans le dossier temporaire et télécharger guacamole-server puis décompresser l’archive:
```
cd /tmp
wget http://mirror.ibcp.fr/pub/apache/guacamole/0.9.14/source/guacamole-server-0.9.14.tar.gz
tar -xzf guacamole-server-0.9.14.tar.gz
```
Se placer dans le dossier guacamole-server pour lancer la compilation, on va commencer par vérifier les librairies présentes et leur appliquer les bons paramètres :
```
cd guacamole-server-0.9.14/
./configure --with-init-dir=/etc/init.d
```
Vérifier si tous les protocoles pris en charge ainsi que les deux services:
```
Protocol support:
RDP ....... yes
SSH ....... yes
Telnet .... yes
VNC ....... yes
Services / tools:
guacd ...... yes
guacenc .... yes
```
Si tout est ok, on peux compiler puis installer:
```
make
make install
```
Mettre à jour les caches systèmes des librairies installées:
```
ldconfig
```
Créer le service guacd pour pouvoir utiliser les commandes service guacd {start-stop-restart}:
```
systemctl enable guacd
```
### Guacamole-client
Créer trois dossiers permettant une configuration plus simple:
```
mkdir -p /etc/guacamole/lib
mkdir -p /etc/guacamole/extensions
```
Télécharger un fichier guacamole-client tout fait:
```
cd /tmp
wget http://mirror.ibcp.fr/pub/apache/guacamole/0.9.14/binary/guacamole-0.9.14.war
```
Placer le fichier dans le dossier `/etc/guacamole` puis créer des liens symboliques pour l’intégrer dans Tomcat, configurer la librairies freerdp et le connecteur java mysql:
```
mv guacamole-0.9.14.war /etc/guacamole/guacamole.war
ln -s /etc/guacamole/guacamole.war /var/lib/tomcat8/webapps/
mkdir /usr/lib/x86_64-linux-gnu/freerdp/
ln -s /usr/local/lib/freerdp/guac*.so /usr/lib/x86_64-linux-gnu/freerdp/
ln -s /usr/share/java/mysql-connector-java.jar /etc/guacamole/lib/
```
### Démarrer le service guacd
```
service guacd start
```
Installation terminée, On peut se connetcer sur le navigateur à l’adresse suivante : `
http://IP_GUACAMOLE_SERVER:8080/guacamole/`
Les identifiants par défaut sont: `guacadmin:guacadmin`
# Configuration de Guacamole
La configuration de Guacamole n’est pas répartie sur beaucoup d’éléments:
* un répertoire “home” le GUACAMOLE\_HOME: `/etc/guacamole`
* un ficher de configuration donnant la méthode de connexion à guacd: `/etc/guacamole/guacamole.properties`
* un fichier listant les utilisateurs et leurs droits: `/etc/guacamole/user-mapping.xml`
* un fichier pour le serveur Tomcat `/etc/guacamole/tomcat.xml`
* un fichier pour le serveur apache `/etc/guacamole/apache.conf`
## Configuration simple des utilisateurs
Dans le cas d’une configuration simple on a besoin d’éditer que le fichier **user-mapping.xml**. Ce dernier contient la liste des utilisateurs des protocoles et machines autorisées.
Dans le cas d’une “industrialisation de guacamole, on peut utiliser une base SQL (MySQL, PostgreSQL, ou Sql Server) pour stocker les utilisateurs et leurs droits.
Commencer par générer le mot de passe avec la commande suivante. Cela permettra de ne pas avoir le mot de passe affiché en clair dans le fichier de configuration.
Bien évidement, le md5 reste une sécurité extrêmement faible et insuffisante. Pour sécuriser les comptes utilisateurs de manières optimal, préférer une installation avec base de données ou les mots de passe seront chiffrés en sha256.
```
echo -n "mon_mot_de_passe"|md5sum
```
Puis éditer le fichier `/etc/guacamole/user-mapping.xml.`
```
nano /etc/guacamole/user-mapping.xml
```
```
ssh
192.168.1.250
22
rdp
192.168.1.253
3389
fr-fr-azerty
16
true
ssh
192.168.1.25
22
```
* Le fichier de configuration commence avec la balise `` et se termine avec la balise de fermeture ``.
* Le bloc `` permet de définir un utilisateur, son mot de passe ainsi que son mode de stockage, ici il est encodé en md5.
* Tout ce qui est compris entre la balise `` et `` concerne uniquement l’utilisateur déclaré.
* Ainsi plusieurs connexions peuvent être configurées pour cet utilisateur.
* `` permet de définir une connexion en indiquant son nom.
* Les blocs suivants `ssh` `192.168.1.250` `22` indiquent un protocol SSH vers une IP précise et le port utilisé par ce protocole.
Une seconde connexion est configurée, elle concerne un serveur Windows avec le protocole RDP sur le port standard 3389, avec des couleurs 16bit, un clavier français azerty, et une redirection des imprimantes connectées sur le serveur guacamole.
Un second utilisateur est configurés pour un connexion SSH vers un serveur nommé “srvlinux”.
Une fois configuré il suffira de se connecter au serveur via un navigateur web sur une adresse du type `http://ip_de_votre_serveur:8080/guacamole`, pour accéder à la page d’authentification.
Une fois connecté avec votre utilisateur, vous retrouverez les connexions précédemment configurées.
## Configuration du Backend mysql
Télécharger l’extension de base de donnée mysql puis la placer dans notre dossier `/etc/guacamole/extension` :
```
cd /tmp
wget http://mirror.ibcp.fr/pub/apache/guacamole/0.9.14/binary/guacamole-auth-jdbc-0.9.14.tar.gz
tar -xvf guacamole-auth-jdbc-0.9.14.tar.gz
cp guacamole-auth-jdbc-0.9.14/mysql/guacamole-auth-jdbc-mysql-0.9.14.jar /etc/guacamole/extensions/
```
Créer un fichier guacamole.properties:
```
nano /etc/guacamole/guacamole.properties
```
Avec pour comme contenu, la configuration pour la connexion à la base mysql:
```
mysql-hostname: localhost
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: P@$$w0rd
```
Redémarrer le service Tomcat afin qu’il prenne en compte nos modifications:
```
service tomcat8 restart
```
Se connecter à la base sql et créer la base guacamole, l’utilisateur guacamole_user et donner certain droit sur celle-ci:
```
mysql -u root -p
create database guacamole_db;
create user 'guacamole_user'@'localhost' identified by 'P@$$w0rd';
GRANT SELECT,INSERT,UPDATE,DELETE ON guacamole_db.* TO 'guacamole_user'@'localhost';
flush privileges;
quit
```
Copier les schémas des tables dans la base sql:
```
cat guacamole-auth-jdbc-0.9.14/mysql/schema/*.sql | mysql -u root -pP@$$w0rd guacamole_db
```
# Pour aller plus loin
## Application unique à distance
Fondamentalement, les hôtes de session Bureau à distance disposent de deux méthodes pour publier des applications:
- Initial program (Xorg backend)
- remoteApp (windows backend)
La différence, lors de la connexion via le programme Remote Desktop, réside dans le fait qu'avec **Initial Program**, on obtien un bureau vide (sans barre des tâches ni bouton de démarrage) dans le programme Remote Desktop contenant l'application. Avec **RemoteApp**, le programme distant apparaît seul sur l'ordinateur local. Ce n'est pas "à l'intérieur" de Remote Desktop. Donc, il semble que ce soit simplement une application native qu'on lancé sur l'ordinateur local.