Project

General

Profile

AutosshTunnel » History » Version 8

Chiara Barbucci, 07/20/2017 04:00 PM

1 1 Simone Piccardi
h1. Creare tunnel permanenti con autossh
2 1 Simone Piccardi
3 6 Chiara Barbucci
Ci sono molte occasioni in cui occorre creare delle connessioni verso macchine e servizi protetti da firewall che è opportuno cifrare e proteggere adeguatamente ma per le quali la creazione di una VPN diventa un onere eccessivo.
4 1 Simone Piccardi
5 6 Chiara Barbucci
Per delle operazioni temporanee la capacità di _port forwarding_ di SSH è molto utile per creare un tunnel cifrato da una macchina ad un'altra, consentendo anche di condividere accessi locali (come ad esempio ad un MySQL che ascolta solo localmente) in maniera sicura. Il problema sorge quando si vuole fornire una connessione permanente. In tal caso lasciare attivo il programma può non bastare, perché la connessione SSH (ed il relativo tunnel) potrebbero cadere nel caso ci fossero problemi sulla rete. 
6 1 Simone Piccardi
7 6 Chiara Barbucci
Per ovviare a questa eventualità e creare tunnel permanenti ci viene in aiuto @autossh@, un semplice programma che consente di eseguire un'istanza di @ssh@ mantenendola sotto controllo e riavviando la stessa qualora la connessione dovesse cadere fino ad un numero massimo di volte, controllato dalla variabile di ambiente @AUTOSSH_MAXSTART@ , o indefinitamente se il valore di questa è negativo (che è il comportamento di default). 
8 1 Simone Piccardi
9 6 Chiara Barbucci
Il programma infatti rileva se l'istanza di @ssh@ che ha lanciato finisce con un segnale o un errore di connessione e nel caso la riesegue. Se invece si conclude @ssh@ con un segnale di SIGKILL @autossh@ interpreta la cosa come una terminazione esplicita e si ferma anche lui. Allo stesso modo viene interpretato un segnale di terminazione inviato ad @autossh@ stesso che nel caso esce chiudendo anche l'istanza di @ssh@.
10 1 Simone Piccardi
11 6 Chiara Barbucci
Il comando prende un'opzione principale, @-M@ , che consente di indicare una porta usata per il monitoraggio della connessione. Per verificare che l'istanza di @ssh@ sia attiva e funzionante utilizza la porta indicata e la successiva per mandare dei messaggi che gli devono tornare indietro. Con la versione 2 del protocollo @ssh@ supporta un controllo interno della connessione che è più affidabile. Si suggerisce pertanto di usare le opportune opzioni di controllo (che vedremo più avanti) ed indicare sempre un valore nullo (cioè @-M 0@) che disabiliti questo monitoraggio.
12 2 Simone Piccardi
13 7 Chiara Barbucci
L'altra opzione principale di @autossh@ è @-f@ che imposta l'esecuzione in background. Il resto del comportamento del programma è controllato da una serie di ulteriori variabili di ambiente. Per il significato di queste si rimanda alla lettura della pagina di manuale (i valori di default sono adatti all'uso ordinario, possono essere modificati in caso di problemi o per attivare diagnostiche).
14 4 Simone Piccardi
15 8 Chiara Barbucci
L'uso di @autossh@ consente di creare un numero arbitrario di tunnel in maniera molto sicura. Se infatti non è necessario mettersi in ascolto su porte riservate, si può far eseguire il programma per conto di un utente non privilegiato, che nel nostro caso sarà appunto @autossh@. Si provvederà allora a creare detto utente su entrambi i capi del tunnel con:
16 2 Simone Piccardi
17 2 Simone Piccardi
<pre>
18 2 Simone Piccardi
useradd -m -s /bin/false autossh
19 2 Simone Piccardi
</pre>
20 2 Simone Piccardi
21 8 Chiara Barbucci
da notare come per l'utente si sia disabilitata la shell e non si sia impostata la password, cosa che renderà impossibile usare l'utente per un accesso al sistema (che non ci serve essendo esso utilizzato solo allo scopo di creare il tunnel).
22 2 Simone Piccardi
23 8 Chiara Barbucci
La scelta di non impostare la password richiede l'uso della autenticazione a chiavi, cosa che è comunque il caso di usare sempre e se possibile in maniera esclusiva. Per questo sul capo della connessione che deve creare il tunnel si dovrà creare una chiave per l'utente che, se si vuole che il tunnel possa partire automaticamente all'avvio, dovrà essere senza password. Si dovranno pertanto eseguire i seguenti comandi:
24 2 Simone Piccardi
25 2 Simone Piccardi
<pre>
26 5 Simone Piccardi
# su -s /bin/bash autossh
27 5 Simone Piccardi
$ ssh-keygen
28 2 Simone Piccardi
Generating public/private rsa key pair.
29 2 Simone Piccardi
Enter file in which to save the key (/home/autossh/.ssh/id_rsa): 
30 2 Simone Piccardi
Enter passphrase (empty for no passphrase): 
31 2 Simone Piccardi
Enter same passphrase again: 
32 2 Simone Piccardi
Your identification has been saved in /home/autossh/.ssh/id_rsa.
33 2 Simone Piccardi
Your public key has been saved in /home/autossh/.ssh/id_rsa.pub.
34 2 Simone Piccardi
The key fingerprint is:
35 2 Simone Piccardi
b6:b7:d5:1e:fd:b0:62:57:b5:77:4c:33:82:78:f7:06 autossh@dodds
36 2 Simone Piccardi
The key's randomart image is:
37 2 Simone Piccardi
+--[ RSA 2048]----+
38 2 Simone Piccardi
|                 |
39 2 Simone Piccardi
|                 |
40 2 Simone Piccardi
|          . .    |
41 2 Simone Piccardi
|         . o E oo|
42 2 Simone Piccardi
|        S . . +o=|
43 2 Simone Piccardi
|       . .   . ==|
44 2 Simone Piccardi
|        . . . =.+|
45 2 Simone Piccardi
|         . oo..+.|
46 2 Simone Piccardi
|          .. oo .|
47 2 Simone Piccardi
+-----------------+
48 2 Simone Piccardi
</pre>
49 3 Simone Piccardi
50 3 Simone Piccardi
(è necessario usare @su@ con il primo comando per impersonare l'utente @autossh@ dato che questo non ha una shell né una password valida).
51 3 Simone Piccardi
52 8 Chiara Barbucci
Una volta fatto questo si dovrà aver cura di copiare la chiave pubblica sulla/e macchina/e di destinazione ed installarla nelle home degli utenti @autossh@ ivi creati sotto @.ssh/authorized_keys@. Si verifichi che detto file appartenga ad @autossh@.
53 3 Simone Piccardi
54 8 Chiara Barbucci
A questo punto si potrà creare un tunnel semplicemente lanciando @ssh@ con le opzioni necessarie tramite @autossh@. Dato che si vuole solo creare un tunnel occorrerà usare l'opzione @-N@ per dire a @ssh@ di non lanciare nessun comando (non sarebbe comunque possibile, avendo impostato @/bin/false@ come shell). Sono importanti, inoltre, le opzioni:
55 3 Simone Piccardi
56 3 Simone Piccardi
<pre>
57 3 Simone Piccardi
-o "ServerAliveInterval 60" 
58 3 Simone Piccardi
-o "ServerAliveCountMax 3"
59 1 Simone Piccardi
</pre>
60 1 Simone Piccardi
61 8 Chiara Barbucci
che consentono di attivare il controllo interno della sussistenza della connessione di @ssh@. Il tunnel potrà poi essere attivato con le solite opzioni @-L@ o @-R@ a seconda della direzione.
62 1 Simone Piccardi
63 8 Chiara Barbucci
Se allora ad esempio si vuole creare un tunnel per la connessione ad un database MySQL remoto di una macchina che è raggiungibile in SSH, una volta creati gli utenti come descritto, sarà sufficiente eseguire il comando:
64 1 Simone Piccardi
65 1 Simone Piccardi
<pre>
66 1 Simone Piccardi
su -s /bin/sh autossh -c 'autossh -M 0 -q -f -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -L 3306:localhost:3306 autossh@macchinaremota'
67 1 Simone Piccardi
</pre>
68 1 Simone Piccardi
69 5 Simone Piccardi
ed almeno la prima volta occorrerà confermare la validità della fingerprint della chiave dell'altro capo della connessione.
70 1 Simone Piccardi
71 8 Chiara Barbucci
Allo stesso modo se si vuole creare un tunnel per consentire un accesso di amministrazione remota ad una macchina posta dietro un firewall per la quale non è possibile un accesso diretto si potrà usare un comando del tipo:
72 5 Simone Piccardi
73 5 Simone Piccardi
<pre>
74 5 Simone Piccardi
su -s /bin/sh autossh -c 'autossh -M 0 -q -f -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 20001:localhost:22 autossh@macchinaremota'
75 5 Simone Piccardi
</pre>
76 5 Simone Piccardi
77 8 Chiara Barbucci
e in questo modo lanciando sull'altro capo del tunnel il comando @ssh -p 20001 root@localhost@ ci si potrà ricollegare all'indietro. 
78 5 Simone Piccardi
79 5 Simone Piccardi
Con i comandi indicati, che portano @autossh@ in background il tunnel resta attivo fintanto che non lo si interrompe esplicitamente o si riavvia la macchina. Per abilitare il tunnel in maniera permanente all'avvio la cosa più semplice è inserire il comando in @/etc/rc.local@ o file analogo per il proprio sistema di avvio. 
80 5 Simone Piccardi
81 5 Simone Piccardi
Qualora si utilizzi @systemd@ si può utilizzare la _unit file_ illustrata di seguito (ma ci si ricordi che si deve comunque aver cura di eseguire almeno una volta il comando manualmente, per accettare la fingerprint del server a cui ci si connette):
82 5 Simone Piccardi
83 5 Simone Piccardi
<pre>
84 5 Simone Piccardi
[Unit]
85 5 Simone Piccardi
Description=AutoSSH tunnel service for SSH remote access
86 5 Simone Piccardi
After=network.target
87 5 Simone Piccardi
88 5 Simone Piccardi
[Service]
89 5 Simone Piccardi
Environment="AUTOSSH_GATETIME=0"
90 5 Simone Piccardi
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NR 20001:localhost:22 autossh@macchinaremota
91 5 Simone Piccardi
User=autossh
92 5 Simone Piccardi
93 5 Simone Piccardi
[Install]
94 5 Simone Piccardi
WantedBy=multi-user.target
95 5 Simone Piccardi
</pre>
96 5 Simone Piccardi
97 8 Chiara Barbucci
Si noti come in questo caso non è possibile lanciare @autossh@ con l'opzione @-f@ perché l'avvio in background non è supportato da @systemd@ (è cura di @systemd@ eseguire il tutto in background). Occorre inoltre indicare ad @autossh@ di ripetere la connessione anche se questa fallisce inizialmente, impostando la variabile di ambiente @AUTOSSH_GATETIME@ ad un valore nullo (questo è il default se si usa @-f@ ma non nell'uso normale).
98 5 Simone Piccardi
99 5 Simone Piccardi
Installando la _unit file_ precedente sotto @/etc/systemd/system@ (ad esempio come @autossh-tunnel.service@) sarà possibile attivare il tunnel con:
100 5 Simone Piccardi
101 5 Simone Piccardi
<pre>
102 5 Simone Piccardi
systemctl start autossh-tunnel
103 5 Simone Piccardi
</pre>
104 5 Simone Piccardi
105 5 Simone Piccardi
verificarne lo stato con:
106 5 Simone Piccardi
107 5 Simone Piccardi
<pre>
108 5 Simone Piccardi
systemctl status autossh-tunnel
109 5 Simone Piccardi
</pre>
110 5 Simone Piccardi
111 5 Simone Piccardi
e predisporne l'attivazione all'avvio con: 
112 5 Simone Piccardi
113 5 Simone Piccardi
<pre>
114 5 Simone Piccardi
systemctl enable autossh-tunnel
115 5 Simone Piccardi
</pre>