Le connessioni SSH (Secure Shell) sono uno strumento essenziale per amministratori di sistema, sviluppatori e chiunque abbia bisogno di gestire server remoti in modo sicuro. Con questa guida, esploreremo le basi delle connessioni SSH, la sintassi principale, le diverse modalità d'uso e i tunnel SSH.

Indice

Che cos'è SSH?

SSH è un protocollo di rete crittografico che consente di accedere e gestire dispositivi remoti tramite una connessione sicura. È ampiamente utilizzato per accedere a server Linux e Unix da remoto, ma è disponibile anche su altri sistemi operativi. La caratteristica principale di SSH è la sua sicurezza: grazie alla crittografia, i dati scambiati tra client e server non possono essere intercettati.

Installazione di SSH

Su molte distribuzioni Linux, SSH è preinstallato. Puoi verificare se SSH è installato con il seguente comando:

ssh -V

Se non è installato, puoi installarlo con:

  • Ubuntu/Debian:
sudo apt install openssh-client
  • CentOS/Fedora:
sudo yum install openssh-clients
  • macOS:
brew install openssh

Come funziona una connessione SSH

Una connessione SSH avviene tra due parti:

  • Client SSH: Il dispositivo locale che si connette al server remoto.
  • Server SSH: Il dispositivo remoto che accetta la connessione.

Per avviare una connessione SSH, si utilizza il comando ssh, seguito da alcune informazioni necessarie, come il nome utente e l'indirizzo del server.

Sintassi base di SSH

La sintassi di base del comando SSH è:

ssh [opzioni] utente@host
  • utente: Il nome dell'utente con cui vuoi accedere al server remoto.
  • host: L'indirizzo IP o il dominio del server remoto.

Esempio

Supponiamo di voler accedere a un server con l'utente root e l'indirizzo IP 192.168.1.100. Il comando sarà:

ssh [email protected]

Una volta inviato il comando, il client SSH ti chiederà la password del server remoto (a meno che non utilizzi l'autenticazione basata su chiavi, che vedremo più avanti).

Autenticazione tramite chiavi SSH

Un modo più sicuro per autenticarsi con SSH è tramite chiavi pubbliche e private, eliminando la necessità di inserire la password. Il processo prevede la generazione di una coppia di chiavi crittografiche: una chiave privata (che resta sul tuo dispositivo) e una chiave pubblica (che viene trasferita al server remoto).

Generare una coppia di chiavi SSH

Per generare una coppia di chiavi SSH, utilizza il comando:

ssh-keygen

Segui le istruzioni e salva le chiavi nel percorso predefinito (~/.ssh/id_rsa). Questo creerà due file:

  • id_rsa: La chiave privata.
  • id_rsa.pub: La chiave pubblica.

Nella generazione, oltre a poter specificare un nome diverso, è possibile utilizzare ulteriori parametri.

Ad esempio

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_paperino

Questo comando genera una coppia di chiavi RSA con una lunghezza di 4096 bit e le salva in ~/.ssh/id_rsa_paperino. Dove ssh-keygen è il componente della suite Secure Shell dedicato alla generazione delle chiavi, -t rsa è la tipologia di algoritmo di firma digitale scelto, -b 4096 i bits e -f ~/.ssh/id_rsa_paperino il file di input.

Oppure con curve ellittiche, che risultano essere al momento lo standard di sicurezza più elevato:

ssh-keygen -t ecdsa -b 521 -f ~/.ssh/id_ecdsa_paperino

Rimando a ssh.com per maggiori specifiche.

Copiare la chiave pubblica sul server remoto

Una volta generata la chiave, puoi copiarla sul server remoto utilizzando il comando:

ssh-copy-id utente@host

Ad esempio:

ssh-copy-id [email protected]

Questo comando trasferisce la chiave pubblica al server remoto e permette di accedere senza dover inserire la password ogni volta.

È chiaramente possibile specificare una chiave diverso da ~/.ssh/id_rsa.pub:

ssh-copy-id -i ~/.ssh/id_rsa_paperino.pub [email protected]

Opzioni avanzate di SSH

SSH supporta numerose opzioni che possono migliorare la tua esperienza di utilizzo e aggiungere funzionalità. Eccone alcune delle più utili:

Specificare una porta diversa

Di default, SSH utilizza la porta 22. Se il server remoto utilizza una porta diversa, puoi specificarla con l'opzione -p:

ssh -p [porta] utente@host

Eseguire comandi remoti

Puoi eseguire comandi su un server remoto senza avviare una sessione SSH interattiva. Basta specificare il comando alla fine della stringa SSH:

ssh utente@host "comando"

Ad esempio:

ssh [email protected] "ls /var/www"

Questo comando mostrerà il contenuto della directory /var/www del server remoto.

Tunnel SSH

Una delle funzionalità avanzate di SSH è la possibilità di creare tunnel sicuri, che possono essere utilizzati per inoltrare il traffico da un dispositivo locale a uno remoto in modo sicuro. I tunnel SSH sono utili per proteggere connessioni altrimenti non sicure, come quando si accede a una rete interna o si bypassano restrizioni di rete.

Inoltro locale (Local Port Forwarding)

L'inoltro locale consente di reindirizzare il traffico da una porta del tuo dispositivo locale a una porta su un dispositivo remoto attraverso un server SSH.

Sintassi:

ssh -L [porta_locale]:[host_remoto]:[porta_remota] utente@host_ssh

Esempio:

ssh -L 8080:localhost:80 [email protected]

Questo comando reindirizzerà tutto il traffico inviato alla porta locale 8080 verso la porta 80 (HTTP) del server remoto attraverso il server SSH.

Inoltro remoto (Remote Port Forwarding)

L'inoltro remoto consente di esporre una porta del tuo dispositivo locale attraverso un server remoto, consentendo ad altri di connettersi a quella porta.

Sintassi:

ssh -R [porta_remota]:[host_locale]:[porta_locale] utente@host_ssh

Esempio:

ssh -R 9090:localhost:3000 [email protected]

In questo caso, chiunque si colleghi al server remoto sulla porta 9090 sarà reindirizzato alla porta 3000 del tuo dispositivo locale.

Inoltro dinamico (Dynamic Port Forwarding)

L'inoltro dinamico trasforma il tuo dispositivo locale in un proxy SOCKS5. Questo può essere utile per instradare tutto il traffico di rete attraverso il server SSH.

Sintassi:

ssh -D [porta] utente@host

Esempio:

ssh -D 1080 [email protected]

Dopo aver eseguito questo comando, puoi configurare le applicazioni per utilizzare localhost:1080 come proxy SOCKS5.

Permessi delle cartelle e dei file

Per garantire la sicurezza delle chiavi SSH, è importante impostare i permessi corretti sulle cartelle e sui file. Le chiavi private dovrebbero avere i permessi 600 (rw-------), le chiavi pubbliche 644 (rw-r--r--) e le cartelle .ssh dovrebbero avere i permessi 700 (rwx------).

Puoi impostare i permessi corretti con i seguenti comandi:

sudo chmod 700 ~/.ssh && \
sudo chmod -R 600 ~/.ssh/* && \
sudo chmod -R 644 ~/.ssh/*.pub

Aggiungere la nuova chiave all’ssh-agent del client

Per evitare di dover inserire la password della chiave privata ogni volta che si accede al server remoto, è possibile aggiungere la chiave all'ssh-agent del client.

eval "$(ssh-agent -s)"
ssh-add -K ~/.ssh/id_rsa_paperino

Configurazione di SSH

Puoi personalizzare il comportamento di SSH modificando il file di configurazione ~/.ssh/config. Questo file ti permette di definire alias per i server, specificare opzioni predefinite e configurare tunnel SSH.

Ecco un esempio di file di configurazione:

Host server1
    HostName
    User root
    Port 22
    IdentityFile ~/.ssh/id_rsa

Host server2
    HostName
    User root
    Port 2222
    IdentityFile ~/.ssh/id_rsa_paperino

Host *
    ServerAliveInterval 60
    Compression yes

In questo esempio, abbiamo definito due alias per i server server1 e server2, specificando l'indirizzo IP, l'utente, la porta e il file di chiave per ciascuno. Inoltre, abbiamo configurato alcune opzioni globali per tutti i server, come l'intervallo di keepalive e la compressione.

Conclusione

SSH è uno strumento potente e flessibile, essenziale per chiunque lavori con server remoti. Oltre alle connessioni di base, offre molte opzioni avanzate come l'autenticazione con chiavi, l'esecuzione di comandi remoti e la creazione di tunnel sicuri. Una volta padroneggiate queste funzionalità, sarai in grado di gestire server e applicazioni in modo sicuro ed efficiente.