Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

Menu Home

Sostituire Azure Bastion con Apache Guacamole (Parte 1)

apache guacamole azure bastion rdp ssh vnc

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.

Per l’utilizzo del Jump Server sarà importante definire il network della nostra infrastruttura e configurare correttamente i Network Security Group così da garantire l’accesso sicuro alle nostre VM.

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à.

creazione vnet subnet azure

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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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
#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
#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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
systemctl status guacd
systemctl status guacd
systemctl status guacd

stato del servizio

L’applicazione web è scritta in Java, dovremo, quindi, installare un application server come Apache Tomcat:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#Install Tomact
sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user
#Install Tomact sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user
#Install Tomact
sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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
#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
#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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#Create Directory
mkdir -p /etc/guacamole
vi /etc/guacamole/user-mapping.xml
#Create Directory mkdir -p /etc/guacamole vi /etc/guacamole/user-mapping.xml
#Create Directory
mkdir -p /etc/guacamole

vi /etc/guacamole/user-mapping.xml
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<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>
<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>
<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>
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#Restart Tomcat
sudo systemctl restart tomcat
#Restart Tomcat sudo systemctl restart tomcat
#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:

Categories: Azure Blog Cloud Sistemi Windows

Tagged as: