Aller au contenu

Sécurité

Règles de pare-feu, service account dédié, durcissement Tomcat et verifications finales pour une installation Guacamole sécurisée.


Règles de pare-feu

Sécurité

Par défaut, GCP bloque tout le trafic entrant. Ajoutez uniquement les règles strictement nécessaires. N'ouvrez jamais le port 8080 a 0.0.0.0/0 (toutes les IPs) en production — limitez l'accès a votre IP ou a un CIDR contrôle. Utilisez un Load Balancer HTTPS en façade pour les déploiements publics.

Autoriser l'accès a Guacamole depuis votre IP

MON_IP=$(curl -s https://api.ipify.org)

gcloud compute firewall-rules create allow-guacamole \
  --direction=INGRESS \
  --action=ALLOW \
  --rules=tcp:8080 \
  --source-ranges="${MON_IP}/32" \
  --target-tags=guacamole-vm \
  --description="Acces Guacamole depuis IP admin"

Appliquez le tag à la VM :

gcloud compute instances add-tags guacamole-vm \
  --zone=europe-west1-b \
  --tags=guacamole-vm

Autoriser guacd a accéder aux VDI

gcloud compute firewall-rules create guacamole-to-vdi \
  --direction=INGRESS \
  --action=ALLOW \
  --rules=tcp:3389,tcp:22 \
  --source-tags=guacamole-vm \
  --target-tags=vdi-linux,vdi-windows \
  --description="guacd vers VDI (RDP + SSH) reseau interne"

Bloquer l'accès direct aux VDI

Les VDI ne doivent pas être accessibles directement depuis l'extérieur. Verifiez l'absence de règles autorisant les ports 3389 et 22 depuis des plages externes :

gcloud compute firewall-rules list \
  --filter="allowed.ports:(3389 OR 22)" \
  --format="table(name,direction,sourceRanges,targetTags)"

Si une règle existante ouvre ces ports vers 0.0.0.0/0, supprimez-là où remplacez-la par une règle source-tags.

Recapitulatif des règles

Règle Direction Ports Source Cible Usage
allow-guacamole INGRESS TCP 8080 Votre IP /32 guacamole-vm Interface web
guacamole-to-vdi INGRESS TCP 3389, 22 guacamole-vm vdi-linux, vdi-windows RDP + SSH internes
(GCP défaut) EGRESS Tout Tout Sorties autorisees

Service account dédié

La VM Guacamole ne doit avoir que le minimum de permissions nécessaires pour accéder à Cloud SQL.

Créer le service account

gcloud iam service-accounts create guacamole-vm \
  --display-name="Guacamole VM" \
  --description="Service account pour la VM Apache Guacamole"

Attribuer le rôle Cloud SQL Client

gcloud projects add-iam-policy-binding MON-PROJET-GCP \
  --member="serviceAccount:guacamole-vm@MON-PROJET-GCP.iam.gserviceaccount.com" \
  --role="roles/cloudsql.client"

Le rôle cloudsql.client permet la connexion a Cloud SQL via Private IP sans exposer les credentials de l'instance.

Attacher le service account à la VM

Si la VM est déjà déployée :

gcloud compute instances set-service-account guacamole-vm \
  --zone=europe-west1-b \
  --service-account=guacamole-vm@MON-PROJET-GCP.iam.gserviceaccount.com \
  --scopes=cloud-platform

Pour les prochains builds Packer, passez --service-account lors du déploiement de la VM (voir chapitre 03).


Durcissement Tomcat

Le rôle Ansible tomcat supprimé les webapps par défaut lors du build. Verifiez que ces suppressions sont effectives :

Vérifier l'absence des webapps par défaut

gcloud compute ssh guacamole-vm \
  --zone=europe-west1-b \
  --tunnel-through-iap \
  --command="ls /var/lib/tomcat9/webapps/"

Seul guacamole.war (et son répertoire déployé guacamole/) doit être present. Les webapps ROOT, docs, examples, host-manager et manager doivent être absentes.

Désactiver le directory listing

Dans /etc/tomcat9/web.xml, verifiez que le parametre listings est a false :

gcloud compute ssh guacamole-vm \
  --zone=europe-west1-b \
  --tunnel-through-iap \
  --command="grep -A2 'listings' /etc/tomcat9/web.xml"

Masquer la version Tomcat

Ajoutez dans /etc/tomcat9/server.xml au niveau du connecteur :

<Connector port="8080" protocol="HTTP/1.1"
           server=" "
           xpoweredBy="false"
           ... />

Le parametre server=" " remplacé la banniere Apache-Coyote/1.1 par un espace, evitant la divulgation de version dans les en-têtes HTTP.


Vérification Cloud SQL : Private IP uniquement

L'instance Cloud SQL ne doit pas avoir d'IP publique assignee :

gcloud sql instances describe guacamole-db \
  --format="json(ipAddresses)"

Toutes les entrees doivent avoir "type": "PRIVATE". Si une entree "type": "PRIMARY" (IP publique) existe, supprimez-la :

gcloud sql instances patch guacamole-db \
  --no-assign-ip

Assertions de validation

Connectez-vous à la VM et executez les verifications suivantes :

gcloud compute ssh guacamole-vm \
  --zone=europe-west1-b \
  --tunnel-through-iap

guacd écoute uniquement sur localhost

ss -tlnp | grep 4822

Résultat attendu : 127.0.0.1:4822 — guacd ne doit pas être accessible depuis le réseau externe.

Tomcat écoute sur 8080

ss -tlnp | grep 8080

Résultat attendu : 0.0.0.0:8080 (ou :::8080) — accessible uniquement via la règle de pare-feu.

VNC non compile dans guacd

ldd /usr/local/sbin/guacd | grep vnc

Résultat attendu : aucune sortie — libvnc ne doit pas être linkee.

Extension JDBC fonctionnelle

curl -s http://localhost:8080/guacamole/api/tokens \
  -d "username=guacadmin&password=VOTRE_MOT_DE_PASSE" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  | python3 -m json.tool | grep authToken

Un token doit être retourné, confirmant que la connexion JDBC vers Cloud SQL est opérationnelle.