Progetto

Generale

Profilo

Accesso SSH a rete interna tramite bastion host » Cronologia » Versione 6

Simone Piccardi, 15-09-2021 13:26

1 2 Simone Piccardi
h1. Accesso SSH a reti interne tramite _bastion host_ (in maniera sicura)
2 1 Simone Piccardi
3 3 Simone Piccardi
Esistono diversi casi in cui può essere necessario fornire a singoli utenti esterni un accesso con SSH su specifiche macchine presenti nella propria rete interna, senza però dare un accesso generico alla stessa con una VPN.  In sostanza si vuole poter consentire ad un utente esterno +solo+ un collegamento SSH verso una specifica macchina interna. 
4 1 Simone Piccardi
5 3 Simone Piccardi
Per ottenere questo risultato si può sfruttare un firewall (o in generale un bastion host che si affacci su detta rete)  che sia raggiungibile con SSH, appoggiandosi ad una delle funzionalità avanzate di questo servizio, il cosiddetto "Proxy Jump", che è stato introdotto con OpenSSH 7.3 (rilasciata nell'agosto 2016) e è ormai disponibile su tutte le versioni presenti in una qualunque distribuzione recente.
6 1 Simone Piccardi
7 3 Simone Piccardi
Questa funzionalità prevede che si possa, passando attraverso una macchina a cui si ha accesso SSH, avere un reinoltro in maniera trasparente della connessione SSH verso un'altra macchina da questa raggiungibile. Si tratta in sostanza di usare l'SSH presente sul _bastion host_ come proxy del protocollo.
8 1 Simone Piccardi
9 3 Simone Piccardi
La funzionalità di proxy deve essere richiesta dal client che esegue la connessione, usando l'opzione l'opzione @-J@ del comando per indicare la macchina da usare come proxy. Può essere inoltre essere indicata nella propria configurazione client (quella mantenuta nel file @.ssh/config@ nella propria home directory) con la direttiva @ProxyJump@. 
10
11 1 Simone Piccardi
!bastion.png!
12
13 3 Simone Piccardi
Nel prosieguo faremo riferimento allo schema di rete illustrato nella figura precedente;  per collegarsi alla macchina server sull'indirizzo interno @192.168.42.105, si dovrà utilizzare un comando simile:
14 1 Simone Piccardi
15
<pre>
16 3 Simone Piccardi
ssh -J utente_a@bastion.truelite.it utente_b@192.168.42.105
17 1 Simone Piccardi
</pre>
18
19 3 Simone Piccardi
e una volta autenticatisi prima sul bastion host che fa da proxy con @utente_a@  e poi sul server finale @con utente_b@, si otterrà l'accesso al server interno.
20 2 Simone Piccardi
21 5 Simone Piccardi
Ovviamente se lo scopo è quello di fornire accesso ad una macchina interna ad un utente esterno, fornire un accesso utente ordinario sul _bastion host_ è una scelta abbastanza indesiderata sul piano della sicurezza. 
22 1 Simone Piccardi
23 3 Simone Piccardi
Inoltre chi si collega in questo modo deve anche autenticarsi due volte, e dare due volte una password, possibilmente anche diversa, cosa che non è particolarmente comoda. Fortunatamente l'autenticazione a chiavi di SSH ci viene incontro, e permette di semplificare notevolmente le operazioni lato client, rendendo al contempo l'accesso molto più sicuro. 
24 2 Simone Piccardi
25 3 Simone Piccardi
Il primo passo è quello di creare sul _bastion host_ un utente dedicato al servizio di proxy, privandolo di qualunque altra capacità. Nel nostro caso sceglieremo di usare un utente @sshproxy@, che creeremo come utente di sistema, senza password e senza possibilità di accesso, con qualcosa del tipo:
26
27 2 Simone Piccardi
<pre>
28
useradd -r sshproxy -s /sbin/false
29
</pre>
30
31 3 Simone Piccardi
Per fornire ad un esterno l'accesso questo utente creeremo una coppia di chiavi senza passphrase. Questo può essere fatto su qualunque macchina, basterà poi inserire la chiave pubblica nel file @.ssh/authorized_keys@ dell'utente @sshproxy@ sul bastion host e distribuire la coppia di chiavi a tutte le persone a cui si vuole fare usare il servizio. Per semplicità creeremo la coppia di chiavi direttamente nella home dell'utente @sshproxy@,  predisponendo l'accesso, con i seguenti comandi:
32 2 Simone Piccardi
33
<pre>
34
root@bastion:~# su - sshproxy -s /bin/bash
35
sshproxy@bastion:~$ ssh-keygen 
36
Generating public/private rsa key pair.
37
Enter file in which to save the key (/home/sshproxy/.ssh/id_rsa): 
38
Created directory '/home/sshproxy/.ssh'.
39
Enter passphrase (empty for no passphrase): 
40
Enter same passphrase again: 
41
Your identification has been saved in /home/sshproxy/.ssh/id_rsa.
42
Your public key has been saved in /home/sshproxy/.ssh/id_rsa.pub.
43
The key fingerprint is:
44
SHA256:6kwKCutHHWIP6R/TVaQgHN+uL7PuOhYdTQTvs7jCjEY sshproxy@bastion
45
The key's randomart image is:
46
+---[RSA 2048]----+
47
|    .o.oo...     |
48
|     .o +...     |
49
|    .  .o+.      |
50
|   = . .oo       |
51 1 Simone Piccardi
|  o = + S+       |
52
|   E * +o o      |
53 2 Simone Piccardi
|. + = *o .       |
54
|.o = % oo        |
55
|+.o o.O=+.       |
56
+----[SHA256]-----+
57
sshproxy@bastion:~$ cp  .ssh/id_rsa.pub .ssh/authorized_keys
58
sshproxy@bastion:~$ chmod 600 .ssh/authorized_keys
59
</pre>
60
61 3 Simone Piccardi
In questo modo chiunque abbia a disposizione la coppia di chiavi potrà usarla per autenticarsi sul bastion host, pur non potendosi collegare allo stesso. Per migliorare la sicurezza sarà comunque opportuno bloccare anche tutte le funzionalità di SSH non necessarie all'utilizzo della connessione ad uso di proxy, cosa che si può fare in due modi diversi. 
62 2 Simone Piccardi
63 3 Simone Piccardi
Il primo metodo è più radicale, e rimuove le capacità aggiuntive in maniera completa per l'utente ricorrendo all'uso della direttiva @Match@ in @/etc/ssh/sshd_config@ per bloccare le stesse. La direttiva consente di applicare configurazioni specifiche a tutte le connessioni che corrispondono al criterio indicato come parametro, questo prevede che si utilizzi una prima  parola chiave per specificare cosa filtrare, come @User@, @Group@, @Address@, ecc. Nel nostro caso filtreremo per utente, restringendo al massimo le capacità di @sshproxy@, pertanto occorrerà aggiungere _in coda_ a @/etc/ssh/sshd_config@ le seguenti direttive:
64 1 Simone Piccardi
65 2 Simone Piccardi
<pre>
66
Match User sshproxy
67
     AllowAgentForwarding no
68 1 Simone Piccardi
     AllowTcpForwarding yes
69
     X11Forwarding no
70
     PermitTunnel no
71
     GatewayPorts no
72 3 Simone Piccardi
     PasswordAuthentication no
73 1 Simone Piccardi
</pre>
74
75 3 Simone Piccardi
si noti che si è detto _in coda_: la direttiva @Match@ infatti si applica a tutto quello che segue, e supporta l'indicazione di soltanto un sottoinsieme delle direttive di @sshd_config@, pertanto se la si inserisce in mezzo al file tutto quello che segue verrà applicato all'utente @sshproxy@, e se nel seguito si è usata una delle direttive non consentite da @Match@ si avrà una configurazione non valida ed il servizio non ripartirà. Si può chiudere la applicazione specifica facendo seguire il precedente estratto da una direttiva @Match all@ che però non risolve il problema dell'uso di direttive non consentite. Si verifichi sempre che la configurazione aggiuntiva è valida, usando @sshd -T@.
76 1 Simone Piccardi
77 3 Simone Piccardi
Il secondo metodo è più flessibile e consente almeno teoricamente di variare le restrizioni a secondo di chi si collega senza modificare la condfigurazione del server. Di nuovo si usa una delle funzionalità avanzate del servizio, che consente di restringe l'ambito di applicazione di una chiave, inserendo in testa alla riga in cui è elencata dentro @.ssh/authorized_keys@ le opportune restrizioni prima dell'indicazione del tipo di chiave. In sostanza nel caso precedente si tratterà si modificare @/home/sshproxy/.ssh/authorized_keys@ inserendo in testa alla chiave autorizzata qualcosa come:
78 1 Simone Piccardi
79
<pre>
80 4 Simone Piccardi
restrict,port-forwarding ssh-rsa AAAAB3NzaC ... 9bgOvM/DkF sshproxy@bastion
81 3 Simone Piccardi
</pre>
82
83
Una volta fatta questa configurazione sul bastion host ci si potrà collegare ad una macchina usandolo come proxy, ma  per farlo è necessario dire al client di usare la coppia di chiavi che abbiamo creato allo scopo, che assumeremo di aver copiato come @proxy_rsa_id@ e @proxy_rsa_id.pub@ nella directory @.ssh@ della propria home directory. Si potrebbe pensare di farlo con un comando come:
84
85
<pre>
86 6 Simone Piccardi
ssh -J sshproxy@bastion.truelite.it -i .ssh/proxy_rsa_id  utente@192.168.42.105
87 3 Simone Piccardi
</pre>
88
89
ma in questo caso l'opzione @-i@ si applica al collegamento verso @192.168.42.105@ e si otterrà una richiesta della password per @sshproxy@.
90
91
Dato che non esiste una opzione a riga di comando per indicare la chiave da usare per il proxy, e che comunque usare l'opzione @-J@ comporta comunque di scrivere di più, è opportuno inserire i parametri per la connessione dentro la propria configurazione client di SSH (così che sia valida non solo per ssh, ma anche per scp e tutti gli altri comandi che usano il servizio)  nel file @.ssh/config@ della propria home.
92
93
In questo file si potrà sia indicare come collegarsi alla macchina @bastion.truelite.it@ con le chiavi aggiuntive, sia l'uso della stessa come proxy per le connessioni verso la macchina @192.168.42.105@, aggiungendo le righe:
94
95
<pre>
96
Host bastion.truelite.it
97
    User sshproxy
98
    IdentityFile ~/.ssh/proxy_rsa_id 
99
100 1 Simone Piccardi
Host 192.168.42.105 testserver othername
101 4 Simone Piccardi
    Hostname 192.168.42.105
102 3 Simone Piccardi
    ProxyJump sshproxy@bastion.truelite.it
103 1 Simone Piccardi
</pre>
104 4 Simone Piccardi
105
ottenendo di potersi collegare semplicemente con:
106
107
<pre>
108
ssh utente@192.168.42.105
109
</pre>
110
111
o con uno qualunque dei nomi aggiuntivi inseriti nella configurazione, come:
112
113
<pre>
114
ssh utente@testserver
115
</pre>
116
117
La scelta di usare una coppia di chiavi dedicate come nell'esempio precedente ha il vantaggio che non serve fare nessuna modifica alla configurazione sul _bastion host_ e limitarsi a distribuire i file, ma non è possibile bloccare l'uso del proxy ad un utente cui si sia dato la coppia di chiavi a meno di non cambiarla per tutti. 
118
119
Per questo, pur comportando il tutti un maggior lavoro di configurazione, è più sicuro e flessibile farsi inviare dal singolo utente esterno la chiave pubblica con cui questo intenderà accedere, ed aggiungere questa a  @/home/sshproxy/.ssh/authorized_keys@ sempre con una configurazione analoga alla precedente:
120
121
<pre>
122
restrict,port-forwarding ssh-rsa AAAAB3NzaC ... eOze07VFk= esterno@altrove.it
123
</pre>
124
125
in questo caso, se la chiave corrisponde all'identità di default dell'utente che accede, si potrà anche ridurre la precedente configurazione del client a:
126
127
<pre>
128
Host 192.168.42.105 testserver othername
129
    Hostname 192.168.42.105
130
    ProxyJump sshproxy@bastion.truelite.it
131
</pre>
132
133
Ed inoltre si potrà usare la stessa chiave sulla macchina di destinazione (192.168.42.105 o qualunque altra) per fornire l'accesso, senza dover distribuire una password utente, cosa che è consigliabile comunque anche qualora si adotto la strategia precedente.