Quando si tratta di calcolo remoto, SSH è uno dei protocolli più popolari e sicuri. SSH è un protocollo di rete crittografico che stabilisce una connessione sicura con i dispositivi remoti. Una volta connesso a un dispositivo remoto, un utente può eseguire comandi sulla shell remota. SSH è molto comune tra gli amministratori di rete e di sistema.
Questa guida in stile cheat sheet mostra una panoramica di SSH, alcuni modi comuni per connettersi con SSH e varie configurazioni di SSH.
Panoramica di SSH
SSH è l'acronimo di Secure Shell. Alcuni si riferiscono a SSH anche come Secure Socket Shell. SSH è il modo più comune per accedere a un server remoto. Quando ci si connette a un sistema remoto tramite SSH, ci si connette a un account esistente. Una volta connessi, si avrà accesso a una sessione di shell. Tutti i comandi eseguiti verranno eseguiti sulla macchina remota e l'output verrà stampato sul terminale locale.
La connessione SSH segue un modello client-server. Il sistema remoto deve avere in esecuzione il demone SSH per accettare connessioni SSH remote. Il demone SSH ascolta su porte specifiche, autentica le richieste di connessione e genera l'ambiente appropriato quando le condizioni sono soddisfatte.
Per questa guida, abbiamo configurato due server Ubuntu. Il server primario sarà configurato per connettersi al server secondario. Il server secondario sarà configurato per accettare connessioni SSH dal server primario. Questi indirizzi IP dei server verranno utilizzati in tutta la guida:
-
Primario: 31.171.250.121
-
Secondario: 31.171.250.130
Per iniziare, puoi dare un'occhiata alle nostre guide dettagliate su come usare SSH to connettersi a un server remoto in Ubuntu e come configurare il tuo server Linux per utilizzare l'autenticazione basata su chiavi SSH. Ora, iniziamo!
Autenticazione SSH
Esistono due tipi principali di autenticazione SSH. Il metodo tradizionale consiste nell'utilizzare una password. È meno sicuro e fortemente sconsigliato. Il secondo metodo sono le chiavi SSH. Le chiavi SSH offrono una sicurezza molto forte e sono caldamente consigliate.
Sebbene l'autenticazione tramite password sia più semplice da comprendere e configurare, è facilmente sfruttabile. Ad esempio, i bot automatizzati possono utilizzare la forza bruta per penetrare in un sistema. Le chiavi SSH sono chiavi crittografiche. Ogni chiave ha due parti – una chiave privata e una chiave pubblica. La chiave pubblica può essere condivisa ovunque senza alcuna preoccupazione. Tuttavia, la chiave privata deve rimanere protetta.
Per utilizzare le chiavi SSH come metodo di autenticazione, il sistema remoto deve avere una copia della chiave pubblica installata. Anche le copie delle chiavi private e pubbliche dovrebbero essere installate sul sistema locale. Per impostazione predefinita, le chiavi pubbliche sono elencate nel file seguente. Ogni singolo utente ha una copia univoca di questo file:
|
1 |
~/.ssh/authorized_keys |
Ecco come funziona il processo di autenticazione:
-
Il sistema client invia una richiesta di connessione al sistema remoto. Invia anche quale chiave SSH utilizzare.
-
Il sistema remoto controlla se la chiave pubblica è elencata in authorized_keys.
-
Se la chiave esiste, viene generata una stringa casuale e crittografata utilizzando la chiave pubblica. Il messaggio crittografato può essere decrittografato solo utilizzando la chiave privata.
-
Dopo aver ricevuto la stringa, il client decrittograferà la stringa.
-
Combinando la stringa e l'ID di sessione precedentemente negoziato, viene generato un hash MD5. Il client invia l'hash MD5 al sistema remoto.
-
Il sistema remoto conosce la stringa casuale e l'ID di sessione. Se l'hash MD5 corrisponde, la connessione è consentita.
Chiavi SSH
In questa guida, la chiave SSH sarà il fulcro principale dell'autenticazione. Pertanto, questa sezione si concentrerà su come lavorare con le chiavi SSH.
-
Generazione di una coppia di chiavi SSH
Per impostazione predefinita, un sistema Linux non ha una chiave SSH installata. Tuttavia, il sistema potrebbe contenere chiavi SSH generate/installate in precedenza. Supponendo che non ci sia una chiave SSH precedente, dobbiamo generare una nuova coppia di chiavi SSH pubblica e privata. SSH supporta molti algoritmi crittografici per la generazione di chiavi SSH, ad esempio RSA, DSA, ECDSA e EdDSA. RSA è l'algoritmo predefinito e preferito.
-
Generazione di una normale coppia di chiavi RSA
Per generare una coppia di chiavi SSH, esegui il seguente comando:
|
1 |
ssh-keygen |
Il prompt ti chiederà dove memorizzare la coppia di chiavi. Come menzionato, sarà una coppia di chiavi RSA. Se non viene inserito alcun valore, SSH la salverà nella posizione predefinita /home/demo/.ssh/id_rsa.
Il passo successivo consiste nell'inserire una passphrase. Si raccomanda di utilizzare una passphrase. La lunghezza della passphrase è arbitraria. Aggiunge un livello di sicurezza. Tuttavia, SSH consente di generare chiavi senza alcuna passphrase. Basta premere Invio se si desiderano chiavi senza passphrase.
L'output finale fornisce le seguenti informazioni sulla chiave:
-
La posizione della chiave privata ( /root/.ssh/id_rsa). Non dovrebbe mai essere condivisa.
-
La posizione della chiave pubblica ( /root/.ssh/id_rsa.pub). È sicuro condividerla con chiunque.
-
L'impronta digitale della chiave.
-
Un'immagine casuale della chiave. L'idea è che, se c'è una compromissione delle chiavi, probabilmente te ne accorgerai notando un qualsiasi cambiamento nell'immagine della chiave.
-
Generazione di una coppia di chiavi RSA con bit differenti
Per impostazione predefinita, le chiavi SSH sono a 2048 bit. Per la sicurezza, questo è considerato sufficiente. Tuttavia, possiamo specificare manualmente di utilizzare un numero diverso di bit. Più alto è il valore dei bit, più forte è la chiave.
Esegui il comando seguente per generare una coppia di chiavi SSH a 4096 bit. La maggior parte dei server supporta chiavi SSH a 4096 bit. Se la chiave è troppo grande, potrebbe non essere accettata per scopi di protezione DDoS:
|
1 |
ssh-keygen -b 4096 |
Poiché avevamo già generato una coppia di chiavi, SSH chiederà se sovrascrivere quella precedente. Il resto del processo è lo stesso della generazione di una normale coppia di chiavi.
-
Modifica della passphrase della chiave privata
Possiamo modificare la passphrase della chiave privata. Il processo richiede di conoscere la passphrase corrente. Per modificare la passphrase, esegui il comando seguente:
|
1 |
ssh-keygen -p |

Il comando ti chiederà di inserire la posizione della chiave privata. Premi Invio se la chiave è memorizzata nella posizione predefinita. Inserisci la passphrase corrente. Se accettata, potrai indicarne una nuova.
-
Visualizzazione dell'impronta digitale di una chiave SSH
Ogni coppia di chiavi SSH condivide un'impronta digitale crittografica. Questa impronta digitale può essere utilizzata per identificare chiavi uniche. Può essere utile in numerose situazioni. Esegui il comando seguente per verificare l'impronta digitale di una chiave SSH:
|
1 |
ssh-keygen -l |

Inserisci la posizione della chiave. Premi Invio se la chiave è memorizzata nella posizione predefinita.
Copia della chiave pubblica
La coppia di chiavi SSH è pronta per proteggere le connessioni remote. Affinché il sistema remoto accetti la chiave SSH per l'autenticazione, deve disporre di una copia della chiave pubblica. Esistono diversi modi per copiare la chiave pubblica sul server remoto.
-
Utilizzo di ssh-copy-id
Lo ssh-copy-id viene fornito come parte del pacchetto OpenSSH. È il modo predefinito per copiare la chiave pubblica SSH. È semplice e facile da usare. Esegui il comando seguente per trasferire una copia della chiave pubblica:
|
1 |
ssh-copy-id <username>@<secondary_server_ip> |

È necessaria la password dell'account utente remoto per completare il processo. In caso di successo, verrà visualizzato un messaggio di successo.
-
Utilizzo della connessione SSH
Se l'uso dello ssh-copy-id strumento non è disponibile ma il server primario può connettersi al server secondario tramite SSH, allora possiamo usare un trucco diverso per copiare la chiave. Consiste nell'inviare tramite pipe il contenuto della chiave pubblica tramite il comando SSH al lato remoto. Nota che se la directory ~/.ssh non esiste sul sistema remoto, potrebbe non funzionare:
|
1 |
cat ~/.ssh/id_rsa.pub | ssh <username>@<secondary_server_ip> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
-
Copia manuale
Se una connessione remota non è un'opzione, l'unico processo rimasto è aggiungere manualmente la chiave pubblica al server remoto. Innanzitutto, recupera il contenuto della chiave pubblica:
|
1 |
cat ~/.ssh/id_rsa.pub |
Sul server remoto, posiziona la chiave nella posizione appropriata:
|
1 2 3 |
mkdir -pv ~/.ssh echo <public_key> >> ~/.ssh/authorized_keys |
Utilizzo di SSH
Ora che la chiave pubblica è impostata, siamo pronti a usare SSH per connetterci da remoto.
-
Connessione a un sistema remoto
Il primo passo consiste nell'imparare a connettersi al sistema remoto tramite SSH. Si presuppone che sia il sistema locale che quello remoto consentano il traffico SSH. Per connettersi al sistema remoto, digitare quanto segue:
|
1 |
ssh <secondary_server_ip> |

Per connettersi a un utente specifico sul server remoto, utilizzare invece la seguente struttura:
|
1 |
ssh <username>@<secondary_server_ip> |

Se è la prima volta che ci si connette al server, SSH potrebbe mostrare un avviso. Immettere yes per continuare la connessione. Se l'account remoto è protetto da password, sarà necessario inserire la password. Se la chiave SSH è protetta da passphrase, sarà necessario inserire anche la passphrase.
-
Connessione a una porta diversa
Per impostazione predefinita, SSH viene eseguito sulla porta 22. Il client SSH assumerà il valore della porta predefinita durante la connessione al sistema remoto. Tuttavia, se il sistema remoto è in ascolto su una porta diversa per il traffico SSH, non funzionerà. In una situazione del genere, dobbiamo dichiarare manualmente il numero della porta. Per dichiarare la porta specifica, utilizzare il -p flag:
|
1 |
ssh -p <port> <username>@<secondary_server_ip> |
Dichiarare manualmente la porta ogni volta è controproducente. Possiamo modificare il valore della porta predefinita in modo permanente. Per farlo, aprire il file di configurazione SSH. Se il file non esiste, il seguente comando lo creerà:
|
1 |
nano ~/.ssh/config |
Quindi, aggiungere le seguenti righe:
|
1 2 3 4 5 |
Host <remote_alias> HostName <remote_hostname> Port <port_value> |
-
Esecuzione di comandi sul server remoto
Ora che la connessione è stabilita, qualsiasi comando eseguito sul terminale locale verrà inviato al server remoto. Qualsiasi output generato verrà inviato al terminale locale.
Se si tratta di un singolo comando da eseguire, possiamo eseguirlo senza effettuare un accesso SSH completo. Possiamo semplicemente dichiarare il comando dopo l'istruzione di connessione SSH:
|
1 |
ssh <username>@<secondary_server_ip> <command_to_run> |
-
Aggiunta di una chiave a un agente SSH
Se la chiave SSH ha una passphrase, ogni volta che ci si connette al sistema remoto sarà necessario inserirla. Farlo ripetutamente è controproducente. Possiamo lasciare che se ne occupi un agente SSH. Si tratta di una piccola utilità che memorizza la chiave privata dopo aver inserito la passphrase. La chiave privata sarà disponibile durante la sessione del terminale. Per avviare l'agente SSH, eseguire il comando seguente:
|
1 |
eval $(ssh-agent) |

Il programma è in esecuzione in background. Tutto ciò che occorre fare è aggiungere la chiave privata all'agente. Eseguire il comando seguente:
|
1 |
ssh-add |

Inserire la passphrase per completare l'operazione.
-
Inoltro delle credenziali SSH
Possiamo anche configurare SSH per connettersi da un server all'altro senza password. Può essere molto efficiente, specialmente quando si lavora con numerosi server remoti. Per ottenere questo risultato, dobbiamo inoltrare le credenziali SSH. L'inoltro delle credenziali SSH richiede che il server remoto sia configurato per accettare una connessione dalla macchina/server locale. Quindi, tutto ciò che occorre fare è connettersi al primo server utilizzando il -A flag. Inoltra le credenziali ai server per la sessione corrente:
|
1 |
ssh -A <username>@<secondary_server_ip> |
Configurazioni del server remoto
Questa sezione contiene alcune delle configurazioni lato server più comuni per aiutare a migliorare le risposte del server e la sicurezza della connessione.
-
Disattivazione dell'autenticazione tramite password
Se le chiavi SSH sono configurate e la connessione SSH funziona come previsto, allora è sicuro disabilitare l'autenticazione tramite password. La seguente configurazione smetterà di richiedere una password quando un utente si connette tramite SSH. Sul server remoto, apri il sshd_config file con privilegi di root/sudo :
|
1 |
sudo nano /etc/ssh/sshd_config |
Successivamente, cerca la voce PasswordAuthentication. Se la riga è commentata, decommentala. Modifica il valore in no:
|
1 |
PasswordAuthentication no |

Salva il file e chiudi l'editor. Per rendere effettive le modifiche, riavvia il servizio SSH:
|
1 |
sudo service ssh restart |
Se il sistema è CentOS/Fedora, usa invece il seguente comando:
|
1 |
sudo service sshd restart |
-
Modifica della porta SSH
Come menzionato in precedenza, SSH utilizza la porta 22 per scambiare il traffico SSH. Tuttavia, secondo alcuni amministratori di sistema, è meglio assegnare una porta diversa per SSH. Questo può aiutare a contrastare i bot automatizzati che inondano la porta. Per modificare la porta su cui SSH è in ascolto, apri il file sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Cerca la voce Port. Se è commentata, decommentala. Quindi, modifica il valore con un valore diverso. Il valore della porta è un intero a 16 bit non firmato (0-65535):
|
1 |
Port 1024 |

Salva il file e chiudi l'editor. Per applicare la modifica, riavvia il demone SSH:
|
1 |
sudo service ssh restart |
Su CentOS/Fedora, esegui invece il seguente comando:
|
1 |
sudo service sshd restart |
-
Limitazione degli utenti
Possiamo configurare quali account utente possono connettersi tramite SSH. Ciò comporta anche la modifica del file sshd_config . Apri il file con i privilegi di sudo/root:
|
1 |
sudo nano /etc/ssh/sshd_config |
Cerca la voce AllowUsers. Aggiungi gli utenti consentiti:
|
1 |
AllowUsers <user_1> <user_2> |

Salva il file e chiudi l'editor. Riavvia il demone SSH per rendere effettive le modifiche:
|
1 |
sudo service ssh restart |
Su CentOS/Fedora, esegui invece il seguente comando:
|
1 |
sudo service sshd restart |
-
Limitazione dei gruppi
In modo simile alla limitazione degli utenti, possiamo anche determinare quale gruppo di utenti può connettersi al sistema tramite SSH. Apri il file sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Usa la voce AllowGroups per aggiungere uno specifico gruppo di utenti che può utilizzare SSH:
|
1 |
AllowGroups <user_group> |

Salva il file e chiudi l'editor. Riavvia il demone SSH per rendere effettive le modifiche:
|
1 |
sudo service ssh restart |
Per CentOS/Fedora, esegui invece il seguente comando:
|
1 |
sudo service sshd restart |
Nota che se un utente viene aggiunto o rimosso dal gruppo di utenti, il demone SSH deve essere riavviato. Altrimenti, le modifiche al gruppo non saranno effettive.
-
Disabilitazione del login como root
Se hai accesso a un utente con privilegi sudo, si consiglia di disabilitare l'accesso root tramite SSH. Apri il file sshd_config :
|
1 |
sudo nano /etc/ssh/sshd_config |
Modifica il valore della voce PermitRootLogin in no:
|
1 |
PermitRootLogin no |

Salva il file e chiudi l'editor. Riavvia il demone SSH per rendere effettiva la modifica:
|
1 |
sudo service ssh restart |
Su CentOS/Fedora, esegui invece il seguente comando:
|
1 |
sudo service sshd restart |
-
Inoltro dei display delle applicazioni X
Il demone SSH può anche inoltrare il display delle applicazioni X dal server al client. Affinché funzioni, tuttavia, il sistema remoto deve avere un sistema X Window configurato. La funzionalità deve anche essere abilitata dalla configurazione SSH. Apri il file di configurazione SSH:
|
1 |
sudo nano /etc/ssh/sshd_config |
Modifica il valore della direttiva X11Forwarding in yes:
|
1 |
X11Forwarding yes |

Salva il file e chiudi l'editor. Riavvia il demone SSH per rendere effettiva la modifica:
|
1 |
sudo service ssh restart |
Su CentOS/Fedora, esegui invece il seguente comando:
|
1 |
sudo service sshd restart |
Configurazioni del client
In questa sezione, scopri alcune delle configurazioni più comuni sul client SSH.
-
Informazioni di connessione specifiche per il server
Sul sistema locale, possiamo definire le specifiche di una connessione remota. Tutte le informazioni sono memorizzate nel file di configurazione situato in ~/.ssh/config:
|
1 |
nano ~/.ssh/config |
Ogni blocco di sistema remoto è indicato dalla parola chiave Host seguita da un alias. Tutte le direttive specifiche del sistema vanno qui. Quando ci si connette al sistema remoto, SSH le applierà automaticamente. Per una spiegazione completa e approfondita della configurazione, consulta la pagina man:
|
1 |
man ssh_config |

La voce per una connessione remota seguirà la seguente struttura:
|
1 2 3 |
Host <remote_hostname> <directive> <value> |
-
Timeout di connessione
Potresti ritrovarti disconnesso dalle sessioni SSH prima di essere pronto a eseguire qualsiasi azione. Se il client non invia alcun pacchetto al server remoto, dopo un certo periodo di tempo la connessione va in timeout. Per evitare tali circostanze, possiamo configurare il client locale per inviare un pacchetto di tanto in tanto per mantenere attiva la connessione.
Apri il file di configurazione locale:
|
1 |
nano ~/.ssh/config |
Sotto la voce della connessione remota, aggiungi la direttiva ServerAliveInterval seguita dall'intervallo dei pacchetti in secondi:
|
1 |
ServerAliveInterval 120 |

Salva il file e chiudi l'editor.
-
Disabilitare il controllo dell'host
Per impostazione predefinita, ogni volta che si tenta di connettersi a un nuovo server, the client SSH segnalerà l'impronta digitale del demone SSH remoto. È una funzionalità utile per verificare l'autenticità dell’host. Se un malintenzionato tenta di falsificare l'host remoto, questo apparirà come un nuovo server.
Disabilitare questa funzione può comportare un enorme rischio per la sicurezza. In genere, si raccomanda di mantenere attiva questa opzione. In determinate situazioni, tuttavia, disabilitare il controllo dell'host può essere comodo. Apri il file di configurazione:
|
1 |
nano ~/.ssh/config |
Sotto la sezione dell'host remoto, aggiungi le seguenti direttive:

|
1 2 3 |
StrictHostKeyChecking no UserKnownHostsFile /dev/null |
La prima direttiva disabiliterà l'aggiunta automatica di nuovi host all'elenco degli host noti, memorizzato nel file known_hosts. La seconda direttiva serve a non avvisare di eventuali modifiche. Salva il file e chiudi l'editor.
-
Multiplexing SSH su una singola connessione TCP
A volte, stabilire una connessione TCP può richiedere parecchio tempo. Se è necessario effettuare più connessioni alla stessa macchina, il multiplexing è un'ottima funzionalità di cui puoi approfittare. Il multiplexing SSH consente di utilizzare la stessa connessione TCP per più sessioni SSH. Riduce parte del carico di lavoro richiesto per stabilire nuove sessioni. Anche limitare il numero di connessioni può essere d'aiuto.
Possiamo impostare manualmente una connessione multiplexing o lasciare che SSH la utilizzi ogni volta che è disponibile. Qui configureremo SSH per seguire la seconda strada. Apri il file di configurazione di SSH:
|
1 |
nano ~/.ssh/config |
Aggiungi una definizione di host con carattere jolly (wildcard) in cima al file. Ciò garantisce che il set successivo di direttive verrà applicato a tutte le connessioni remote. Aggiungi le seguenti direttive:
|
1 2 3 4 5 |
ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1 |

La prima direttiva dice a SSH di utilizzare automaticamente il multiplexing ogni volta che è disponibile. La seconda direttiva stabilisce il percorso del socket di controllo. Questo socket verrà creato quando viene stabilita la prima sessione. Le sessioni successive seguiranno questo socket.
L'ultima direttiva dice a SSH di lasciare che la connessione master iniziale rimanga in background. Significa anche che le connessioni TCP termineranno automaticamente un secondo dopo l'ultima sessione SSH. Successivamente, crea la directory che abbiamo dichiarato nel file di configurazione:
|
1 |
mkdir -pv ~/.ssh/multiplex |
Infine, il multiplexing dovrebbe essere attivo.
Codici di escape SSH
Dopo aver stabilito una connessione, ci sono modi per controllarne il comportamento utilizzando i codici di escape.
-
Forzare la disconnessione
Sei bloccato su una sessione SSH? Le sessioni SSH sono generalmente gestite dal server. Se il server riscontra problemi, rimanere bloccati su una sessione SSH interrotta può essere frustrante. Fortunatamente, OpenSSH offre utili controlli per gestire lo stato della connessione dal lato client.
Premi Invio un paio di volte. Quindi, inserisci il seguente comando:
|
1 |
~. |
![]()
Qui, ~ è il carattere di controllo. Dopo aver eseguito questo comando dal client, la connessione dovrebbe chiudersi immediatamente.
-
Sessione SSH in background
Possiamo anche mettere una sessione SSH in background. Quando viene messa in background, tornerai alla normale sessione di shell. Una volta terminato il lavoro, potrai tornare nuovamente alla shell SSH. Nota che è necessario disporre di una configurazione di timeout adeguata per evitare il timeout mentre la sessione SSH rimane in background. Per mettere una sessione SSH in background, inserisci il carattere di controllo seguito da Ctrl + Z:
|
1 |
~<Ctrl + Z> |

Se si trattava del tuo task in background più recente, puoi riattivarlo utilizzando il seguente comando:
|
1 |
fg |
Se ci sono più task in background, possiamo determinarlo dall'elenco dei job:
|
1 |
jobs |

Per portare il job di destinazione in primo piano, prendi nota del valore del job dalla prima colonna. Quindi, esegui il seguente comando:
|
1 |
fg %<job_value> |
-
Modifica della configurazione del port forwarding
Utilizzando il meccanismo di controllo, possiamo modificare le regole di port forwarding al volo. Una volta stabilita la connessione, possiamo creare o eliminare le regole di port forwarding. Fa parte dell'interfaccia a riga di comando di SSH.
Per accedere all'interfaccia a riga di comando di SSH, esegui il comando:
|
1 |
~C |
![]()
Per elencare le opzioni disponibili, inserisci il seguente comando:
|
1 |
-h |
Se l'output è troppo ridotto, prova ad aumentare il livello di verbosità utilizzando il seguente comando di controllo:
|
1 |
~v |
Ora, esegui nuovamente il comando -h:
|
1 |
-h |

As the output explains, it’s quite simple to implement any of the port forwardings with a simple command. For example, a tunnel can also be distrutto utilizzando il comando kill, indicato da K nell'elenco dei comandi.
Considerazioni finali
È piuttosto comune imbattersi in SSH. Ecco perché imparare a usare SSH è molto utile. La nostra panoramica completa su SSH copre le configurazioni SSH più importanti che gli utenti devono conoscere per utilizzare SSH quotidianamente. Una volta acquisite, dovresti essere in grado di lavorare con quasi tutte le configurazioni dei server SSH.
Buon divertimento con l'informatica!
Commenti
Ancora nessun commento. Scrivi il primo.