Il funzionamento base del comando SSH è molto semplice: ssh nomeUtente@server.com
. Ma quando iniziamo ad aggiungere parametri e svolgere configurazioni avanzate rischiamo rapidamente di trovarci a dover digitare dei "mostri" come ssh -i /home/zane/ssh/chiave2 -R 8080:127.0.0.1:8080 -p 2222 root@server.com
ogni volta che vogliamo connetterci. E, se dobbiamo passare per un server intermedio (proxy server), le cose si complicano ancora di più. Ebbene: il file .ssh/config
è fatto apposta per semplificarci la vita, e riportare tutto ad un più pratico comando ssh mioserver
(indipendentemente dal numero di parametri). Vediamo come utilizzarlo al meglio in questa guida a .ssh/config per Windows 10 o Linux
nota: in questo articolo parleremo nello specifico del file .ssh/config
e di come utilizzarlo per semplificare la connessione SSH in ambiente Windows 10 o Linux. Per la guida generale per iniziare con SSH, si veda quest'altro approfondimento:
Per chi ha fretta: un file .ssh/config completo
Nel corso della presente guida vedremo in dettaglio tutte le opzioni principali. Se però sei già esperto e cerchi semplicemente un file .ssh/config completo e pronto da personalizzare, eccoti servito:
## Server aziendale
Host azienda
Hostname utenti.mia-azienda.com
User pippo
Port 2222
IdentityFile ~/.ssh/id_rsa_server-aziendale
StrictHostKeyChecking no
LocalForward 5555 localhost:3306
LocalForward 5556 localhost:27017
LocalForward 5557 localhost:27018
LocalForward 6666 192.168.0.2:3306
RemoteForward 9003 localhost:9001
ProxyJump nome-utente-accesso-proxy@nome-server-proxy.mia-azienda.com:2222
Di seguito vedremo in dettaglio il significato di ogni opzione.
Creare/aprire il file .ssh/config
Il file config
di SSH è un semplice file di testo che risiede all'interno della sotto-cartella .ssh
della nostra directory "home":
- con Windows 10:
C:\Users\nome-utente\.ssh
- con Linux:
/home/nome-utente/.ssh
In caso la sotto-cartella ancora non esistesse, creiamola ora
All'interno di essa, creiamo il nostro file config
. Nello svolgere l'operazione (soprattutto in ambiente Windows), facciamo la massima attenzione ad ottenere esattamente un file di nome config
, senza estensione, e non config.txt
!
» Leggi: Come visualizzare le estensioni dei file con Windows 10
A questo punto, apriamolo con Blocco note o un altro editor di testo semplice.
Creare un semplice "profilo" di connessione SSH con .ssh/config
All'interno del file .ssh/config
dobbiamo creare un "profilo" per ogni PC o server al quale vogliamo connetterci. Ognuno di questi profili conterrà tutti i dati e le opzioni relative a quella connessione. Per esempio: immaginiamo di utilizzare spesso SSH per connetterci al server con nome a dominio utenti.mia-azienda.com e di dover utilizzare il nome utente pippo
per il login. Impartiremo quindi molte volte al giorno questo comando: ssh pippo@utenti.mia-azienda.com
Per semplificare le cose, aggiungiamo queste righe al nostro file .ssh/config
:
## Server aziendale
Host azienda
Hostname utenti.mia-azienda.com
User pippo
Salviamo e, d'ora in avanti, potremo facilmente connetterci al server in questione impartendo solamente:
ssh azienda
Possiamo naturalmente creare tutti i profili che desideriamo seguendo questo schema:
## Server aziendale
: tutte le righe che iniziano con il carattere#
vengono ignorate. Possiamo usare questi commenti per appuntarci alcune informazioni sul server in questioneHost azienda
: è un nome a piacere che identifica questo server. Successivamente, quando impartiremo il comandossh
seguito da questo nome, ci connetteremo a questo serverHostname utenti.mia-azienda.com
: è il nome a dominio oppure l'indirizzo IP del server SSH al quale vogliamo connetterciUser pippo
: è il nome utente che dobbiamo utilizzare sul server SSH per l'autenticazione
.ssh/config: Specificare la porta SSH
Se il server SSH utilizza una porta diversa dalla 22
(cioè quella predefinita), probabilmente siamo abituati ad accodare il parametro -p
seguito dal numero di porta (ad esempio: -p 2222
) quando digitiamo il comando di connessione: ssh pippo@utenti.mia-azienda.com -p 2222
.
In tal caso, aggiungiamo anche questa informazione al nostro profilo:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
Port 2222
Così facendo, potremo continuare ad usare il nostro comando ssh azienda
senza aggiungere nient'altro.
.ssh/config: Utilizzare una chiave differente
Come abbiamo visto nella guida dedicata, SSH consente di eseguire login utilizzando un ben più robusto file-chiave al posto della password:
» Leggi: [guida] Come creare una chiave SSH da PC Windows, Linux, Mac e accedere ai server senza password
Generalmente, il sistema funziona automaticamente selezionando il file-chiave che si trova in .ssh/id_rsa
. Se, però, è necessario utilizzare uno specifico file-chiave, diverso da quello standard, generalmente si usa l'argomento -i
seguito dal percorso del file:
ssh pippo@utenti.mia-azienda.com -i ~/.ssh/id_rsa_server-aziendale
Possiamo specificare questo percorso nel profilo di connessione del file .ssh/config
, di modo da non doverlo specificare ogni volta:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
IdentityFile ~/.ssh/id_rsa_server-aziendale
Con questa semplice accortezza, potremo continuare ad usare il nostro comando ssh azienda
, utilizzando però il file-chiave indicato.
StrictHostKeyChecking in .ssh/config
In alcune circostanze, può capitare che l'identità del server al quale ci stiamo connettendo in SSH venga modificata. Questo può succedere, ad esempio, se l'amministratore di sistema svolge alcune operazioni di manutenzione significative, quali la sostituzione del server remoto, oppure modifica il suo indirizzo IP
Quando questo avviene, il nostro client SSH mostra un messaggio simile a WARNING: POSSIBLE DNS SPOOFING DETECTED!
e/o WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
e blocca la connessione
Il modo corretto e sicuro di gestire la situazione è di verificare con il gestore del server al quale ci stiamo connettendo che sia tutto in ordine, poi seguire le istruzioni fornite nel messaggio di errore per aggiornare la configurazione locale. Se però siamo di fretta, possiamo aggiungere una linea al nostro profilo per ignorare questo tipo di errori:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
StrictHostKeyChecking no
Così facendo, alla prossima connessione verrà comunque visualizzato un messaggio di avviso, ma poi potremo comunque collegarci utilizzando l'autenticazione tramite chiave (in questa circostanza, l'autenticazione via password viene sempre disattivata per motivi di sicurezza).
.ssh/config: Esporre un servizio remoto al PC locale con un tunnel SSH
In alcune circostanze, risulta necessario connettersi, dal PC locale, a servizi raggiungibili solamente dal server remoto. Un esempio su tutti: capita spesso di collegarsi in SSH ad un server sul quale è in esecuzione un database (come MySQL). Tale servizio non è però esposto su Internet, ma raggiungibile solo dal server stesso. Per collegarci al database in questione dal nostro PC dobbiamo quindi sfruttare la connessione SSH tramite un tunnel SSH
Aprire tale tunnel tramite file .ssh/config
è semplicissimo:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
LocalForward 5555 localhost:3306
Dove:
5555
: è il numero di porta locale sulla quale vogliamo rendere raggiungibile il servizio remoto - può essere un numero qualsiasi, a patto che non sia già utilizzata da altri servizi locali3306
: è il numero della porta sul server che desideriamo rendere disponibile al nostro PC locale -3306
, per inciso, è la porta di default utilizzata da MySQL
» Leggi anche: Porta 80 aperta! cosa significa? Guida riepilogativa ai principali numeri di porta TCP per la comunicazione in rete
A questo punto, dal nostro PC, potremo collegarci alla porta locale 5555
, alla quale risponderà il database remoto
Per inciso: quella appena descritta è esattamente la modalità che utilizzo per collegarmi al database di TurboLab.it!
Un altro esempio per affrontare una necessità molto comune: stabilire la connessione ad un'istanza MongoDB in esecuzione sul server remoto (questo deve SEMPRE essere bloccato e rimanere accessibile solo localmente!):
Host azienda
Hostname utenti.mia-azienda.com
User pippo
LocalForward 5556 localhost:27017
LocalForward 5557 localhost:27018
Così facendo, potremmo accedere ai dati di MongoDB dal nostro PC collegandoci alle porte locali 5556
e 5557
.
.ssh/config: tunnel SSH verso un servizio in esecuzione su un altro server
Come variante, leggermente più complicata, del caso precedente, immaginiamo che il database o l'istanza MongoDB sia in esecuzione su di un altro server. Ovvero: noi ci colleghiamo in SSH ad un primo server che, a sua volta, si connette ad un database in esecuzione su un server distinto. Il "server database" non è direttamente accessibile dal nostro PC
In questo caso dobbiamo configurare un tunnel che attraversi il server SSH al quale siamo collegati per poi raggiungere il servizio sul secondo server.
Nel nostro file .ssh/config
scriveremo qualcosa di simile a questo:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
LocalForward 5555 192.168.0.2:3306
Dove:
5555
: è il numero di porta locale sulla quale vogliamo rendere raggiungibile il servizio remoto - può essere un numero qualsiasi, a patto che non sia già utilizzata da altri servizi locali192.168.0.2:3306
: è l'indirizzo IP del "secondo server", seguito dal numero di porta che eroga il servizio che ci interessa - di nuovo:3306
, qui usato come esempio, è la porta di MySQL
A questo punto, dal nostro PC, potremo collegarci alle porte locali che abbiamo scelto, sulle quali risponderanno i servizi in esecuzione sul "secondo server"
.ssh/config: Esporre un servizio locale al server remoto (tunnel SSH al contrario)
Nei due esempi precedenti abbiamo visto come rendere disponibile un servizio remoto al PC locale. Ma è possibile anche fare l'inverso, ovvero rendere disponibile un servizio locale al server remoto. Per mantenere analogia con l'esempio precedente: immaginiamo che il database, questa volta, sia in esecuzione sul PC locale e lo si voglia esporre al server remoto.
Nella mia esperienza, ho avuto bisogno di utilizzare questa configurazione solo in un caso specifico: con Xdebug, uno strumento di debugging per PHP in esecuzione sul server web che si connette ad una porta del nostro PC, sulla quale è in esecuzione l'ambiente di sviluppo (IDE). Allo scopo, seguiamo questa configurazione:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
RemoteForward 9003 localhost:9001
Così facendo, la porta locale 9001
diverrà contattabile dal server sulla sua porta 9003
(utilizzata di default da Xdebug), permettendo la sessione di debug tramite l'IDE in esecuzione sul PC locale.
» Leggi anche: Come configurare Xdebug e Visual Studio Code: la Guida Definitiva al debug PHP (con stop sui breakpoint!)
.ssh/config: Configurare un proxy intermedio
In alcuni ambienti aziendali, non è possibile collegarsi direttamente in SSH ai server/PC che desideriamo. Per migliorare la sicurezza, è infatti richiesto di collegarsi dapprima ad un server SSH "di frontiera" (detto proxy) e, da qui, "rimbalzare" verso il server al quale vogliamo effettivamente connetterci
La configurazione, in questo caso, rimane praticamente identica. Nel nostro profilo continuiamo infatti ad indicare il server "finale" al quale desideriamo connetterci, ma aggiungiamo poi un'altra riga dedicata alla connessione al proxy:
Host azienda
Hostname utenti.mia-azienda.com
User pippo
ProxyJump nome-utente-accesso-proxy@nome-server-proxy.mia-azienda.com:2222
Dove:
nome-utente-accesso-proxy
: è il nome utente da utilizzare per connettersi al server intermedionome-server-proxy.mia-azienda.com
: è il nome a dominio (oppure l'indirizzo IP) del server intermedio, ovvero quello che svolge il ruolo di proxy2222
: è il numero di porta SSH sul server intermedio
Dopo aver configurato le cose in questo modo, potremo utilizzare il nostro solito comando ssh azienda
per attraversare il proxy e raggiungere la nostra destinazione finale come al solito: il proxy sarà del tutto "invisibile".
.ssh/config: Specificare valori comuni a tutti i profili
Se abbiamo molti profili configurati, è interessante notare che non è necessario ripetere le direttive comuni in ogni singolo profilo. Se, ad esempio, il nome utente da utilizzare per l'accesso è sempre pippo
e/o la porta è sempre la 2222
, possiamo indicare questi valori come default tramite un profilo dedicato:
Host *
Username pippo
Port 2222
Chiaramente possiamo aggiungere a questa sezione anche tutte le altre opzioni "comuni". In ogni caso, restiamo liberi di definire eccezioni puntuali per ogni singolo profilo. Ad esempio:
Host azienda
Hostname utenti.mia-azienda.com
User root
Port 22
Conclusioni
In questo articolo abbiamo visto come sfruttare il file .ssh/config per semplificare le connessioni SSH. Se usato in modo appropriato, questo file di configurazione ci permette di connetterci ai nostri server o PC tramite SSH in modo molto più comodo, in particolar modo per quelle connessioni che richiedono una lunga lista di opzioni per funzionare correttamente.
Personalmente, aggiunto sempre un nuovo profilo al file prima di stabilire una connessione SSH, non fosse altro per la comodità di accorciare il comando e non dover specificare il nome utente ogni volta.