https://unsplash.com/fr/photos/plat-cuisine-m3M8TC_3rGY
| |

Apps – GUACAMOLE Partie 2 : Pratique

Cet article, notamment la partie pratique a été un sacré défi. J’ai presque déposé les armes. J’ai fait un pas en avant puis deux en arrière.

Pourquoi c’est vraiment si compliqué que ça d’installer Guacamole ?

Non pas compliqué du tout, mais j’ai voulu faire les choses « simples » pour changer. Je n’ai pas souhaité installer Tomcat depuis le gestionnaire de package mais installer ce dernier depuis les sources et donc il ne faut pas suivre bêtement le guide Guacamole.

J’ai tellement fumé des méninges que Tezcatlipoca n’était pas loin de me couper les ailes et de me pousser à l’exil… (Oui je pars en délire sur le monde amérindien et la culture mexicaine).

Mais bon le sacrifice en vaut largement la chandelle car c’est au bout de tout cela que je vais trouver mon El Dorado à l’inverse de Cortés.

Normalement, si vous suivez ce guide et l’ensemble des références vous devriez avoir un système bien durci. J’aimerais d’ailleurs bien trouver quelqu’un pour pentester mon système.

Place à l’action !

Dépendances

Pour les dépendances, j’ai décidé de ne pas mélanger les sujets. Après réflexion, ayant déjà réalisé un article sur MariaDB, je me suis dit que j’allais faire de même pour Tomcat et faire tout simplement une référence à ces derniers dans ce billet. Cela devrait rendre plus digeste le déploiement.

SGBD : MariaDB

Pour la procédure, c’est par là que ça se passe : Lien

Concernant la configuration de la BDD1 et des Users nous aborderons ce point dans la partie configuration.

Tomcat

Pour la procédure, c’est par là que ça se passe : Lien (Que d’originalité… Merci, je sais).

Guacamole

L’installation se déroulera en deux temps. Un temps pour le serveur Guacamole et un second pour l’application.

Guacamole – Server

Toujours pour faire simple, je vais installer l’application nativement et donc compiler cette dernière. Pour rester cohérent, je vais installer Guacamole à côté de Tomcat sous /opt.

Qui dit installation par compilation dit ? Création d’un groupe et utilisateur dédié à notre daemon Guacamole. Les SysAdmin qui font tout tourner en tant que root, je ne sais pas comment vous faites niveau sécu et diag de vos logs…

Créons le groupe et l’utilisateur de service guacamole

Je vais plus loin en définissant le home du compte de service dans /var/lib/guacd. Il convient également de définir les bonnes permissions sur le répertoire home.

Comme dit plus haut, nous allons installer notre daemon guacamole sous /opt, donc nous devons créer le répertoire adéquat.

Nous sommes maintenant parés pour l’installation.

Dépendances

Le daemon Guacamole (que nous appellerons guacd) nécessite des dépendances dont certaines se trouvent dans le répo en développement. Il faut ajouter ou plutôt autoriser les packages en développement CRB2. En règle générale, si nous sommes amenés à réaliser des compilations, il est préférable d’activer le repository.

Le repository est bien présent. Il nous faut maintenant installer les dépendances en cours de développement (le fameux *-devel dans les noms des paquets). Il est possible selon les distributions que les noms changent.

Niveau dépendance pour la compilation nous sommes au poil. Reste toutefois les dépendances propres à Guacamole pour se connecter aux ressources ainsi que pour l’usage de certaines fonctionnalités. Pour ce faire, il va falloir ajouter un repo pour les packages vidéo (mpeg), rdp, ssh etc.

Nous ne sommes pas obligés d’installer toutes les fonctionnalités présentes dans Guacamole. Pour ma part je ne souhaite utiliser Guacamole que pour établir des connexions RDP3 et SSH4. J’ai également besoin des dépendances pour enregistrer les flux vidéo. Je n’ai nullement besoin de VNC5, les websockets pour Kubernetes ou de telnet.

Et voilà, c’est tout. Nous avons déjà passé pas mal de temps ensemble déjà non ? Et bien il faut savoir que nous n’avons pas encore réellement commencé à jouer avec Guacamole. Nous avons juste tourné autour.

Là s’arrêtent les dépendances, Ici commence Guacamole !

Installation

L’installation se passe par le téléchargement du package guacamole-server-1.6.0.tar.gz dans sa dernière version.

J’ai pour habitude d’utiliser curl et non wget, wget n’étant pas nativement déployé sur RockyLinux. Bref, nous retrouverons cette commande tout au long de ce billet. C’est pourquoi j’expliquerai qu’une seule fois les arguments de cette commande.

  • -L : Permet d’autoriser les liens annexes lors du téléchargement
  • –output-dir : Définir le répertoire où doit être stocké le fichier téléchargé
  • -O : Préciser l’URL6 de l’élément que nous voulons télécharger

Idem que pour l’explication de la commande, j’ai pour habitude de toujours vérifier les empreintes des éléments téléchargés.

Pour deux raisons :

  • Vérifier que la ressource n’a pas été altérée
  • Vérifier que la ressource est complète

Je ne mettrai pas à chaque fois cette commande dans les multiples téléchargements qui vont être réalisés. Toutefois vous avez les éléments et savez comment faire, si vous l’ignoriez 🙂

Le hash est conforme. Hourra. Hourra ?! Nous pouvons donc extraire l’archive tar.gz. Attention où vous êtes, vous devez être pour plus de simplicité dans /opt/guacamole 🙂

Déplacez-vous dans le répertoire que nous venons d’extraire, puis lancez la configuration pour vérifier que tout est conforme et qu’il ne manque pas une dépendance, la compilation afin que le MakeFile soit généré puis l’installation de Guacamole.

La dernière commande va mettre à jour les bibliothèques système et va mettre à jour le cache des liens symboliques. Sinon, nos programmes ne trouveront pas les bonnes bibliothèques.

0 – Configure Start
1 – Configure Summary

Nous avons donc le résultat que nous souhaitons et pas d’erreur. La petite synthèse en fin de notre commande nous rassure quant à ce que nous allons réaliser comme opération. Certains SysAdmin vous diront que la compilation c’est ce qu’il y a de plus safe. C’est la mentalité de la branche Slackware. J’avais une ancienne connaissance de cette école et je pense que je vais m’y mettre également.

2 – Make

L’un des points négatifs de compiler ces applications c’est que rien n’est fait automatiquement comme lors de l’usage de commandes dnf install par exemple. Et donc là il va falloir enregistrer notre service dans systemd afin que celui-ci puisse être démarré, arrêté, redémarré manuellement ou automatiquement.

Pour cela, rien de plus simple, il suffit de créer le fichier sous /etc/systemd/system/

Puis de renseigner ce dernier comme suit :

[Unit]
Description=Guacamole proxy daemon (guacd)
After=network.target

[Service]
Type=simple
User=guacamole
Group=guacamole

ExecStart=/usr/local/sbin/guacd -f -b 127.0.0.1 -l 4822

Restart=on-failure

#Hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
MemoryDenyWriteExecute=true
LockPersonality=true

#Limiter accès filesystem
ReadWritePaths=/var/lib/guacd

[Install]
WantedBy=multi-user.target

Il faut garder ce fichier en tête. Car comme vous pouvez le constater, il y a une part de hardening sur laquelle, je reviendrai plus tard.

Il ne reste plus qu’à recharger le gestionnaire systemd puis à lancer notre daemon Guacamole. Si ce dernier est démarré, nous pouvons le configurer pour démarrer automatiquement.

Le plus gros du chemin a été fait. Notre daemon Guacamole est fonctionnel et opérationnel.

Guacamole – Client

Là encore une fois, j’ai voulu faire bien et je me suis tellement compliqué la vie que j’ai décidé d’abandonner.

Donc tu nous lâches à la moitié du chemin ? Tu aurais pu nous informer avant non tu crois pas ? Espèce d’enf**ré !

Je comprends que dit comme ça, cela peut porter à confusion. En réalité, je vais mettre deux méthodes pour utiliser Guacamole. L’une via la compilation du client (qui m’a frustré) et le téléchargement de l’application directement. Comme ça libre à vous de reprendre mes travaux là où je les ai stoppés.

Installation

J’ai dans un premier temps voulu compiler mon client Guacamole comme j’ai compilé mon serveur Guacamole. Jusque-là, logique non ? Puis lors de la compilation ça fail sur une librairie java… Je me farcis donc les logs de compilation et me rend compte que cela est dû à la génération de la javadoc… Après investigation, il est possible de bypass cette erreur en excluant la partie documentation.

J’ai lâché l’affaire à ce moment-là. Frustré. J’aurais pu persévérer mais voyez-vous, je sais que le mieux est l’ennemi du bien. Donc, pour ne pas tomber dans le piège du perfectionniste qui aura un paquet fonctionnel mais possiblement avec des dysfonctionnements à moyen ou longs termes, j’ai décidé de changer mon fusil d’épaule et d’appeler Zorro.

J’ai donc pris la dure décision de télécharger directement l’application au point .war depuis le site officiel.

Une fois télécharger, il convient alors de déplacer le fichier directement dans le répertoire webapps de tomcat. Vous noterez que j’ai renommé le guacamole-1.6.0.war en guacamole.war. Cela aura son importance dans notre URL d’accès. Il est nécessaire de définir la propriété a l’utilisateur de service tomcat sur notre application. Sinon elle ne pourra pas être lancé par Tomcat.

Et maintenant c’est terminée pour Guacamole. Le reste sera que de la configuration…

Configuration

Il va falloir être rigoureux car la configuration à la moindre erreur peut devenir aussi punitive qu’un mauvais pattern dans un fromsoftware… Oui je suis de ce genre de type à prendre du plaisir sur les Souls Like, à la limite du masochisme… 🙂

Le commencement sera donc de créer le répertoire de notre service guacamole. Ce répertoire contiendra le fichier de configuration ainsi que le répertoire propre aux extensions ainsi que le répertoire pour les bibliothèques.

Il subsiste un petite putass**ie pour le connecteur MariaDB avec Guacamole. Je me suis dit et en suivant le guide officiel qu’utilisant MariaDB il me faudrait uniquement le connecteur Java MariaDB… Erreur Grave dirait Coluche…

Bref, j’ai installé le paquet depuis le repo puis j’ai déplacer le .jar dans le répertoire /etc/guacamole/lib (avec les bons droits).

Pourtant si je regarde les logs catalina.out il nous sera retourné que l’application Guacamole n’arrive pas a établir de connexion avec la base de données. Et là croyez-moi, j’ai pas mal cherché si c’était côté hardening de mon côté ou si c’était sur la couche 7. Et donc conclusion ? Il nous faut le connecteur java pour mysql également…

Bref, on télécharge le connecteur sur le site officiel mysql, on check le hash, on décompresse et l’on déplace le .jar sous /etc/guacamole/lib.

Nous allons préparer et configurer notre base de données Mariadb. Connectons nous directement à notre BDD en root.

A partir de maintenant toutes les commandes seront des commandes SQLs7. Je vais créer la base de données (vide naturellement) et définir notre utilisateurs et les permissions de ce dernier sur la base.

Naturellement, libre à vous de changer le nom de la BDD ou de l’utilisateur ainsi que du mot de passe. Une fois les privilèges flush, quittez le terminal et vérifiez que vous pouvez vous connecter à la base de données guacamole avec notre utilisateur fraichement créé. (Oui la capture d’écran n’est pas le reflet exact des commandes tapées :)).

Maintenant que notre instance est prête, allons chercher la structure ainsi que le connecteur JDBC8 guacamole. Pour se faire téléchargeons le connecteur depuis le site officiel Guacamole :

Vérifions son empreinte puis réalisons l’extraction. Attention où vous vous situez 🙂

Déplacez vous dans le répertoire fraichement extrait /tmp/guacamole-auth-jdbc-1.6.0/mysql. Naturellement si vous avez choisi en SGBD9 PostgreSQL ou MSSQL10 vous n’allez pas dans ce répertoire. Il ne faut pas suivre le guide aveuglément… A l’intérieur du répertoire nous avons deux fichier *.sql. Un fichier qui va créer la structure de notre BDD et le second fichier pour créer l’utilisateur guacadmin. Exécutons les deux fichiers.

Nous pouvons vérifier que tout est fonctionnel en affichant par exemple les tables de la BDD guacamole.

Dernière étape pour en finir avec la configuration de la base de données, il nous faut déplacer le connecteur jdbc pour guacamole dans le répertoire /etc/guacamole/extensions.

Normalement nous avons fait le plus gros du travail. Le reste sera une parti de plaisir à côté de ça.

Maintenant il va falloir dire avec tact et diplomatie à notre serveur Tomcat les variables d’environnement liées à Guacamole et où ce dernier doit aller chercher les ressources.

Pour ce faire, nous allons créer un fichier setenv.sh sous le répertoire binaire de tomcat /opt/tomcat/bin.

Nous précisons où pointe la variable GUACAMOLE_HOME puis nous allons mettre à jour sans écraser le contenu de la variable JAVA_OPTS pour définir la propriété système guacamole.home soit initialisé à /etc/guacamole.

GUACAMOLE_HOME=/etc/guacamole
export JAVA_OPTS="$JAVA_OPTS -Dguacamole.home=/etc/guacamole"

Nous ajustons les permissions pour que tomcat puisse exécuter le fichier.

Il nous faut autoriser notre application Guacamole a être accessible sur notre firewall. Il va donc falloir autoriser notre bon vieux protocole http sur le port 8080/tcp.

T’es sérieux là ?

Oui bah c’est comme ça que ça vous plaise ou non. Il n’y a pas de possibilité avec Guacamole de faire du HTTPS11 nativement. Mais soyez certains que je vais remédier à cela dans la partie sécurité. Pour le moment nous nous suffirons de ça.

Dernière arrêt, Acapulco les enfants, terminus de notre voyage. Nous pourrons admirer les anges volants tout en admirant l’animosité pacifique de l’océan.

Nous allons créer le fichier de propriété de guacamole pour que ce dernier puisse se connecter aux différentes ressources (bdd, serveur guacamole). Ce fichier évoluera dans la partie suivante.

# Paramètres MariaDB
mysql-driver: mysql
mysql-hostname: 127.0.0.1
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: VotreMotDePasseFort

# Paramètres guacd
guacd-hostname: localhost
guacd-port: 4822

Il nous faut alors définir les droits et s’assurer du bon niveau de sécurité.

C’est maintenant l’heure de se servir une cerveza bien fraiche avec quelques nachos et de taper dans notre Guacamole pour voir quel gout il a !https://unsplash.com/fr/photos/plat-cuisine-m3M8TC_3rGY

Test

Il ne faut pas oublier de passer sur notre UTM12 en amont pour autoriser dans un premier temps notre rebond à communiquer avec notre VM13 Guacamole sur le port 8080/tcp.

Dans notre navigateur web, rendons-nous à l’URL http://ip-srv:8080/guacamole. Si tout va bien, nous devrions voir s’afficher la page d’authentification de notre serveur Guacamole.

Authentifions nous avec le login et mot de passe par défaut guacadmin/guacadmin.

Il ne nous reste alors qu’à créer un nouvel super administrateur et désactiver/supprimer le compte guacadmin par sécurité. Dans l’état, notre bastion est opérationnel. Il faut tout de même sécuriser et renforcer la sécurité de ce dernier.

Je ne pense pas utile de me poser sur la configuration de création et de connexion à une ressource. Je ferai cela dans une partie 4 dans une vidéo de démo.

Place à l’assaisonnement de notre serveur Guacamole, pardon à sa sécurisation 🙂

Sources

Guacamole : Théorie
<-
Apps GuacamoleGuacamole : Sécurité
->

  1. BDD : Base De Données ↩︎
  2. CRB : CodeReady Builder ↩︎
  3. RDP : Remote Desktop Protocol ↩︎
  4. SSH : Secure SHell ↩︎
  5. VNC : Virtual Network Computing ↩︎
  6. URL : Uniform Resource Locator ↩︎
  7. SQL : Structured Query Language ↩︎
  8. JDBC : Java DataBase Connectivity ↩︎
  9. SGBD : Système de Gestion de Base de Données ↩︎
  10. MSSQL : Microsoft Server SQL ↩︎
  11. HTTPS : HyperText Transfer Protocol Secure ↩︎
  12. UTM : Unified Thread Management ↩︎
  13. VM : Virtual Machine ↩︎