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?
- Installazione di SSH
- Come funziona una connessione SSH
- Autenticazione tramite chiavi SSH
- Tunnel SSH
- Permessi delle cartelle e dei file
- Aggiungere la nuova chiave all’ssh-agent del client
- Configurazione di SSH
- Conclusione
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.