Secure shell

Da Wikipedia, l'enciclopedia libera.
(Reindirizzamento da Secure Shell)
Se riscontri problemi nella visualizzazione dei caratteri, clicca qui.

In informatica e telecomunicazioni SSH (Secure SHell, shell sicura) è un protocollo di rete che permette di stabilire una sessione remota cifrata tramite interfaccia a riga di comando con un altro host di una rete informatica. È il protocollo che ha sostituito l'analogo, ma insicuro, Telnet.

Descrizione[modifica | modifica sorgente]

Il client SSH ha una interfaccia a riga di comando simile a quella di telnet e rlogin, ma l'intera comunicazione (ovvero sia l'autenticazione (mutua) che la sessione di lavoro) avviene in maniera cifrata. Per questo motivo, SSH è diventato uno standard di fatto per l'amministrazione remota di sistemi UNIX e di dispositivi di rete, rendendo obsoleto il protocollo telnet, giudicato troppo pericoloso per la sua mancanza di protezione contro le intercettazioni.

Il client ed il server SSH sono installati o installabili su molte versioni di UNIX, GNU/Linux, Mac OS X e Microsoft Windows. Inoltre è disponibile come strumento di amministrazione su alcuni apparati di rete

La sintassi su sistemi UNIX-like è la seguente:

$ ssh [opzioni] nomeutente@host [comando]

dove con "$" si intende il prompt della shell utilizzata

La prima versione dell'SSH era completamente open Source, mentre la seconda è diventata commerciale; esiste comunque una versione libera detta OpenSSH che si basa sulla prima versione, ma che fornisce supporto alla seconda versione.

Autenticazione[modifica | modifica sorgente]

SSH prevede un'autenticazione mutua sia per il client che per il server.

Autenticazione del client[modifica | modifica sorgente]

Esistono principalmente due metodi di autenticazione per controllare l'accesso ad un server ssh:

Username/Password[modifica | modifica sorgente]

L'utente fornisce un nome utente ed una password, che vengono validati dal server. Questo scambio avviene all'interno di un canale cifrato, per cui non è a rischio di intercettazione.

Procedura:

  1. A$ ⇒ B: SSH_MSG_USERAUTH_REQUEST, pappy, ssh-userauth, keyboard-interactive
  2. B$ ⇒ A: SSH_MSG_USERAUTH_INFO_REQUEST, pappy, password-authentication, 1, "Enter Password"
  3. A$ ⇒ B: SSH_MSG_USERAUTH_INFO_RESPONSE, 1, "love"
  4. B$ ⇒ A: SSH_MSG_USERAUTH_SUCCESS.

Per prevenire attacchi brute force si può utilizzare un tool DenyHosts o Fail2ban.

Chiave pubblica[modifica | modifica sorgente]

Questo metodo di autenticazione è basato sulla crittografia asimmetrica. Per utilizzarlo l'utente genera una coppia di chiavi. La chiave pubblica è copiata sul server, tipicamente in un apposito file nella home directory dell'utente; la chiave privata deve essere conservata dall'utente, ed è bene che sia protetta con una parola chiave (passphrase).

Nella fase di accesso, il client ssh prova al server di essere in possesso della chiave privata, e in caso di successo viene consentito l'accesso. In questo modo, all'utente non è richiesto di fornire la propria password ad ogni connessione.

Autenticazione del Server[modifica | modifica sorgente]

L'autenticazione del server serve ad evitare che un utente maligno "impersoni" il server, facendosi fornire le credenziali dell'utente (spoofing da attacco man in the middle). A questo scopo, per ciascun server viene generata una coppia di chiavi asimmetriche. La chiave privata rimane sul server. La chiave pubblica deve essere installata sui client. Quando un client si collega ad un server di cui conosce la chiave pubblica, verifica che il server sia ancora in possesso della chiave privata. Se questa verifica fallisce, la connessione viene abbattuta, evitando di fornire credenziali al server.

Nella pratica, quando ci si collega ad un server per la prima volta, il client chiede se si vuole accettare la chiave pubblica di questo server, e se l'utente risponde positivamente memorizza questa chiave e prosegue nella connessione. Alle connessioni successive con lo stesso server, il client ne verifica l'autenticità, e in caso la chiave privata non corrisponda impedisce di proseguire la connessione.

Port forwarding[modifica | modifica sorgente]

La sicurezza della comunicazione tramite SSH è assicurata grazie alla realizzazione di tunnel criptati che, trasportando sessioni TCP arbitrarie all'interno della connessione criptata, permettono di proteggere da intercettazione protocolli non sicuri, o di aggirare limitazioni di routing.

Questa funzionalità è detta port forwarding, e permette di aprire un socket TCP sul client SSH (local port forwarding) o sul server (remote port forwarding). Le connessioni ricevute su questa porta vengono inoltrate dall'altro capo della connessione SSH, verso un host e una porta specificata.

Ad esempio, con questo comando ci si collega ad host1, inoltrando la porta 10022 della macchina in cui lanciamo il client ssh alla porta 22 di host2 attraverso un canale sicuro tra client e host1:

ssh host1 -L 10022:host2:22

Mentre questa connessione è attiva, collegandosi alla porta 10022 del client si viene rediretti verso la porta 22 di host2.

X forwarding[modifica | modifica sorgente]

Il port forwarding è utile anche per trasportare applicazioni X Window attraverso una connessione SSH. SSH imposta anche automaticamente le opportune variabili d'ambiente, in modo che le applicazioni X lanciate da un terminale remoto vengano visualizzate sul display da cui è stata avviata la connessione.

L'X forwarding dal lato client deve essere abilitato passando l'opzione "-X" mentre dal lato server va modificato il file di configurazione /etc/ssh/sshd_config abilitando la direttiva X11Forwarding (ricordatevi di riavviare il server una volta apportata la modifica al file di configurazione).

Esempio di uso del port forwarding[modifica | modifica sorgente]

Il port forwarding è utile ad esempio per fare assistenza remota a macchine prive di un sistema di gestione remota sicuro. È possibile creare un tunnel sicuro tra una porta del client e una porta del server remoto o di qualsiasi terza macchina dietro al sever remoto, a patto che la macchina server abbia abilitato il forwarding. Questo è normalmente possibile senza installare nessun pacchetto aggiuntivo.

Ad esempio, nel seguente scenario

CLIENT --[rete sicura]--> ssh server --[rete insicura]--> TERZA MACCHINA

Se vogliamo utilizzare un desktop remoto sulla terza macchina basta che ci connettiamo al server ssh includendo un tunnel tra una porta locale della macchina dove lavoriamo e la porta 3389 della TERZA MACCHINA. Dopo di che basterà avviare il client RDP e connettersi a localhost:(porta scelta).

Il client ssh locale stabilirà una connessione criptata con il server, creerà un tunnel all'interno di questa connessione criptata, ed invierà la connessione RDP su questo tunnel. Il server a sua volta stabilirà una normale sessione TCP con la terza macchina sulla porta richiesta.

Come risultato, il client RDP verrà messo in comunicazione con la terza macchina. La connessione tra ssh server e terza macchina non sarà criptata, per cui è opportuno che la comunicazione tra queste due macchine non sia a rischio di intercettazione. La terza macchina vedrà la connessione TCP provenire dal server ssh invece che dal client.

Voci correlate[modifica | modifica sorgente]

Collegamenti esterni[modifica | modifica sorgente]