Il tunneling ssh è un meccanismo che permette di fare il forwarding di porte fra client e server. Può essere utilizzato per aggiungere uno strato di crittografia ad applicazioni che non la supportano in maniera nativa.
Un altro utilizzo frequente è la possibilità di bypassare i firewall sfruttando una connessione ssh. Questa caratteristica può essere utilizzata sia da amministratori di sistema per garantirsi l’accesso da remoto a determinati servizi che non sono direttamente esposti sulla rete pubblica, ma apre anche scenari di abusi da parte di hacker. Questi ultimi potrebbero infatti, nel caso riuscissero ad ottenere un accesso ssh, sfruttare lo stesso meccanismo per raggiungere servizi interni alla rete del server.
Alcuni utilizzi di esempio potrebbero essere la necessità di ottenere una connessione FTP crittografata. Il protocollo FTP non supporta la crittografia, per questo motivo l’utilizzo di un tunnel ssh dentro cui instradare i dati della connessione FTP renderebbe la comunicazione crittografata.
Un altro utilizzo potrebbe essere la necessità di accedere ad un server mysql per eseguire operazioni di amministrazione. I database solitamente non sono direttamente esposti sulla rete, ma solamente alle macchine che ne devono fare uso. Lo sfruttamento di un ssh tunnel potrebbe permettere di accedere al servizio dall’esterno senza esporre direttamente la porta e il server.
Tipi di ssh tunnel
Esistono tre diversi tipi di tunnel ssh, vediamo quali sono e una loro breve descrizione.
- Local forwarding (tunnel locale): Permette di creare un tunnel dal client ssh ad un server ssh, consentendo quindi di raggiungere, attraverso il client, servizi che il server può raggiungere ma che risultano “nascosti” al client.
- Remote forwarding (tunnel remoto): Si tratta del contrario del tunnel locale, ovvero della possibilità di raggiungere servizi del client attraverso una connessione al server.
- Dynamic forwarding: Questa modalità permette di creare un server proxy SOCKS, permettendo quindi di esporre un insieme di porte.
A questo punto passiamo ad esaminare queste diverse modalità di ssh tunneling.
Local forwarding
Come abbiamo detto il local forwarding è utilizzato per “forwardare” una porta dalla macchina del client a quella del server. In pratica il client ssh si mette in ascolto su una determinata porta, e quando riceve una connessione, la instrada attraverso il tunnel verso il server ssh. Il server poi instrada la connessione verso una determinata porta di destinazione, anche su una macchina diversa dal server stesso.
Alcuni utilizzi tipici del local forwarding sono:
- Reindirizzamento di sessioni e trasferimenti di file attraverso server raggiungibili dall’esterno.
- Connessione a servizi offerti in una rete interna dall’esterno senza necessità di renderli direttamente raggiungibili.
Possiamo pensare ad esempio ad un’azienda che voglia permettere l’accesso ssh ad alcuni suoi server interni. Può farlo permettendo il tunneling ssh tramite un singolo server esposto pubblicamente. In questo modo tale server potrebbe essere fortificato con particolare accuratezza contro intrusioni e con una politica di logging delle connessioni particolarmente attenta e stringente.
In OpenSSH, possiamo configurare il local forwarding in questo modo:
ssh -L 80:internal.informaticappunti.it:80 gateway.informaticappunti.it
Con questo comando stiamo creando un tunnel ssh tra il client su cui lo lanciamo e il server gateway.informaticappunti.it. Ogni connessione verso la porta 80 della macchina client verrà instradata attraverso il tunnel verso il server gateway.informaticappunti.it. Una volta giunta al server, la connessione verrà instradata alla porta 80 del server locale internal.informaticappunti.it.
La configurazione di default permette a chiunque possa raggiungere il client sulla porta 80 di utilizzare il tunnel per raggiungere il servizio interno. Le connessioni possono però essere ristrette al solo client aggiungendo esplicitamente l’indirizzo ip locale:
ssh -L 127.0.01:80:internal.informaticappunti.it:80 gateway.informaticappunti.it
Se necessario possiamo specificare un diverso utente per effettuare la connessione ssh verso gateway.informaticappunti.it aggiungendolo al comando:
ssh -L 80:internal.informaticappunti.it:80 <utente>@gateway.informaticappunti.it
Remote forwarding
Come abbiamo detto, il remote forwarding funziona più o meno al contrario del Local forwarding.
Il Remote forwarding è definito tramite l’opzione -R. Vediamo un esempio e poi lo commenteremo.
ssh -R 8080:localhost:80 public.informaticappunti.it
Con questo comando creiamo un tunnel fra il client e public.informaticappunti.it
. Tutte le connessioni in arrivo sulla porta 8080 del server public.informaticappunti.it
verranno instradate attraverso il tunnel e raggiungeranno il client SSH che effettuerà una connessione sul localhost porta 80. Localhost può essere sostituito con un altro hostname o un indirizzo ip per far si che la connessione venga instradata verso un host esterno.
In questo modo un servizio erogato sulla macchina client può essere esposto attraverso un host pubblico.
La configurazione predefinita di OpenSSH permette le connessioni alle porte con remote forwarding solamente dal server. Questo comportamento può però essere modificato attraverso la configurazione del parametro GatewayPorts
sul server ssh. Questo parametro può essere configurato in doversi modi:
GatewayPorts no
Questo permette la connessione alle porte su cui è stabilito il tunnel solamente se provenienti dal server stesso.
GatewayPorts yes
Questo permette la connessione alla porta su cui è attivo il tunnel da qualsiasi host. Se il server è esposto pubblicamente su internet, chiunque abbia accesso ad internet potrà sfruttare il tunnel per raggiungere il servizio interno.
GatewayPorts clientspecified
In questo caso si lascia l’onere a chi stabilisce il tunnel di fornire un ip specifico da cui accettare le connessioni. In questo modo solamente l’ip specificato potrà usufruire del tunnel.
La sintassi per stabilire il tunnel specificando l’indirizzo ip sorgente è la seguente:
ssh -R 203.0.113.54:8080:localhost:80 public.informaticappunti.it
In questo esempio la connessione al tunnel attraverso al porta 8080 sarà consentita solamente all’indirizzo ip 203.0.113.54
Dynamic forwarding
Il port forwarding dinamico permette di creare sul client un proxy server SOCKS. Questo permette di effettuare un forwarding dinamico a livello di applicazione. Il client si metterà in ascolto su una porta del client locale. Quando viene instaurata una connessione su questa porta, quest’ultima viene instradata attraverso il tunnel e il protocollo viene utilizzato per determinare la porta di destinazione dalla macchina server.
L’opzione da utilizzare in questo caso è -D
ssh -D 8080 <utente>@public.informaticappunti.it
Questo metterà in ascolto il client sulla porta 8080 verso il server public.informaticappunti.it
Anche in questo caso se vogliamo restringere l’accesso al tunnel possiamo specificare l’indirizzo ip ponendolo prima della porta.
La sintassi diventerà quindi la seguente:
ssh -D 203.0.113.54:8080 <utente>@public.informaticappunti.it
In questo modo la connessione al tunnel sarà permessa solamente dall’indirizzo 203.0.113.54
Tunnel ssh su windows
ssh viene utilizzato prevalentemente su macchine linux o mac OS. Essendo tipico di questi sistemi operativi, spesso ci si dimentica degli utenti windows.
A differenza dei sistemi linux/mac, Windows non ha una shell con installato ssh di default. Per gli utenti del sistema operativo Microsoft l’opzione più utilizzata è il client SSH Putty. Può essere scaricato a questo link e permette di creare tutti e tre i tipi di tunnel presi in analisi.
Una volta installato e aperto putty possiamo procedere alla configurazione del tunnel in questo modo:
- Inseriamo l’indirizzo IP o il nome host del server SSH a cui vogliamo connetterci nel campo
Host name (or IP address)
- A questo punto occorrerà andare nella scheda di configurazione Connection -> ssh -> Tunnels
- In questa schermata potremo scegliere il tipo di tunnel che vogliamo instaurare (selezionando Local, Remote o Dynamic)
- In base alla scelta del tipo di tunnel dovremo compilare i campi necessari per la sua configurazione.
- Local: Occorrerà impostare la porta locale nel campo Source port, e nel campo Destination dovremo impostare l’host o ip di destinazione e la relativa porta (ad esempio 127.0.0.1:80 oppure internal.informaticappunti.it:80).
- Remote: In questo caso dovremo inserire nel campo Source port la porta da aprire sul server ssh, e nel campo Destination l’host o ip di destinazione e la relativa porta. In questo caso, essendo un tunnel di tipo remote, la destination sarà un host raggiungibile dal client.
- Dynamic: Per questa scelta occorrerà impostare la porta SOCKS locale nel campo Source port.
- Una volta impostate Source port e Destination, possiamo fare click su Add per confermare la nostra scelta.
- A questo punto se vogliamo accedere facilmente a questa configurazione in futuro possiamo tornare nella sezione Session.
- Inseriamo un nome per la configurazione nel campo Saved Sessions e poi facciamo click su Save per salvare il tutto.
- A questo punto quando avremo bisogno del tunnel, ci basterà selezionare la configurazione salvata, e fare click su Open per avviare la sessione.
- Una volta fatto click su Open, ci verrà chiesto di inserire nome utente e password per l’accesso al server SSH configurato.
- Dopo aver inserito i dati di autenticazione verrà instaurata la connessione e il tunnel tra le due macchine verrà aperto.
Conclusioni
Abbiamo visto cos’è e come configurare il tunneling ssh, chiamato anche ssh port forwarding. Il primo impatto potrebbe sembrare complicato, ma una volta capito il funzionamento e le potenzialità sarà più semplice sfruttare questo potente strumento.
Quando inizierete ad utilizzarlo probabilmente inizieranno a venirvi in mente sempre più occasioni in cui potrete sfruttarlo a proprio vantaggio.