Introduzione a SSH (Parte I)

Secure Shell: uno strumento fondamentale per comunicazioni sicure tra infrastrutture ICT
By Admin | Ottobre 27, 2022

In questo articolo approfondiremo il tema dell'accesso sicuro ad infrastrutture di rete gestite. In particolare, ci focalizzeremo sul protocollo SSH che ci offre un modo sicuro, veloce e d efficiente per operare su sistemi su cui non possiamo avere controllo o accesso fisico.

Cenni storici e struttura protocollo

Il protocollo SSH, acronimo di "Secure Shell", è stato creato nel 1995 dal ricercatore finlandese Tatu Ylönen, principalmente per superare il problema della connessione tra sistemi remoti da effettuarsi in maniera sicura ed efficiente. All'epoca, i protocolli Telnet, rlogin, rsh e similari non offrivano garanzie di sicurezza, instradando traffico in chiaro facilmente soggetto a sniffing di rete.

Il protocollo SSH è formato da tre componenti: Transport layer, Authentication layer, Connection layer. Il layer che si occupa di trasporto assicura la comunicazione sicura tra server e client, l'authentication si occupa appunto di gestire la procedura di autenticazione mentre quello relativo alla connessione amministra le comunicazioni subito dopo l'autenticazione.

Volendo semplificare in massima parte il funzionamento del protocollo SSH possiamo individuare alcune fasi chiavi:

  • 1) Il primo step consiste nel contatto di un client SSH ad un server SSH, la connessione utilizza prevalentemente il protocollo TCP/IP;
  • 2) Avviene subito dopo la "negoziazione degli algoritmi", in pratica client e server si "accordano" su quale algoritmo utilizzare in quanto conosciuto e disponibile su entrambi i sistemi;
  • 3) Il terzo passo prevede lo "scambio delle chiavi", client e server si scambiano la chiave necessaria a decifrare il futuro scambio di informazioni bidirezionale. Si noti che in questa fase la connessione sicura ancora non è instaurata, lo scambio delle chiavi avviene infatti grazie all'algoritmo Diffie-Hellman pensato per scambiare informazioni in contesti insicuri;
  • 4) Subito dopo avviene l'autenticazione del server, il client verifica l'identità del server per essere sicuro di dialogare con "la macchina giusta". Tale operazione avviene da parte del client decifrando con la chiave pubblica del server le informazioni che lo stesso ha inviato cifrandole con la sua chiave privata (conosciuta esclusivamente dal server). Si noti a titolo di esempio lo schema in Figura 1;
  • 5) Compiuti questi passaggi client e server dispongono degli strumenti per instaurare una connessione sicura in cui le informazioni transitano dopo essere state cifrate con le chiavi che client e server si sono scambiati;
  • 6) Le informazioni in transito instaurate durante una sessione SSH possono essere compresse per trasferire una quantità minore di dati;
  • 7) Allo stesso modo, per una connessione SSH è possibile attivare il controllo sull'integrità delle informazioni che avviene grazie ad algoritmi MAC (Message Authentication Code) che si occupano di confrontare i dati spediti e ricevuti da una macchina escludendo la presenza di errori nella trasmissione delle informazioni;

Figura 1

Questi gli step principali che avvengono nella fase di creazione di una connessione SSH. Il metodo di autenticazione più semplice in una macchina remota avviene mediante password, in alternativa il client può generare una chiave tramite comando ssh-keygen.

Una volta che l'autenticazione tra client e server è avvenuta con successo viene costruito, in pratica, una sorta di "tunnel" sicuro in cui transitano informazioni tra un capo e l'altro. In questo tunnel possono passarci tante cose, ad esempio il tradizionale protocollo FTP può trasferirsi in questo tunnel diventando SFTP ad acquisendo quindi un fondamentale schermo di sicurezza permettendo lo scambio di files e dati in modo sicuro. Lo stesso può avvenire per altri componenti, come ad esempio il comando UNIX cp deputato alla copiatura dei file, che può essere "dirottato" su una connessione cifrata utilizzando SCP. Oppure ancora come il noto rsync anch'esso dedicato al trasferimento di files.

In ambito sistemistico ed, in generale, relativo al managment dei sistemi l'accesso tramite shell presenta innumerevoli vantaggi permettendo l'esecuzione di ogni tipo di operazione, ad esempio, per l'installazione e la configurazione di programmi, il monitoraggio dei sistemi, il trasferimento di dati ed informazioni, il controllo da remoto delle macchine, il montaggio di file systems remoti e tantissime altre operazioni. Storicamente, il protocollo SSH è stato ideato e realizzato per sistemi UNIX-like, negli anni sono stati implementati dei sistemi per utilizzarlo anche nell'ambiente Windows (vedasi client PuTTY).

Vediamo adesso come stabilire una connessione SSH utilizzando i comandi base.

Installazione

Prima di introdurre qualche comando c'è da specificare che la porta di comunicazione di default del protocollo SSH è la 22. Questa porta può eventualmente essere modificata nella configurazione della macchina che ospita il server SSH. Allo stesso modo, in fase di connessione potremo specificare come parametro la porta di destinazione (che dobbiamo conoscere in partenza).

SSH è un componente ormai totalmente integrato nei sistemi UNIX lato desktop, allo stesso modo lo è sui sistemi server. In ogni caso per installare su macchine server i pacchetti necessari basterà installare openssh-server:

$ apt install openssh-server (Debian-like)
$ dnf install openssh-server (CentOS-like)
$ yum install openssh-server (RHEL-like)

Ricordando infine di avviare il demone che deve successivamente risultare attivo (Figura 2):

$ systemctl start sshd

Figura 2

Al termine dell'installazione è bene verificare che la porta 22 (o qualunque altra scelta) sia raggiungibile dall'esterno e non filtrata a livello firewall. Verifichiamo sempre l'aggiunta di una relativa regola:

$ firewall-cmd --zone=public --permanent --add-service=ssh

O se utilizziamo Ufw:

$ ufw allow ssh

Ricordiamo infine che la cartella a cui fa riferimento SSH con relativi file di configurazione è /etc/ssh/ , allo stesso mode il file di configurazione che permette il settaggio delle varie opzioni nonché il fine-tuning per personalizzare impostazioni specifiche è localizzato nella stessa cartella con path /etc/ssh/sshd_config

Comandi Base

La connessione ad una macchina remota si effettua da terminale con il comando:

$ ssh username@ip

Dove l'username è l'utente remoto a cui vogliamo connetterci e ip è l'indirizzo IP della macchina remota. Se vogliamo connetterci al nostro account che si trova su un server remoto che ha IP 100.100.100.100 dovremmo dare il comando:

$ ssh myaccount@100.100.100.100

In questo modo la connessione avverrà by-default tramite porta 22, nel caso possiamo specificare una porta diversa se siamo a conoscenza di una configurazione specifica sul server a cui ci stiamo connettendo, ad esempio per puntare la porta XXX dovremmo digitare:

$ ssh -p XXX myaccount@100.100.100.100

Da terminale possiamo accedere allo sconfinato manuale di SSH dando il comando $ man ssh. Sono presenti decine e decine di opzioni per sfruttare a pieno tutte le potenzialità di questo protocollo, l'introduzione a ogni singola opzione è ovviamente al di fuori degli scopi di questo articolo.

Concludiamo con una opzione spesso utile nei casi in cui si debba necessariamente usare una risorsa remota attraverso interfaccia grafica instradando il traffico di applicazioni X Windows attraverso SSH. In questo modo una applicazione che gira sul terminale remoto verrà visualizzata sul display della macchina da cui parte la connessione. L'opzione in questione è:

$ ssh -X myaccount@100.100.100.100

Nella seconda parte di questo articolo entreremo nel dettaglio in alcuni aspetti di sicurezza che riguardano le configurazioni specifiche del demon SSH ed alcuni consigli per utilizzare questo protocollo secondo le best practices.

Qualsivoglia richiesta può essere inviata a NAOSDATA che offre servizi di consulenza, implementazione e managment specifico sulle infrastrutture ICT.

Ci auguriamo che questo articolo vi sia piaciuto e vi possa essere d'aiuto nell'orientarvi nel mondo SSH. Se apprezzate il nostro lavoro seguite i nostri profili su Facebook e LinkedIn.

Creative Commons License
Questo lavoro è offerto tramite licenza Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.


Risorse e Link: