Con Microsoft Azure abbiamo a disposizione il servizio PaaS Azure Bastion che permette l’accesso sicuro alle istanze virtuali in cloud, tramite una comoda interfaccia web, senza la necessità di esporre le porte RDP e SSH. Di fatto parliamo di un Jump Server totalmente integrato nell’Azure Portal.
Il diagramma a seguire mostra l’architettura delle SKU Basic e superiori:
Il servizio è oggettivamente ottimo, tranne per il costo che oggi parte da circa 130€/mese nella Region Italy North. E’ bene sottolineare che Microsoft ha recentemente introdotto anche una SKU Developer, gratuita, ma che, oltre ad avere delle limitazioni, non è disponibile in tutte le aree geografiche.
Un ulteriore dettaglio sui costi a questo indirizzo: Azure Bastion pricing.
Una soluzione alternativa, che però mi sento di consigliare solo per uso laboratorio o per le fasi iniziali di un progetto, può essere Apache Guacamole. Parliamo di un gateway di accesso remoto clientless (VNC, RDP, SSH). Quindi, come per Azure Bastion, non sarà neccessario null’altro che un browser web per accedere alle macchine virtuali.
In questo ambiente di test ho creato le risorse come segue:
Saranno presenti due subnet distinte, la prima (snet-gateway) per una macchina linux su cui installerò Guacamole, la seconda (snet-vm) per la VM a cui accedere da remoto.
Per comodità il Jump Server avrà un indirizzo IP pubblico, ma potremmo collegarci via VPN (P2S, S2S) all’host. In ogni caso, tramite il NSG del gateway, vincolerò gli accessi all’indirizzo IP pubblico della mia connettività.
Per la configurazione del gateway ho preparato una macchina virtuale con Ubuntu 22.04 LTS (minimal), una volta eseguiti tutti gli aggiornamenti installeremo i pacchetti necessari:
#Update and Upgrade System sudo apt-get update && sudo apt-get --yes upgrade #Install Build Tools sudo apt install --yes build-essential #Install Guacamole Dependencies sudo apt install -y gcc nano vim curl wget g++ libcairo2-dev libjpeg-turbo8-dev libpng-dev libtool-bin libossp-uuid-dev #Install Optional Dependencies sudo apt install --yes 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 # Install runtime dependencies sudo apt install --yes --no-install-recommends netcat-openbsd ca-certificates ghostscript fonts-liberation fonts-dejavu xfonts-terminus
Ora sarà necessario scaricare i sorgenti di Guacamole direttamente dai repository di Apache e decomprimere il file che li contiene:
wget https://downloads.apache.org/guacamole/1.5.5/source/guacamole-server-1.5.5.tar.gz tar -xzf guacamole-server-1.5.5.tar.gz
Passiamo alla compilazione del pacchetto e alla installazione e configurazione del servizio:
cd guacamole-server-1.5.5 ./configure --with-init-dir=/etc/init.d make sudo make install sudo ldconfig sudo systemctl daemon-reload sudo systemctl start guacd sudo systemctl enable guacd
Verifichiamo che il servizio sia attivo:
systemctl status guacd
L’applicazione web è scritta in Java, dovremo, quindi, installare un application server come Apache Tomcat:
#Install Tomact sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user
#Download Guacamole Web Application wget https://downloads.apache.org/guacamole/1.5.5/binary/guacamole-1.5.5.war #Install Web Application sudo mv guacamole-1.5.5.war /var/lib/tomcat9/webapps/guacamole.war sudo systemctl restart tomcat9 guacd
Passiamo alla configurazione degli utenti e delle connessioni:
#Create Directory mkdir -p /etc/guacamole vi /etc/guacamole/user-mapping.xml
<user-mapping> <authorize username="guadmin" password="guadmin"> <connection name="JumpBox"> <protocol>ssh</protocol> <param name="hostname">localhost</param> <param name="port">22</param> </connection> <connection name="vm-server-01"> <protocol>rdp</protocol> <param name="hostname">vm-server-01</param> <param name="port">3389</param> <param name="username">insertyourusername</param> <param name="password">insertyourpassword</param> <param name="ignore-cert">true</param> </connection> </authorize> </user-mapping>
#Restart Tomcat sudo systemctl restart tomcat
Da adesso potremo collegarci tramite browser all’indirizzo pubblico del nostro applicativo: http://publicip:8080/guacamole/
E da qui potremo accedere direttamente al nostro server Windows (vm-server-01) via RDP:
Già in questo modo abbiamo ottenuto la possibilità di collegarci alle nostre VM senza dover utilizzare Azure Bastion, questo utilizzando una istanza Standard B2s che ha un costo circa 35€/mese. Non serve dire che gli stessi principi di questa guida possono essere applicati anche ad altre tipologie di ambienti, on-premises o su altri cloud provider.
Nel prossimo episodio su Guacamole configureremo il database che ci permetterà di editare le configurazioni delle connessioni direttamente dal portale web, https con certificato Let’s Encrypt e la Two-Factor Authentication.
Per quanto riguarda Azure Bastion vi segnalo l’ottimo video di Luca Torresi: