Semplificarsi la vita con un file di configurazione SSH
Se almeno una volta avete avuto a che fare con la gestione di server, sistemi IoT ma anche semplicemente shared hosting e macchine virtuali, sarà capitato di avere molteplici indirizzi, username e password, spesso completamente diversi fra loro, spesso composte da sequenze di caratteri difficili se non impossibili da ricordare e magari nessun dominio ma un mero IP statico.
Shell alias
Ipotizziamo di avere un server remoto dev.example.com
, che non sia stato configurato con delle chiavi pubbliche/private per l’accesso senza password.
L’username d’accesso ipotizziamo sia “alan”. E la porta non è la standard 22 ma la 2200, per evitare tentativi di login automatici indesiderati.
Questo significa che un comando tipico sarà:
$ ssh alan@dev.example.com -p 22000 password: ************* |
Possiamo rendere le cose più semplici e sicure usando una coppia di chiavi pubblica e privata. Si raccomanda l’uso di ssh-copy-id
per spostare in giro la propria chiave pubblica. Ci risparmia la seccatura di dover gestire eventuali problemi di permessi legati alle cartelle e al file spostato.
Dunque assumendo di aver configurato la coppia di chiavi, il comando sufficiente sarà:
$ ssh [email protected] -p 22000
Non è così male. Per abbreviare ulteriormente e velocizzare l’operazione è possibile creare un’alias sulla shell:
$ alias dev='ssh [email protected] -p 22000' $ dev # Per connettersi |
Questo funziona egregiamente: Ogni nuovo server a cui ci si vuol connettere necessita di un nuovo alias che può essere inserito in modo permanente all’interno del file .bashrc
Tuttavia c’è un’altra soluzione ancora più elegante a questo problema.
~/.ssh/config
SSH già predispone un file di configurazione. Che può essere globale (/etc/ssh/ssh_config
) o user-specific (~/.ssh/config
).
L’esempio sopra si tradurrebbe in:
# contenuto di $HOME/.ssh/config Host dev HostName dev.example.com Port 22000 User alan |
Questo significa che è sufficiente lanciare il comando ssh dev
per connettersi in SSH al server. Il comando va infatti a leggersi il file di configurazione in cerca di un Host chiamato “dev”.
Vediamo invece un altro esempio che fa si che venga usata una determinata chiave privata per tutte le operazioni relative all’account Github.
Host github.com IdentityFile ~/.ssh/github.key |
L’uso di IdentityFile
permette di specificare esattamente quale chiave privata usare per l’autenticazione con l’host.
Ovviamente è possibile specificarla anche durante le connessioni lanciate con il comando manualmente:
$ ssh -i ~/.ssh/blah.key username@host.com |
Ancora un altro esempio di configurazione per connetterci al Raspberry-Pi:
Host rpi hostname roccomuso.ddns.net IdentityFile /home/user/.ssh/rpi.pub User root Port 22 |
Così che da linea di comando sarà sufficiente lanciare ssh rpi
per ritrovarci dentro al Raspberry come se niente fosse.
Tunnel SSH
Spesso su certi server si tende a inserire un firewall per non esporre tutte quelle porte che rimandano a servizi con dati sensibili, vedi porte per DataBase etc.
Si potrebbe pensare che questo previene la possibilità di accedere a quel servizio da remoto e dunque ad esempio non ci potremmo connettere dal nostro Client per la visualizzazione dei dati. Ma non è del tutto così.
Possiamo infatti fare un semplice reindirizzamento della porta locale, in gergo, un Tunnel SSH:
$ ssh -f -N -L 9906:127.0.0.1:3306 pippo@database.example.com # -f mette ssh in background # -N non permette l'esecuzione di comandi remoti |
Questo comando non fa altro che inoltrare tutto il traffico sulla porta 9906 alla porta 3306 sul server remoto dev.example.com. Facendo si che puntando il client all’indirizzo localhost:9906
ci si connetta di fatti alla porta 3306 sul server remoto. Nota bene che nel comando sopra, l’indirizzo 127.0.0.1
fa riferimento all’host REMOTO, dunque volendo far un tunnel verso la porta 80 di un altro host presente nella rete bersaglio, si può semplicemente sostituire 127.0.0.1
con 192.168.1.1
ad esempio.
Anche in questo caso, piuttosto che memorizzare indirizzi e parametri necessari per ottenere questo tipo di soluzioni. Possiamo codificare il tutto nel nostro pratico file di configurazione:
Host tunnel HostName database.example.com IdentityFile ~/.ssh/coolio.example.key LocalForward 9906 127.0.0.1:3306 User pippo |
Così da poter stabilire una connessione con il comando: ssh -f -N tunnel
Conclusione
Ci sono diverse opzioni di configurazione per SSH. Si consiglia dunque di rifarsi alla documentazione ufficiale per eventuali approfondimenti.
Spero che questi consigli possano tornare utile a qualcuno. Se avete altri suggerimenti o miglioramenti che è possibile apportare, lasciate pure un commento!
Commenti