Secure Shell: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Wikilink e typo
Sostituito "insicuro" per descrivere Telnet con "non sicuro"
 
(38 versioni intermedie di 29 utenti non mostrate)
Riga 1:
In [[informatica]] e [[telecomunicazioni]] '''SSH'''Il ('''Secure SHellShell Protocol''', [[shell (informatica)|shell]] sicuraSSH) è un [[protocollo di rete]] crittografico che permette di stabilire una [[sessione]] remota [[Crittografia|cifrata]] tramite [[interfaccia a riga di comando]] con un altro [[host]] di una [[rete informatica]]. È il protocollo che ha sostituito l'analogo, ma insicuronon sicuro, [[Telnet]].
{{Avvisounicode}}
In [[informatica]] e [[telecomunicazioni]] '''SSH''' ('''Secure SHell''', [[shell (informatica)|shell]] sicura) è un [[protocollo di rete]] che permette di stabilire una [[sessione]] remota [[Crittografia|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 ==
Il [[client]] SSH ha un'[[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 (informatica)|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 XmacOS]] e [[Microsoft Windows]]. Inoltre è disponibile come strumento di amministrazione su alcuni [[apparato di rete|apparati di rete]]. La [[Internet Assigned Numbers Authority|IANA]] (Internet Assigned Numbers Authority) ha assegnato al servizio SSH la porta 22 [[Transmission Control Protocol|TCP]] e [[User Datagram Protocol|UDP]], anche se è comunque possibile implementare il servizio SSH su altre porte non definite dalla [[Internet Assigned Numbers Authority|IANA]].
 
LaIl sintassicomando su sistemi UNIX-like è lail 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.
Line 18 ⟶ 15:
Il protocollo SSH si basa su un'architettura rappresentabile in tre distinti livelli: Transport Layer Protocol, User Authentication Protocol e Connection Layer Protocol. La divisione in tre livelli indipendenti garantisce un'estrema flessibilità del protocollo: l'indipendenza logica dei livelli permette di modificare la configurazione della connessione senza dover modificare i livelli superiori o inferiori del protocollo, per esempio si può modificare il protocollo di compressione delle informazioni senza dover cambiare il protocollo di cifratura o di autenticazione del sistema.
 
È importante specificare che i livelli sopra citati non hanno alcuna relazione con i livelli dello standard [[Open Systems Interconnection|ISO/OSI]] essendo livelli interni al protocollo SSH che a sua volta è posizionabile subito sopra al [[livello di trasporto]] ISO/OSI. Di fatto i livelli interni al protocollo SSH coprono gli ultimi tre livelli della pila ISO/OSI applicando un'organizzazione diversa da quella prevista dallo standard per le reti.
 
=== Transport Layer Protocol ===
Il Transport Layer Protocol è il primo dei tre livelli del protocollo SSH, in esso sono contenuti tutti i protocolli e le procedure utilizzate nell'instaurazione e creazione del canale cifrato di comunicazione client-server. All'interno del Transport Layer avviene l'autenticazione del server, lo scambio delle chiavi, la cifratura, la compressione e il controllo d'integrità dei pacchetti. Il livello comprende in parte il livello di sessione e in parte il livello di presentazione dello standard ISO/OSI. La connessione creata sfrutta normalmente il protocollo [[Suite di protocolli Internet|TCP/IP]] per la comunicazione al livello di rete e di trasporto ma è teoricamente indipendente da esso. Nel Transport Layer viene effettuato il controllo dell'integrità dei pacchetti ma non vengono gestiti i casi in cui i pacchetti della connessione vengano persi, in tali casi la sessione viene terminata e deve essere ristabilita completamente. Per tali motivi i protocolli di trasporto orientati alla connessione come il TCP sono fortemente consigliati per impedire la perdita di pacchetti e la chiusura della connessione.
 
==== Negoziazione algoritmi ====
La negoziazione degli algoritmi è una delle prime fasi dell'instaurazione di una connessione SSH. Per poter stabilire quali algoritmi utilizzare nella connessione SSH il client e il server devono scambiarsi la lista degli algoritmi che supportano per la connessione. La lista contiene tutti gli algoritmi disponibili in ordine di preferenza, la preferenza e gli algoritmi disponibili sono determinati dalla configurazione del software del client e del server. Terminato lo scambio delle liste vengono scelti i protocolli disponibili su entrambe le macchine dando precedenza agli algoritmi più in alto in ordine di preferenza. Se non sono disponibili algoritmi in comune tra le macchine la connessione viene terminata.
 
==== Scambio delle chiavi ====
Dopo la definizione degli algoritmi da utilizzare nella connessione avviene uno dei passi più importanti nell'instaurazione del canale sicuro di comunicazione: lo scambio delle chiavi. Per poter garantire la sicurezza e la privatezza della comunicazione è indispensabile stabilire degli algoritmi di scambio delle chiavi sicuri, una falla di sicurezza nello scambio delle chiavi comprometterebbe l'intera connessione. La negoziazione delle chiavi avviene all'inizio di ogni connessione, per garantire maggiore sicurezza le chiavi vengono generalmente rinegoziate ogni ora o ogni gigabyte di dati transitato nella connessione.
 
Gli algoritmi di [[scambio di chiavi]] più utilizzati sono:
* diffie-hellman-group1-sha1
* diffie-hellman-group14-sha1
I due algoritmi utilizzati sono variazioni dell'algoritmo di [[scambio di chiavi Diffie-Hellman]] in cui è stato aggiunto un sistema di certificazione del server mediante un host key. Osservando le stringhe identificatrici degli algoritmi è possibile dedurre che esse variano solo per il termine groupX, tale termine definisce il gruppo utilizzato nella definizione dei parametri dell'algoritmo Diffie-Hellman, tali gruppi sono documentati all'interno del RFC3526.
 
L'algoritmo Diffie-Hellman è stato certificato come uno dei più sicuri metodi di scambio di chiavi su un canale di comunicazione non sicuro ed è tra gli algoritmi più utilizzati al mondo. A causa dell'elevato numero di calcoli necessari per lo scambio di chiavi Diffie-Hellman è possibile utilizzare nei sistemi più vecchi e con meno potenza di calcolo l'algoritmo [[RSA (crittografia)|RSA]] egualmente sicuro ma meno esigente in termini di potenza di calcolo.
 
==== Autenticazione del server ====
L'autenticazione del server serve ad evitare che un utente maligno "impersoniimpersonifichi" 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 conosciuta dal client, il client può ottenere la chiave di un server utilizzando archivi pubblici delle chiavi disponibili sul web o ricevendola direttamente dal server durante la prima connessione.
 
L'autenticazione avviene durante lo scambio di chiavi Diffie-Hellman, il server crea un messaggio cifrato con la propria chiave privata e la invia al client, il client la decifra con la chiave pubblica del server verificando l'identità del server, se la decifrazione del messaggio avviene correttamente il client procede con l'instaurazione della connessione, in caso contrario interrompe la procedura. Dato che solo il server dovrebbe essere a conoscenza della chiave privata il client è in grado di determinare l'identità del server con cui sta comunicando.
Line 64 ⟶ 58:
Gli algoritmi più utilizzati sono l'AES e il 3DES presenti su praticamente tutti i computer.
 
È possibile utilizzare un algoritmo di crittografia nullo che di fatto non esegue alcuna operazione di cifratura, tale scelta è fortemente sconsigliata in quandoquanto renderebbe l'intera comunicazione insicura.
 
Dopo aver stabilito i protocolli da utilizzare e dopo aver effettuato lo scambio di chiavi mediante il protocollo Diffie-Hellman è possibile instaurare la connessione criptata con l'algoritmo a chiave simmetrica precedentemente definito.
Line 97 ⟶ 91:
 
====== Autenticazione ======
Il server sorgente per verificare l'identità dell'utente sfrutta le particolari caratteristiche degli algoritmi di crittografia asimmetrici.
Durante la fase di autenticazione il server genera una stringa casuale di 256 bit, la cifra usando la chiave pubblica dell'utente e l'algoritmo di cifratura corrispondente alla chiave e la invia al client. Il client decifra il messaggio utilizzando la propria chiave privata e invia l'hash della stringa ricevuta al server, se l'hash della stringa del client corrisponde all'hash della stringa del server l'utente viene autenticato. Solo chi possiede la chiave privata dell'utente è in grado di decifrare correttamente il messaggio cifrato del server, in questo modo il server è in grado di verificare l'identità del client.
 
Line 120 ⟶ 114:
==== I canali ====
Ogni terminale interattivo aperto e ogni connessione inoltrata attraverso la connessione SSH può occupare un canale di comunicazione. Essendo possibile l'instaurazione di canali multipli ogni canale possiede un numero identificativo, tale numero viene utilizzato per distinguere pacchetti appartenenti a canali diversi permettendo all'applicativo SSH di ricostruire le diverse comunicazioni aperte attraverso il tunnel criptato.
L'apertura di un canale avviene quando entrambe le parti concordano la sua creazione, se una delle due parti rifiuta, il canale non viene creato. Fintanto che uno degli host non ha ancora confermato l'apertura del canale nessun pacchetto è autorizzato ad utilizzare tale canale.
 
==== Port forwarding ====
Grazie all'estrema flessibilità del protocollo SSH è possibile realizzare [[tunneling|tunnel]] criptati in grado di trasportare sessioni TCP arbitrarie all'interno della connessione criptata, permettonopermettendo di proteggere da intercettazione protocolli non sicuri, o di aggirare limitazioni di routing.
 
Questa funzionalità è detta [[port forwarding]], e permette di aprire un [[Socket (reti)|socket]] TCP sul client SSH ('''local''' port forwarding) o sul server ('''remote''' port forwarding). Le [[connessione (informatica)|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 <ttkbd>host1</ttkbd>, inoltrando la porta <ttkbd>10022</ttkbd> della macchina in cui lanciamo il client ssh alla porta <ttkbd>22</ttkbd> di <ttkbd>host2</ttkbd> attraverso un canale sicuro tra client e host1:
 
ssh host1 -L 10022:host2:22
 
Mentre questa connessione è attiva, collegandosi alla porta <ttkbd>10022</ttkbd> del <ttkbd>client</ttkbd> si viene rediretti verso la porta <ttkbd>22</ttkbd> di <ttkbd>host2</ttkbd>.
 
===== Esempio di uso del port forwarding =====
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 severserver remoto, a patto che la macchina server abbia abilitato il forwarding. Questo è normalmente possibile senza installare nessun pacchetto aggiuntivo.
 
Ad esempio, nel seguente scenario
Line 154 ⟶ 148:
== Voci correlate ==
* [[OpenSSH]]
 
* [[Port knocking]]
 
* [[PuTTY]]
* [[WinSCP]]
Line 164 ⟶ 161:
 
== Collegamenti esterni ==
* {{FOLDOC}}
* {{cita web|http://www.oscene.net/site/sysadmin/web-server/howto-configurazione-dei-virtual-hosts-con-apache2|Configurazione dei Virtual Hosts con Apache2}}
* {{cita web | 1 = http://www.oscene.net/site/sysadmin/web-server/howto-configurazione-dei-virtual-hosts-con-apache2 | 2 = Configurazione dei Virtual Hosts con Apache2 | accesso = 9 marzo 2011 | urlarchivio = https://web.archive.org/web/20080103073339/http://www.oscene.net/site/sysadmin/web-server/howto-configurazione-dei-virtual-hosts-con-apache2 | dataarchivio = 3 gennaio 2008 | urlmorto = sì }}
* {{cita web|http://www.compago.it/index.php/it/manuali/39-windows/169-tunnel-ssh-con-putty|Esempio di tunnel SSh usando Putty}}
* {{cita web | 1 = http://www.cert.garr.it/documenti/ssh/ | 2 = Uso e configurazione di SSH | accesso = 22 marzo 2012 | urlarchivio = https://web.archive.org/web/20120428021226/http://www.cert.garr.it/documenti/ssh/ | dataarchivio = 28 aprile 2012 | urlmorto = sì }}
* {{cita web|http://www.openssh.org/|Sito di Openssh|lingua=en}}
* {{en}} [httphttps://www.openbsd.org/cgi-bin/man.cgi?query=ssh Pagina di manuale di Openssh] via [[OpenBSD]]
* {{cita web|1=http://thinkhole.org/wp/2006/10/30/five-steps-to-a-more-secure-ssh|2=HOWTO: Five steps to a more secure SSH|lingua=en|accesso=3 giugno 2008|urlarchivio=https://web.archive.org/web/20080618100116/http://thinkhole.org/wp/2006/10/30/five-steps-to-a-more-secure-ssh/|dataarchivio=18 giugno 2008|urlmorto=sì}}
* {{cita web|http://denyhosts.sourceforge.net/|DenyHosts: script intended to help thwart SSH server attacks|lingua=en}}
* {{cita web|1=http://webssh.uni.me/|2=SSH via HTTP|lingua=en|accesso=26 settembre 2012|urlarchivio=https://web.archive.org/web/20160420175922/http://webssh.uni.me/|dataarchivio=20 aprile 2016|urlmorto=sì}}
 
{{IPstack}}