Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Immutable Page
  • Info
  • Attachments


Introduzione

Lo scopo di questa guida è quello di:

  • usare software VNC per l'amministrazione da remoto del proprio home computer. Impiegando un server VNC (ad esempio vino-server presente fin dalla prima installazione in Ubuntu) sulla propria macchina e tramite una opportuna password consentire ai client VNC (siano essi Windows, Unix che OS X), di ricevere una immagine dello schermo e di inviare input di tastiera e mouse al computer server. In pratica gestire il computer server da un'altra postazione, come se fosse il proprio home computer.
  • Chiarire come configurare un server SSH sul proprio home computer usando solamente chiave pubblica e privata, su una porta non standard.
  • Creare un tunnel instradando tutto il traffico VNC sulla connessione SSH.

Al termine di questo tutorial, saremo in grado di connettere al proprio home computer qualunque altro PC.

In questa guida si assume che l'utente abbia un router/firewall e che sappia come aprirne le porte. L'utente possa in oltre trasportare la propria chiave privata ad esempio tramite una penna USB o un CD o qualunque altro tipo di supporto di memorizzazione mobile.

Queste istruzioni sono state testate su Ubuntu Dapper e Edgy ma in teoria dovrebbero essere usabili su qualunque altra Linux box (ad esclusioni di specifici comandi, ovviamente).

In realtà non c'è una ragione per crittare il traffico VNC dato che è codificato e molte volte crittato e, per poter sniffare il traffico l'attaccante dovrebbe avere accesso in entrambi i due computer connessi. Pertanto non ci sarebbe la necessità di crittare il traffico VNC; in ogni modo ci sono perlomeno un paio di buone ragioni per attuare questa tecnica:

  1. Incrementare la sicurezza. L'attaccante deve compromettere diversi livelli di sicurezza per danneggiare il sistema e l'SSH è un livello ulteriore.
  2. Meno porte esterne aperte. Usando il metodo qui descritto, non c'è bisogno di lasciare il server VNC in ascolto sulle porte esterne ma solo su quelle interne (in altre parole il router può bloccare la porta 5900).
  3. l'unico servizio che gli attaccanti possono cercare di sfruttare per compromettere la macchina è l'SSH ma usando un sistema a chiave pubblica/privata questo diventa davvero difficile, a meno che queste non ci vengano rubate.

Generalmente il protocollo VNC non è un protocollo crittato (può esserlo, ma questo non è un aspetto che verrà trattato nell'articolo). Questo significa che ogni pacchetto che attraversa Internet può essere intercettato (ad esempio mediante schede di rete funzionanati in modalità promiscua) e letto da chiunque utilizzi un packet sniffer. Un software scritto in Perl chiamato Chaosreader http://www.brendangregg.com/chaosreader.html permette lo sniffing del traffico e il replay dei caratteri digitati quasi in real time. Questa è la ragione per la quale si effettua un tunnel VNC over SSH.

Installazione di SSH

Per prima cosa installare OpenSSH client e server, da terminale digitare:

sudo apt-get install openssh-server openssh-client 

Generare Chiave Pubblica e Privata

Prima di impostare SSH per usare le chiavi pubblica e privata, dovremo crearne un nostro paio.

Fare sempre molta attenzione a come scegliere la password.

E' bene ricordare di non utilizzare una passphrase identica alla password usata per l'account root, altrimenti significherebbe fornire privilegi illimitati a colui che ne venisse in possesso. L'ssh-keygen suggerisce una passphrase di almeno 10 - 30 caratteri. Un modo semplice ma efficente per generare una passphrase è creare una frase strana e per strana intendo una frase che non abbia senso compiuto, ad esempio:

Saturno è in rotta di collisione con un pesce giallo che inciampa in un termosifone, mentre fuori ci sono 40 gradi di longiutudine.

Ora prendiamo la prima lettera di ogni parola punteggiatura compresa e creiamo la seguente stringa di caratteri:

Sèirdccupgciiut,mfcs4gdl.

Ora per rendere la frase un po più sicura possiamo convertire lettere in numeri e/o simboli, trasformare maiuscole in minuscole a piacimento, ad esempio:

s31rd77up9711ut,mfcsa9dl.

S: s
è: 3
i: 1
c: 7
g: 9
4: a

Questa è solo un'idea che mi piace usare, tuttavia qualunque altro modo di procedere può essere ritenuto valido.

Torniamo alla generazione delle chiavi. Per prima cosa è opportuno creare una directory nella quale memorizzarle, dopodichè avvieremo ssh-keygen.

Attenzione, quanto segue deve essere fatto dall'utente che vuole effettuare il login tramite SSH, non dall'utente root!

mkdir -p ~/.ssh
chmod 700 ~./ssh
cd ~/.ssh
ssh-keygen -t rsa

Dovrebbe apparire qualcosa di simile a questo:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/USER/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/USER/.ssh/id_rsa.
Your public key has been saved in /home/USER/.ssh/id_rsa.pub.
The key fingerprint is:

Ovviamente, USER deve essere rimpiazzato con l'attuale username. Ora la chiave privata è chiamata id_rsa e la chiave pubblica è id_rsa.pub. Quindi necessiteremo di entrambe le chiavi per effettuare il login. La chiave pubblica verrà conservata nella cartella nascosta nella directory dell'utente:

/home/user/.ssh/

Mentre la chiave privata verrà memorizzata su un dispositivo di memorizzazione portatile che poi l'utente può portare con se. Per conformarsi alla configurazione di default di un qualunque ssh server, dovremo allegare la chiave pubblica a un altro file:

cat ~/.ssh/id.pub >> authorized_keys
chmod 600 authorized_keys

Ora siamo pronti a configurare sshd.

Configurazione demone SSH

Prima di configurare il server ssh abbiamo ancora un paio di cose su cui riflettere. Da dove ci connetteremo al nostro computer? Dal lavoro, da scuola? Da dove ci connetteremo, permetteranno le connessioni verso l'esterno su qualunque porta? La risposta all'ultima domanda è probabilmente negativa. Nella mia università le connessioni in uscita sulle porte <1024 sono bloccate eccezion fatta per servizi quali DNS, HTTP, HTTPS ovviamente. Tuttavia le porte con alto valore tendono a non essere chiuse. Ovviamente la porta 5900 pur essendo >1024 viene tendenzialmente chiusa, ma una porta quale la 59000 non è bloccata.

Queste informazioni sono molto importanti perchè dobbiamo conoscere su quale porta il server ssh deve restare in ascolto.

Riporto alcune linee guida ovviamente da non applicare in tutte le situazioni:

  • le porte >1024 sono meno "bloccate" rispetto alle inferiori (privileged ports)

  • alcune porte sono quasi sempre aperte come la porta HTTP (80) HTTPS (443) etc. Se tutte le altre falliscono possiamo provare a raggiungere il nostro server SSH sfruttando una di queste. Ovviamente non è la soluzione migliore.
  • la porta del DNS (53) è sempre aperta.

Nel mio caso ho un web server in ascolto sulla porta 80, sessione SSL sulla porta 443, quindi queste alternative non sono tali per me. A titolo d'esempio ho scelto la porta 59000.

Stabilite delle linee guida possiamo ora modificare la configurazione di SSH per renderla un po più sicura, aggirando i filtri sulle porte per permettere la connessione da scuola o dal lavoro.

Backup sshd_config

Come primo passo facciamo un backup della configurazione di SSH:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.working

Ora usando un qualunque editor di testo, ad esempio nano, aprire il file /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Dobbiamo apportare alcuni cambiamenti. Anzitutto occorre trovare la linea:

port 22

porta di default sulla quale resta in ascolto il server SSH, occorre cambiarla per quanto detto precedentemente con:

port 59000

Assicurarsi che non ci siano # prima del numero della porta. Ovviamente non dobbiamo necessariamente scegliere la porta 59000 ma ricordando quanto detto prima...

Disabilitiamo i login remoti con l'account di root

Per disabilitare i login remoti con l'account root cercare la riga:

PermitRootLogin yes

cambiamo il

yes

con un

no

Sebbene di default Ubuntu non abilita l'account di root, resta comunque una buona idea disabilitare il login da remoto con i permessi e priviligi disponibili all'account root.

Disabilitare la password di autenticazione

Disabiliteremo tutte le password di autenticazione. Questa scelta è stata fatta per un paio di ragioni:

  • Non c'è metodo per crackare una password se questa non esiste.
  • Facendo questo forziamo l'utente a usare la coppia di chiavi pubblica e privata create precedentemente per la sua autenticazione.

Cerchiamo la riga:

#PasswordAuthentication yes

e cambiamola con:

PasswordAuthentication no

Attenzione è stato rimosso

#

Riavviare il server SSH:

sudo /etc/init.d/ssh restart

Configurare Remote Desktop VNC

Questo passo è davvero semplice. Usando il menu andare alla voce System -> Preferences -> Remote Desktop. Un dyalog box si aprirà, selezionare i seguenti check boxes:

  • Allow other users to view your desktop
  • Allow other users to control your desktop
  • Require the user to enter this password

Ricordo di non selezionare il check box "Ask for your confirmation" altrimenti non sarà possibile accedere da remoto. Una buona idea è scegliere una password il più possibile robusta.

Selezionare close e vino-server è configurato.

Risolvere il problema dell'IP dinamico

In questa guida si presuppone che l'utente abbia un IP dinamico.

A meno che non si abbia a disposizione un proprio domain name e configurato il proprio computer affinchè risolva le queries indirizzate ad esso e, a meno che non si paghi per avere un IP statico. Occorre servirsi degli strumenti che permettano di creare un proprio hostname gratuitamente.

Andare sul sito di DynDNS ad esempio https://www.dyndns.com/services/dns/dyndns/, cercare la voce sign up for a "Free Dynamic DNS account". Con questo ci viene permesso di creare un virtual domain name partendo da uno dei loro domini (ad esempio: mycomputer.dyndns.org). In questo modo quando ci si vorrà connettere al proprio computer da qualunque luogo, potremo semplicemente scrivere quell'indirizzo piuttosto che l'IP della nostra macchina che tra altro è dinamico.

A titolo informativo, c'è un client *nix che ha il compito di informare i server DynDNS di quando cambia IP la propria macchina lo si può reperire al seguente indirizzo https://www.dyndns.com/support/clients/. Non mi è mai capitato di usarlo in quanto il mio router svolge questa funzione internamente. In ogni modo ci sono diversi HowTo al loro sito.

Portable Solutions

Per connettersi alla propria macchina da remoto analizzeremo ancora un paio di cose.

  • Aprire le porte del proprio router/firewall sulle quali il demone SSH resterà in ascolto (nel caso di questa guida la porta 59000). Una buona guida per questo è disponibile al seguente indirizzo http://portforward.com/routers.htm.

  • Recuperare del software portabile, usabile sulle macchine Windows (le macchine *nix e Mac hanno SSH built in).

Alcuni esempi di questo software sono:

Putty: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html. Un fantastico strumento, appunto un ssh-client che rende usabile ssh su macchine Windows.

Puttygen: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html. Software necessario per trasformare la nostra chiave id_rsa nel formato usato da Putty .ppk.

TightVNC Viewer: http://www.tightvnc.com/download.html. Questo è un client per Windows (ne esiste anche una versione usabile per Linux). La versione tightvnc-X.X.X_x86_viewer.zip non richiede di essere installata pertanto una volta scompattata può essere copiata su un qualunque portable drive. Ovviamente di questo software esistono delle alternative più che valide come UltraVNC e RealVNC.

Chicken of the VNC: http://sourceforge.net/projects/cotvnc/. Questo è un client piuttosto famoso per Mac OS X.

Scelto il software da usare sul portable drive, dobbiamo:

  • Copiare la private key memorizzata sul nostro home computer (nella cartella ~/.ssh/) nel nostro portable drive (d'ora in poi USBdrive):

     sudo cp ~/.ssh/id_rsa /media/USBdrive/

Fatto ciò occorre importare la chiave in Putty, ma per far questo avremo bisogno di puttygen.exe memorizzato in precedenza anchesso sull'USB drive:

  • Avviare il file puttygen.exe sull'USB drive.

  • Andare in Conversions | Import Key.

  • Click sulla propria private key e inserire la propria passphrase.
  • Aggiornare la key fingerprint.
  • Salvare le chiavi usando Save public key e Save private key.

puttygen.exe genera un altra chiave pubblica. Questa è identica a quella memorizzata sul nostro home computer.

Da notare che è sempre possibile partendo dalla propria chiave privata ricostruire la propria chiave pubblica, ma non è possibile il contrario.

Impostare PuTTY per il port forwarding

Aprire il drive USB , avviare putty.exe ed eseguire le seguenti operazioni:

  • Sul menu di sinistra, selezionare Session. Inserire il proprio dynamic host name in Host Name (or IP address). Ad esempio (mycomputer.dyndns.org)

  • Passare al campo Port inserendo la porta su cui risponderà il nostro server SSH (59000)

  • Ora selezionare Connection -> SSH -> Auth sul menu di sinistra.

  • Sotto Private key file for authentication: selezionare la propria chiave privata id_rsa.ppk.

  • Selezionare Tunnels sul menu di sinistra. Sotto Source Port selezionare un grande numero corrispondente ad una porta che non sia una porta di servizio >1024 (ad esempio la porta 50000).

  • Sotto Destination scrivere 127.0.0.1:5900. Questo permette ad ssh di creare un tunnel per ogni servizio connesso alla porta 50000 alla porta 5900 VNC sull'interfaccia locale (l'interfaccia locale è quella dell'home computer, una volta che ci saremo connessi).

  • Premere sull' Add button.

  • Tornare a Session, scrivere un nome in Saved Sessions e premere Save. In questo modo salveremo le impostazioni appena definite senza dover ripetere la procedura, potremo pertanto ricaricale in ogni occasione.

  • Selezionare Open Button.

  • Inserire quando richiesto la propria private key passphrase, fatto questo sarà visibile un normale promp shell.
  • Tornare quindi al driver USB, avviare TightVNCviewer.exe.

  • Selezionare VNC server: e inserire 127.0.0.1::50000, attenzione al fatto che ci sono 2 due punti.

  • Inserire la password quando verrà richiesto per sbloccare il desktop.

Avviare una sessione SSH da un client *nix

Qualora il login remoto non venga effettuato da una macchina Windows, è bene ricordare che l'SSH-client è installato di default pertanto prima di avviare la sessione SSH ricordarsi di copiare la propria chiave privata, nel proprio profilo:

sudo cp /media/USBdrive/id_rsa ~/.ssh/

fatto ciò, modificare i permessi sulla chiave appena copiata in modo da renderla usabile solo all'utente:

sudo chmod 600 ~/.ssh/id_rsa

avviare la sessione SSH:

sudo ssh -p 59000 USER@mycomputer.dyndns.org -L 50000:127.0.0.1:5900

Ovviamente, USER deve essere rimpiazzato con il proprio username.

Impostare Chicken of the VNC per il port forwarding

Avviare Chicken of the VNC, pannello Connessione | Nuova Connessione Al pannello Connetti selezionare:

  • Host: 127.0.0.1:50000.

  • Video: 0.

  • Password: inserire la propria password.

  • premere il button Connetti.

Incrementare le performance del Client VNC

Non aspettiamoci connessioni velocissime, VNC è abbastanza lento. Certamente è possibile incrementarne le performance:

  • diminuendo la profondità del colore fino ad un minimo di 8-bit.
  • modificando l'encoding, potremo aumentare/diminuire il livello di compressione anche JPEG.

Conclusione

SSH è una grande risorsa per rendere sicure le comunicazioni. Per ogni protocollo TCP è possibile il forwarding in questo modo (sia esso FTP, POP, HTML, SAMBA). Ci sono molti usi per per il tunneling SSH questo tutorial altro non è che la punta di un iceberg.

Ulteriori risorse

SSH

VNC

Chicken of the VNC


CategoryServer CategoryDaRevisionare CategoryInternet CategorySicurezza