Apache Guacamole: Guida all'installazione con Docker
Cos’è Apache Guacamole?
Apache Guacamole è un gateway desktop remoto clientless e open source, multipiattaforma e gratuito, gestito da Apache Software Foundation.
In parole semplici, permette di accedere da remoto a computer e applicazioni tramite un browser web, senza bisogno di installare alcun software aggiuntivo sul dispositivo da cui ci si connette.
Punti di forza:
• Accesso remoto sicuro: Le connessioni sono protette tramite crittografia SSL/TLS, garantendo la sicurezza dei dati trasmessi;
• Supporto a molteplici protocolli: Funziona con i protocolli standard RDP, VNC e SSH, offrendo una vasta compatibilità con diversi sistemi operativi e applicazioni;
• Clientless: Non richiede l’installazione di alcun software sul dispositivo client, semplificando l’utilizzo e la gestione;
• Piattaforma web: Funziona su qualsiasi browser web moderno, offrendo flessibilità e accessibilità da qualsiasi dispositivo;
• Open source: Essendo open source, offre la possibilità di personalizzare e adattare il software alle proprie esigenze specifiche;
Requisiti:
> Docker e Docker Compose;
> Server Linux o una VPS;
Prima di procedere volevo informarvi che, la guida che vi illustro oggi riguarda le immagini UFFICIALI di Guacamole, so che al di fuori esistono progetti ed immagini che vi fanno avviare in un unico container Guacamole + Guacd + il database ma, come spesso accade, questi progetti vengono ad un certo punto abbandonati dal creatore e quindi non più aggiornabili ecc. ecc.
…Iniziamo con la guida…
Dal terminale accertiamoci di aver installato le versioni recenti di docker e docker compose:
docker -v
docker compose version
Una volta verificato questo, andiamo a scaricare le immagini ufficiali da Docker Hub di Guacamole (il frontend), di Guacd (il backend) e di MariaDB (il database) con il comando:
docker pull guacamole/guacamole:latest
docker pull guacamole/guacd:latest
docker pull mariadb:10.9.5

Attendiamo che il processo finisca, vedrai una schermata simile a quella postata in alto. Una volta scaricate le immagini, andiamo a creare una cartella nella Home, quindi scriviamo il comando:
(questo comando è facoltativo)
mkdir ${HOME}/guacamole
cd ${HOME}/guacamole
Adesso dobbiamo inizializzare il db (database), quindi sul terminale andiamo a scrivere questo comando:
docker run --rm guacamole/guacamole:latest /opt/guacamole/bin/initdb.sh --mysql > initdb.sql
Il processo dovrebbe essere immediato in quanto abbiamo già scaricato le immagini in precedenza.
Fatto ciò, andiamo nella cartella creata in precedenza e creiamo un file
docker-compose.yml utilizzando l’editor di testo che più ci aggrada, nel mio caso nano
nano docker-compose.yml
nella schermata che ci appare (vuota), andiamo a copiare il codice per avviare il container di mariadb quindi:
version: '3'
services:
guacdb:
container_name: guacamoledb
image: mariadb:10.9.5
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'UnaPassword-Veramente-Forte'
MYSQL_DATABASE: 'guacamole_db'
MYSQL_USER: 'guacamole_user'
MYSQL_PASSWORD: 'UnaPassword-Veramente-Forte'
volumes:
- './db-data:/var/lib/mysql'
volumes:
db-data:
Assicurati di cambiare ed inserire una password forte ai seguenti valori:
MYSQL_ROOT_PASSWORD e MYSQL_PASSWORD
Annota la password di mysql root e lancia il comando:
docker compose up -d
Lanciato il comando per avviare il container dobbiamo copiare il file SQL nel container docker, eseguiamo quindi il comando:
docker cp initdb.sql guacamoledb:/initdb.sql
Adesso dobbiamo entrare nel container ed inizializzare il db, scrivi questi 3 comandi e, quando ti verrà richiesta la password devi utilizzare quella impostata nel campo “MYSQL_ROOT_PASSWORD”:
docker exec -it guacamoledb bash
cat /initdb.sql | mysql -u root -p guacamole_db
exit
Adesso possiamo stoppare ed eliminare il container “provvisorio” con il comando:
docker compose down
Attendiamo che il container si elimini e modifichiamo il nome del docker-compose.yml in docker-compose.yml.old
cp docker-compose.yml docker-compose.yml.old
Ora riapriamo il file docker compose con nano
nano docker-compose.yml
Ed eliminiamo tutto quello che c’è scritto al suo interno. Una volta finito andiamo a copiare il codice per creare il container docker di Guacamole / Guacd e MariaDB:
version: '3'
services:
guacdb:
container_name: guacamoledb
image: mariadb:10.9.5
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'UnaPassword-Veramente-Forte'
MYSQL_DATABASE: 'guacamole_db'
MYSQL_USER: 'guacamole_user'
MYSQL_PASSWORD: 'UnaPassword-Veramente-Forte'
volumes:
- './db-data:/var/lib/mysql'
guacd:
container_name: guacd
image: guacamole/guacd:1.4.0
restart: unless-stopped
guacamole:
container_name: guacamole
image: guacamole/guacamole:1.4.0
restart: unless-stopped
ports:
- 8080:8080
environment:
GUACD_HOSTNAME: "guacd"
MYSQL_HOSTNAME: "guacdb"
MYSQL_DATABASE: "guacamole_db"
MYSQL_USER: "guacamole_user"
MYSQL_PASSWORD: "UnaPassword-Veramente-Forte"
MYSQL_AUTO_CREATE_ACCOUNTS: true
depends_on:
- guacdb
- guacd
volumes:
db-data:
Alcune variabili d’ambiente di Guacamole che potrebbero tornarti utili sono:
environment:
WEBAPP_CONTEXT: ROOT # Può essere utilizzato se si vuole raggiungere la propria istanza guacamole senza la path /guacamole
TOTP_ENABLED: "true" # Consiglio di utilizzarlo, questo comando vi abilità l'autenticazione a due fattori
Configurare Authentik / OpenID (Facoltativo)
Se alla nostra istanza di Guacamole vogliamo aggiungerci un Layer di sicurezza aggiuntivo consiglio vivamente l’implementazione con Authentik. Per farlo, ci basterà aggiungere alcune regole sotto la voce “enviroment:” che ci farà collegare il nostro Guacamole con la nostra istanza di Authentik.
Per prima cosa, ricorda di non avviare il container, altrimenti l’integrazione avrà problemi (come successo più volte a me).
Colleghiamoci alla nostra istanza di Authentik e creiamo un Provider OAuth/OpenID ed una Applicazione a cui associarla (se non sai farlo, leggi la mia guida riguardo authentik).
A questo punto spostiamoci sul nostro amato terminale ed aggiungiamo le seguenti variabili d’ambiente:
OPENID_AUTHORIZATION_ENDPOINT: "https://authentik.dominio.com/application/o/authorize/"
OPENID_CLIENT_ID: # Qui va inserito il client ID
OPENID_ISSUER: "https://authentik.dominio.com/application/o/*Slug*/"
OPENID_JWKS_ENDPOINT: "https://authentik.dominio.com/application/o/*Slug*/jwks/"
OPENID_REDIRECT_URI: "https://guacamole.dominio.com/" # Qui va inserito l'indirizzo della nostra istanza Guacamole
EXTENTION_PRIORITY: '*, openid'
Finita la configurazione avviamo il container
docker compose up -d
In base alle vostre scelte nell’enviroment potrete collegarvi all’indirizzo:
http://indirizzoip:8080/guacamole (se non avete impostato l’enviroment webapp_context)
http://indirizzoip:8080/ (se invece avete impostato l’enviroment webapp_context).
La pagina che vi apparirà sarà la seguente:

Adesso andiamo a creare la nostra prima connessione, quindi dopo aver modificato utente e password principale rechiamoci nelle impostazioni successivamente su "Connessioni" e "Nuova connessione".
Diamo un nome alla connessione (nell'esempio SSH-GIUXFILA), decidiamo il protocollo (nell'esempio SSH):

Adesso rechiamoci nella sezione PARAMETRI ed inseriamo l'indirizzo IP e la porta, successivamente inseriamo le credenziali di accesso:

Adesso clicchiamo sotto il nostro nome utente e premiamo Home, sotto la voce "Tutte le connessioni" troviamo la nostra connessione appena creata e cliccandoci due volte saremo dentro la nostra amata Shell.