Indice dei contenuti
Questo articolo è un aggiornamento del post Connettersi a Linux tramite Accesso Remoto: VNC, RDP, Windows Remote Desktop, XRDP, scritto a gennaio 2016 quando la versione più recente di Ubuntu Server era la 14.04, nota anche come Trusty Tahr: dopo oltre 4 anni e l'uscita di ben tre versioni LTS successive (Ubuntu 16.04 Xenial Xerus, Ubuntu 18.04 Bionic Beaver e Ubuntu 20.04 Focal Fossa) riteniamo utile pubblicare un aggiornamento della nostra guida su come connettersi a una macchina Ubuntu Server da un client Windows utilizzando il pratico software XRDP, un'implementazione open-source del Microsoft Remote Desktop Protocol per sistemi operativi Linux e BSD sviluppato da Jay Sorg a partire dal 2004 e costantemente aggiornato fino ad oggi.
Ovviamente, oggi come allora, la guida è compatibile non soltanto con Ubuntu Server ma con tutte le principali distribuzioni Linux, con piccole differenze legate al package manager predefinito (yum o dnf invece di apt nel caso di RHEL/CentOS) e ad alcuni path di sistema.
Installare un Desktop Environment
Poiché XRDP richiede un Desktop Environment, ovvero un'interfaccia utente grafica, la prima cosa da fare è verificare se la nostra macchina Ubuntu Server ne è già provvista oppure no. Il modo più semplice per farlo è mediante questo comando console:
ls /usr/share/xsessions/
che ci mostrerà instantaneamente un elenco delle sessioni X disponibili nella nostra installazione.
Nel caso in cui il comando di cui sopra non restituisse alcun risultato, occorrerà installare un Desktop Environment compatibile con XRDP come Gnome o Xfce.
Per installare Gnome, eseguite questi comandi:
sudo apt update
sudo apt install ubuntu-desktop
Se invece volete installare Xcfe, eseguite questi comandi:
sudo apt update
sudo apt install xubuntu-desktop
In entrambi i casi l'operazione impiegherà qualche minuto, nel corso dei quali il sistema effettuerà il download e l'installazione dei vari pacchetti necessari (e relative dipendenze).
Installare Xrdp
Fortunatamente, nel caso di Ubuntu Server, la versione più aggiornata di Xrdp è inclusa nei repository predefiniti. Questo significa che, per installarlo, dovremo semplicemente eseguire il seguente comando terminal:
sudo apt install xrdp
Una volta terminata l'installazione, il servizio Xrdp verrà avviato automaticamente. Per verificare che il servizio è in esecuzione, eseguite il seguente comando:
sudo systemctl status xrdp
E assicuratevi che l'output testuale contenga il tipico messaggio active (running) in verde.
Configurare Xrdp
La prima cosa da fare per configurare Xrdp è aggiungere l'utente omonimo (xrdp) all'interno del gruppo ssl-cert in modo che possa leggere il file /etc/ssl/private/ssl-cert-snakeoil.key creato durante l'installazione del software. Per farlo, eseguite questo comando:
sudo adduser xrdp ssl-cert
Quindi riavviate il servizio Xrdp per fare in modo che i cambiamenti abbiano effetto.
sudo systemctl restart xrdp
Questo passaggio è l'unico che dovremo effettuare: la configurazione predefinita di Xrdp è infatti già perfettamente utilizzabile, senza bisogno di modifiche particolari. Qualora abbiate bisogno di modificare le impostazioni di default potrete farlo agendo sul file /etc/xrdp/xrdp.ini, che contiene la maggior parte delle opzioni di configurazione che determinano il funzionamento del programma: fortunatamente il file è ricco di commenti esplicativi, che consentono di ccomprendere il funzionamento delle varie opzioni disponibili con relativa facilità.
Configurare il Firewall
La maggior parte delle distribuzioni Ubuntu Server vengono fornite con ufw (unobtrusive firewall) un firewall estremamente semplice da configurare. Se tutto quello che vogliamo fare è connetterci al server utilizzando la classica porta RDP (TCP 3389), non dobbiamo far altro che eseguire il seguente comando:
sudo ufw allow 3389
Attenzione, però: agire in questo modo significa consentire l'accesso alla nostra macchina server da qualsiasi client, con tutte le problematiche del caso in termini di sicurezza: basti pensare che un recente survey ha rilevato oltre due milioni di sistemi presenti sul web con porta RDP aperta e quindi esposti ad attacchi di vario tipo (Brute Force, Man in the Middle, pre-TLS sniffing, sfruttamento di bug come il noto CVE-2018-0976, e via dicendo). Poiché la porta 3389 è estremamente nota ai potenziali attacker e quindi intrinsecamente vulnerabile, l'ipotesi di tenerla aperta su un server di produzione è decisamente da evitare.
Un'opzione decisamente più sicura potrebbe essere quella di configurare il firewall in modo che le connessioni alla porta 3389 siano accettate solo da un indirizzo IP (o da un gruppo di indirizzi IP) predefinito, cosa che possiamo fare utilizzando il seguente comando:
sudo ufw allow from 192.168.0.1/24 to any port 3389
Avendo ovviamente cura di sostituire 192.168.0.1/24 con l'indirizzo IP o la netmask corrispondenti a quelli utilizzati dal nostro client. Questa seconda impostazione è decisamente molto più sicura della precedente: tuttavia, a ben vedere, possiamo fare ancora meglio di così.
Implementare un tunnel SSH con PuTTY
Un tunnel SSH è, in buona sostanza, un modo per far passare un flusso di comunicazioni (come ad esempio lo scambio di dati che avviene mediante il protocollo RDP) attraverso un canale criptato tramite Secure Shell. In altre parole, la connessione non avviene tramite la porta 3389 ma mediante la porta 22, e soltanto successivamente all'avvenuta autenticazione tra il client e il server mediante SSH.
Il vantaggio di procedere in questo modo è che la connessione RDP tra client e server avviene attraverso un canale criptato persino prima dello scambio delle chiavi previsto dal protocollo, proteggendo in tal modo la sessione remota da qualsiasi tentativo di intercettazione. Inoltre, poiché l'autenticazione SSH consente di essere effettuata mediante l'utilizzo di una coppia di chiavi RSA, potremo contare su una connessione notevolmente più sicura e protetta rispetto alle semplici credenziali username/password previste dal Remote Desktop Protocol.
Per implementare il tunnel SSH occorre effettuare alcune semplici operazioni sulla macchina client, ovvero:
- Installare un software SSH compatibile con Windows: il nostro preferito è PuTTY, scaricabile gratuitamente qui.
- Configurarlo in modo che effettui una connessione SSH tra client e server e un tunnel SSH da una porta locale apposita (nell'esempio che faremo tra poco utilizzeremo la 5555) alla porta 3389 remota, a cui ci andremo a connettere passando per la connessione SSH.
Configurare PuTTY
Una volta scaricato e installato PuTTY potremo impostare la nostra connessione SSH nel seguente modo:
- Selezionare il menu Session.
- Inserire l'indirizzo IP o l'hostname del server nella casella di testo Host Name (or IP address), lasciando la porta predefinita (22).
- Nel caso in cui avessimo necessità di impostare l'autenticazione tramite chiave SSH in luogo di quella tramite password, occorrerà inoltre recarsi all'interno della sezione Connection > SSH > Auth e inserire il percorso filesystem della chiave pubblica nella casella di testo Private key file for authentication, lasciando tutte le opzioni al loro posto.
Una volta impostata la connessione SSH potremo definire il tunnel SSH svolgendo le seguenti operazioni:
- Accedere alla sezione Connection > SSH > Tunnel.
- Inserire la porta 5555 nella casella di testo Source port.
- Inserire l'indirizzo localhost:3389 nella casella di testo Destination.
- Fare click su Add per aggiungere il tunnel SSH alla configurazione.
Fatto questo, è consigliabile tornare su Session e poi fare click su Save, così da memorizzare la sessione SSH comprensiva del tunnel appena creato: in tal modo sarà possibile richiamare la configurazione così impostata anche in futuro, senza dover ripetere i passaggi di cui sopra ogni volta.
Connettersi tramite RDP
Al termine di queste operazioni potremo finalmente connetterci al nostro server Linux tramite RDP effettuando due semplici passaggi sul client Windows:
- Lanciare PuTTY, caricare la configurazione salvata in precedenza utilizzando il pulsante Load, quindi fare click su Open per stabilire la connessione tramite SSH.
- Lanciare lo strumento Connessione Desktop Remoto e impostarlo per connettersi all'indirizzo localhost:5555.
Se tutto andrà come previsto riusciremo a connetterci alla nostra macchina Linux e a visualizzare la seguente schermata di login:
A quel punto non dovremo far altro che autenticarci con le credenziali dell'utente linux per accedere al desktop:
Conclusioni
Per il momento è tutto: ci auguriamo che questa guida possa essere d'aiuto agli amministratori di sistema che si trovano nella necessità di dover accedere ai propri server Linux (Ubuntu Server o altre distribuzioni analoghe) tramite Remote Desktop Protocol: alla prossima!