Tips and tricks: SSH ProxyJump

Pubblicato il 22/07/2017 in Technology • 2 min read

Datemi un accesso SSH e solleverò il mondo!

Come al solito, ci ritroviamo nella situazione in cui non possiamo accedere direttamente via SSH ad un server ma dobbiamo passare per un firewall che - brutto! cattivo! - non è configurato per inoltrare una porta verso il server dove dobbiamo arrivare.

E, come sempre, SSH è il miglior amico del sistemista e ci permette di saltellare da un host all'altro ed accedere al server non esposto su internet.

SSH ha una direttiva molto interessante, che si chiama - come si può notare dal titolo del post - ProxyJump che serve proprio al nostro scopo.

Certo, potremmo far tutto con i tunnel, ma forse con ProxyJump è tutto più semplice. Vediamo come!

L'infrastruttura

Ipotizziamo di avere:

  • un client connesso a internet
  • un firewall con accesso ssh
  • il server non esposto su internet

Il firewall è esposto sulla porta 10022, mentre il server ha SSH in ascolto sulla porta 22.

Siamo pronti a saltellare?

L'opzione da usare da riga di comando per saltellare da un host all'altro è -J:

user@client:~$ ssh -J fwuser@firewall:10022 admin@server 
fwuser@firewall's password: 
admin@server's password:`

admin@server:~$

Come è possibile notare, ci vengono chieste due password: la prima per l'accesso al firewall, la seconda è relativa al server.

SSH config file

Se non vogliamo ricordarci tutti i vari salti da effettuare (noi ne abbiamo visto uno, ma magari in infrastrutture complesse possono esserci più host da attraversare), possiamo utilizzare il file di configurazione di SSH.

Ma dov'è questo file? Ogni utente può creare il file .ssh/config nella propria home directory; oppure, è possibile effettuare una configurazione globale modificando il file /etc/ssh/ssh_config (/usr/local/etc/ssh_config su FreeBSD).

Data sempre la nostra infrastruttura, vediamo come creare il file di configurazione:

Host external-fw  
    Hostname firewall
    Port 10022
    User fwuser

Host internal-server
    Hostname server
    Port 22
    User admin
    ProxyJump external-fw

Di seguito la spiegazione delle varie direttive:

  • Host indica il nome con cui vengono raggruppate le informazioni di connessione: possiamo scegliere ciò che più ci aggrada, avendo cura di non duplicare i nomi
  • Hostname indica il nome DNS o l'indirizzo IP da raggiungere
  • Port è la porta a cui effettuare la connessione
  • User è il nome utente per l'autenticazione
  • ProxyJump indica l'host da attraversare (se più di uno, gli host elencati devono essere separati da virgola): si può scegliere di usare il nome usato nella configurazione di SSH o direttamente l'indirizzo da raggiungere

Con questa configurazione, possiamo semplicemente digitare:

user@client:~$ ssh internal-server fwuser@firewall's password: admin@server's password:

admin@server:~$

per accedere al server non esposto della nostra infrastruttura; chiaramente, ci verranno chieste le password di ogni host da attraversare, a meno di non avere le chiavi SSH per l'autenticazione.

Conclusioni

Abbiamo visto come usare la direttiva ProxyJump di SSH per accedere a server non esposti su internet attraverso degli host intermedi.

Al prossimo post!