VNC è un acronimo che sta per Virtual Network Computing: è un programma che permette di controllare un computer remoto attraverso un qualsiasi tipo di rete. In termini molto semplici VNC non fa altro che mettere in comunicazione diretta due computer opportunamente configurati dando la possibilità di controllare, da una delle due macchine, il computer remoto come se si fosse fisicamente seduti davanti ad esso, utilizzandone se si vuole l’interfaccia grafica, il mouse e tutto quello a cui è possibile accedere con i privilegi dell’utente con cui ci si connette alla macchina remota.
VNC inizialmente è stato sviluppato dalla Olivetti per poi essere ceduto ai laboratori di ricerca di Cambridge della AT&T, ma la diffusione di massa del programma si è avuta solo con la nascita del progetto RealVNC nato da una costola del progetto iniziale per poi essere sviluppato in maniera autonoma. Oggi esistono varie versioni di VNC quali ad esempio il già citato RealVNC, TightVNC, UltraVNC etc. Il programma è disponibile per tutti i tipi di sistemi operativi e per quasi tutti i tipi di architetture hardware.
L’implementazione di VNC per ambienti GNU/Linux si basa su Xvnc, un server software che non si connette ad un display X reale, ma che si avvale di una sessione X11 fittizia verso la quale possono connettersi diversi client. È opportuno ricordare che X offre già nativamente la possibilità di eseguire un programma in un computer visualizzandone le finestre nel servente X di un altro computer. VNC, a differenza di questa implementazione, permette il collegamente verso una macchina GNU/Linux anche da parte di un’altra macchina che non abbia un server X installato come, ad esempio, un un PC con Windows. Inoltre un qualsiasi client VNC è è grande poco più di qualche centinaio di KB (può essere comodamente contenuto in un dischetto) e necessita di una configurazione veramente semplice da effettuare.
x11vnc è la versione di ‘VNC’ per GNU/Linux che ho scelto per la mia installazione Debian/GNU Linux e di cui troverete una guida all’utilizzo di base in queste pagine.
x11vnc è stato scritto da Karl Runge ed è disponibile nativamente per tutte le più conosciute distribuzioni GNU/Linux. Debian lo include già dalla versione stable del sistema con il nome di x11vnc (v. 0.7-1). Al momento della stesura di queste note l’ultima versione diponibile su Debian/unstable è la 0.7.2pre del 2005-03-04.
Al solito l’installazione del programma sotto Debian è di una semplicità estrema e si limita all’autenticarsi come root e al digitare da console il seguente comando:
apt-get install x11vnc
Apt si occuperà di reperire le eventuali dipendenze, scaricare i programmi necessari e di installare correttamente il tutto sul vostro Hard Disk. Ovviamente per effettuare questo lavoro potete avvalervi anche di un gestore di pacchetti analogo come Synaptic.
L’utilizzo di x11vnc si può riassumere nei seguenti due passi:
Aprire una shell testuale ed eseguire il programma sul computer del quale si vuole comandare da remoto la sessione X:
# x11vnc -display :0
Nell’esempio l’opzione -display indica al programma il nome della sessione X che il programma dovrà rendere disponibile ai client remoti (a meno di particolari configurazioni, la sessione X di default è sempre :0). Se non si verificano problemi la console dovrebbe mostrarvi come output alcune informazioni sull’esecuzione del programma, esempio:
... 15/05/2005 15:13:32 setting up 32 cursors... 15/05/2005 15:13:32 done. 15/05/2005 15:13:32 Autoprobing TCP port 15/05/2005 15:13:32 Autoprobing selected port 5900 15/05/2005 15:13:32 created 50 tile_row shm polling images. 15/05/2005 15:13:32 screen setup finished. 15/05/2005 15:13:32 15/05/2005 15:13:32 The VNC desktop is cucudeb:0 PORT=5900
x11vnc si è appena “collegato” alla sessione X cucudeb:0 e da questo momento in poi si metterà in ascolto sulla porta 5900, aspettando una o più richieste di connessione da parte di un client VNC.
L’avvio di x11vnc sulla macchina da controllare può avvenire anche da remoto collegandosi in un primo momento tramite telnet o ancora meglio SSH se tenete alla sicurezza della vostra macchina, e poi lanciando il programma con le opzioni desiderate.
E’ possibile far eseguire x11vnc come “servizio” in modo da averlo sempre pronto ad accogliere richieste di connessioni dall’esterno. Per questo sono disponibili diverse modalità, la più semplice delle quali richiede l’utilizzo dei file $HOME/.xsession o $HOME/.xinitrc (dipende dalle distribuzioni) che vengono richiamati ogni volta che un utente si autentica per entrare in una nuova sessione X. Un esempio dei comandi da inserire nei suddetti file potrebbe essere il seguente:
x11vnc -logfile $HOME/.x11vnc.log -rfbauth $HOME/.vnc/passwd -forever -bg
Le opzioni utilizzate nell’esempio sono:
$HOME/.x11vnc.log);x11vnc termina dopo la disconnessione dell’ultimo client collegato. L’opzione -forever modifica il comportamento di default del programma e mantiene x11vnc attivo in attesa di altre connessioni anche se l’ultimo client si è scollegato;
Se si sceglie di avviare x11vnc come “servizio” o con l’opzione -forever abilitata, è assolutamente raccomandato l’utilizzo di una password VNC per aumentare la sicurezza della connessione. Se si utilizzano i login manager kdm di KDE o gdm di GNOME, i file .xsession e .xinitrc vengono ignorati. In tal caso bisogna agire su file specifici dei due sistemi per ottenere lo stesso risultato. Per KDE è sufficiente inserire uno script o un link simbolico in $HOME/.kde/Autostart/, mentre per GNOME esiste una comoda interfaccia grafica raggiungibile da Preferenze–>Più Preferenze–>Sessioni.
Dalla postazione da cui ci connette al computer remoto che si vuole controllare deve essere eseguito un qualsiasi VNC viewer, cioè un client VNC in grado di connettersi al server x11vnc. Esistono decine di programmi simili per tutte le piattaforme hardware e software e tra i più utilizzati si distinguono TightVNC per piattaforma Windows e xtightvncviewer per Linux: questi due viewer in particolare implementano degli algoritmi di compressione che velocizzano la trasmissione dei dati tra server e client VNC rendendone l’utilizzo rapido ed affidabile. In questo esempio utilizzeremo proprio xtightvncviewer, ma in linea di massima i consigli riportati più sotto valgono per qualsiasi viewer deciderete di utilizzare.
Se non avete installato il programma è giunto il momento di porvi rimedio e come al solito apt verrà in nostro aiuto:
apt -get install xtightvncvievewr
Il programma verrà scaricato ed installato sul vostro sistema e sarà immediatamente pronto all’utilizzo. Ora non resta altro che aprire una shell testuale e provare ad inserire questo comando
xtightvncviewer -encodings Tight nomeserver
L’opzione -encodings obbliga il programma ad utilizzare un sistema di trasmissione dei dati tra server e client molto efficiente e veloce, mentre nomeserver rappresenta il nome del computer dove è in esecuzione il servente x11vnc e può essere sostituito dal suo indirizzo IP. Se non ci sono problemi dovrebbe aprirsi una schermata dove è rappresentato il desktop reale del computer a cui si è connessi e del quale si può utilizzare immediatamente, tramite mouse o tastiera, tutto ciò che è accessibile con i privilegi dell’utente proprietario della sessione X che si sta utilizzando. Ovviamente le opzioni di xtightvncviewer non si limitano a quelle rappresentate nell’esempio, ma per maggiori approfondimenti vi rimando alle pagine man del programma.
Gli esempi sopra riportati sono efficaci e rapidi da implementare, ma non hanno la benché minima sicurezza e mettono a repentaglio la vostra privacy: un utente evoluto potrebbe infatti intecettare le comunicazioni tra client e server VNC ed ottenere facilmente le vostre password. Si rende quini necessario incanalare le informazioni scambiate tra client e server all’interno di un protocollo di rete sicuro quale SSH.
SSH sta per Secure Shell ed è un protocollo che permette di stabilire una sessione remota interagendo con un’altra macchina e permettendo l’esecuzione di comandi. SSH opera in maniera analoga ad altri protocolli quali telnet, ma con l’importante differenza che l’intera comunicazione così come l’invio di password avviene in maniera crittata. SSH ha un interfaccia a solo testo e per questo non può rappresentare un’alternativa all’utilizzo di VNC.1)
L’implementazione SSH in ambiente GNU/Linux prende il nome di OpenSSH e la sua installazione sotto Debian si limita ad un semplice:
apt-get install openssh-client openssh-server
La configurazione di SSH esula da questa guida e per questo vi rimando alle ottime pagine man del programma ed al sito OpenSSH.org.
Una volta che il server SSH è stato installato e configurato correttamente si passa alla configurazione del server VNC.
Per ottenere il massimo della sicurezza il servente x11vnc deve essere impostato per accettare solo le connessioni attraverso il tunnel SSH: permettere le connessione al servente VNC anche al di fuori del tunnel SSH vanificherebbe ogni sforzo fatto per rendere sicura la connessione client ↔ server. L’opzione -localhost assolve a quanto richiesto, quindi riprendendo l’esempio di poco più sopra:
x11vnc -logfile $HOME/.x11vnc.log -rfbauth $HOME/.vnc/passwd -forever -bg -localhost
Da ora in poi x11vnc riponderà solo alle richieste di connessioni provenienti da localhost, cioè dall’interfaccia 127.0.0.1 che equivale a dire dalla stessa macchina su cui il servente VNC è installato; questo accade perché quando si crea un tunnel SSH è lo stesso server SSH (quindi in localhost) ad aprire una connessione verso la porta a cui punta il tunnel.
Se ci si sta collegando da una macchina GNU/Linux basta eseguire il seguente comando:
ssh -L 5900:127.0.0.1:5900 nome_server
Il comando sopra riportato indica che le connessioni effettuate sulla macchina locale alla porta 5900 (porta di default utilizzata dal client VNC) verranno incanalate nel tunnel SSH alla porta 5900 (porta di default del server VNC) della macchina remota sull’interfaccia localhost (127.0.0.1). In questo esempio le porte agli estremi del tunnel sono uguali in quanto abbiamo utilizzato le porte di default di VNC, ma possono essere diverse: basta avere l’accortezza di configurare client e server VNC in modo che utilizzino le porte desiderate.
Una volta che si è instaurata la connessione SSH con il server ospitante x11vnc, è sufficiente eseguire il client per connettersi a localhost:0, ovvero alla porta 5900 della macchina locale (il client), al primo estremo del tunnel.
xtightvncviewer -encodings Tight localhost:0
La connessione verrà stabilita automaticamente ed in modo del tutto trasparente alla porta 5900 della macchina remota (il server) dove il servente x11vnc è in ascolto.
In questo caso è molto importante non tralasciare l’opzione -encodings tight. Il client VNC, infatti, abiliterebbe di default il poco efficiente encoding raw, “ingannato” dal fatto che la connessione VNC viene effettuata sulla stessa macchina (localhost). raw, non effettuando alcuna compressione sui dati inviati, risulterebbe infatti la scelta migliore quando client/server sono su una rete senza problemi di banda o risiedono sulla stessa macchina. Dichiarare esplicitamente l’utilizo di un encoding diverso risolve il problema.
Nell’esempio proposto sopra si è fatto ricorso all’opzione -rfbauth di x11vnc. Con questa opzione si indica al server VNC di richiedere una password ad ogni client che tenta il collegamento: l’autenticazione si basa sulla richiesta di una password memorizzata in modalità crittata nel file passato come argomento a -rfbauth. Riprendendo l’esempio appena citato:
x11vnc -rfbauth $HOME/.vnc/passwd
Il file passwd contenuto nella home dell’utente all’interno della directory nascosta .vnc, conterrà la password che il servente VNC chiederà ai client che avviano una connessione. Il percorso appena citato è il percorso standard dove il programma vncpasswd di VNC memorizza la password crittata. Se non lo avete ancora installato:
apt-get install vnc-common
Ora potete creare la password da utilizzare con x11vnc, facendo attenzione al fatto che la stessa deve essere più lunga di 5 caratteri.
rbnet@linuxdeb:~/.vnc$ vncpasswd Password: Verify: rbnet@linuxdeb:~/.vnc$
vncpasswd accetta come opzione un percorso alternativo per il file che conterrà la password crittata. Se, come nell’esempio, il programma viene eseguito senza alcuna opzione sulla riga di comando, la password verrà memorizzata nel già visto file $HOME/.vnc/passwd.
E’ possibile creare la password senza ricorrere a vncpasswd, ma avvalendosi dell’opzione -storepasswd di x11vnc, es:
x11vnc -storepasswd ‘sword*fish’ $HOME/.vnc/passwd
La password “sword*fish”, inserita tra apici per permettere l’interpretazione corretta del meta-carattere “*”, verrà salvata nel solito file $HOME/.vnc/passwd. In questo caso, a differenza di quanto visto per il programma vncpasswd, indicare il percorso al file che conterrà la password è obbligatorio!
Ricordate che la misure adottate per aumentare la sicurezza di una connessione VNC non sono mai abbastanza. L’utilizzo di una connessione SSH o di una password VNC non sono gli unici metodi utilizabili per aumentare la sicurezza della connessione e, soprattutto, non le rendono automaticamente sicure. x11vnc (e gli altri client/server VNC) adottano vari metodi per cercare di aumentare la sicurezza di una connessione VNC. In ogni caso nessuna delle soluzioni proposte può considerarsi priva di lati deboli.