OpenSSH: X11 forwarding: differenze tra le versioni

m
→‎Utilizzo: dimenticata l'opzione ForwardX11Trusted da un esempio
(aggiunto Xephyr)
m (→‎Utilizzo: dimenticata l'opzione ForwardX11Trusted da un esempio)
 
(11 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
{{Stub}}{{Versioni compatibili|Wheezy|Jessie}}{{OpenSSH}}
{{Versioni compatibili|Jessie|Stretch|Buster}}{{OpenSSH}}


== Introduzione ==
== Introduzione ==
L'uso del comando <code>ssh</code>, una volta configurato il server e aggiunte le credenziali di autenticazione dell'utente del client, permette l'esecuzione di comandi su una macchina remota, ma soltanto tramite una [[shell]] testuale. Perciò un'applicazione può essere lanciata con interfaccia grafica soltanto se fa uso delle librerie ''ncurses'' o comunque che non richiedono la presenza di un server grafico X attivo.
L'uso del comando <code>ssh</code>, una volta configurato il server e aggiunte le credenziali di autenticazione dell'utente del client, permette l'esecuzione di comandi su una macchina remota, ma soltanto tramite una [[shell]] testuale. Perciò un'applicazione può essere lanciata con interfaccia grafica soltanto se fa uso delle librerie ''ncurses'' o comunque che non richiedono la presenza di un server grafico Xorg attivo.


Per poter lanciare un'applicazione grafica che richiede l'esecuzione di un server grafico X (per esempio perché sviluppata con uso delle librerie ''GTK'', ''Qt'', ecc...) e interagirvi come si farebbe con una qualsiasi applicazione, è necessario reindirizzare (''forwarding'') tutte le chiamate dirette al server X della macchina remota sul server X locale, ossia la stessa del client <code>ssh</code>.
Per poter lanciare un'applicazione grafica che richiede l'esecuzione di un server grafico X (per esempio perché sviluppata con uso delle librerie ''GTK'', ''Qt'', ecc...) e interagirvi come si farebbe con una qualsiasi applicazione, è necessario reindirizzare (''forwarding'') tutte le chiamate dirette al server X della macchina remota sul server X locale, ossia la stessa del client <code>ssh</code>.
Riga 8: Riga 8:
Si noti quindi che '''non''' è necessario né che sia in esecuzione né che sia installato un server grafico X sulla macchina remota. Per poter avviare un'applicazione grafica è invece necessario che sia installato e in esecuzione un server X sulla macchina client.
Si noti quindi che '''non''' è necessario né che sia in esecuzione né che sia installato un server grafico X sulla macchina remota. Per poter avviare un'applicazione grafica è invece necessario che sia installato e in esecuzione un server X sulla macchina client.


{{Warningbox | Si presume che la macchina di destinazione sia fidata, perché anche se i comandi sono eseguiti soltanto su quella macchina, tutte le chiamate alle librerie che fanno uso del server grafico sono eseguite sulla macchina locale. Di conseguenza c'è la possibilità di subire un attacco sulla macchina client da quella remota: in particolare rivolto a tutte le altre applicazioni (di qualunque utente) eseguite sullo stesso server X, che potrebbero essere monitorate e/o manipolate, anche riguardo all'input immesso dall'utente attraverso mouse e tastiera.}}
{{Cautionbox | Si presume che la macchina di destinazione sia fidata, perché anche se i comandi sono eseguiti soltanto su quella macchina, tutte le chiamate alle librerie che fanno uso del server grafico sono eseguite sulla macchina locale. Di conseguenza c'è la possibilità di subire un attacco sulla macchina client da quella remota: in particolare rivolto a tutte le altre applicazioni (di qualunque utente) eseguite sullo stesso server X, che potrebbero essere monitorate e/o manipolate, anche riguardo all'input immesso dall'utente attraverso mouse e tastiera.}}
 
== Lato server ==
== Lato server ==
Requisiti:
Requisiti:
* installare e in esecuzione il server [[SSH]];
* installato e in esecuzione il server [[SSH]];
* autorizzare gli accessi (con chiave per utente/host o password) come per la connessione normale (senza ''X11 forwarding'');
* autorizzati gli accessi (con chiave per utente/host o password) come per la connessione normale (senza ''X11 forwarding'');
* abilitare <code>X11Forwarding</code> (vedere la sezione successiva), di default disabilitato.
* abilitato <code>X11Forwarding</code> (vedere la sezione successiva), di default disabilitato.
 
Si ricorda che non è necessario che sia in esecuzione o anche solo installato un server grafico X sul server.


=== Abilitare X11Forwarding ===
=== Abilitare X11Forwarding ===
Riga 35: Riga 32:
</pre>
</pre>


È da notare che disabilitare ''X11Forwarding'' non incrementa la sicurezza della macchina remota che esegue il server ''ssh'', tuttavia potrebbe comunque essere nell'interesse di chi amministra ridurre i rischi per gli utenti autorizzati a collegarsi dalle loro postazioni, e per questo è stata pensata questa opzione.
È da notare che disabilitare ''X11Forwarding'' non incrementa la sicurezza della macchina remota che esegue il server ''ssh'', tuttavia potrebbe comunque essere nell'interesse di chi amministra ridurre i rischi per gli utenti autorizzati a collegarsi dalle loro postazioni.


Per altre possibili configurazioni si rimanda a [[OpenSSH: file di configurazione|questa parte della guida]].
Per altre possibili configurazioni si rimanda a [[OpenSSH: file di configurazione|questa parte della guida]].
Riga 43: Riga 40:
* installato e in esecuzione il server grafico [[Xorg]];
* installato e in esecuzione il server grafico [[Xorg]];
* aperta una sessione grafica per l'utente corrente (è sufficiente un login da un display manager come gdm3/kdm/lightdm/xdm/... oppure l'uso di <code>startx</code> da un terminale virtuale <code>/dev/tty1</code>, <code>/dev/tty2</code>, ecc...);
* aperta una sessione grafica per l'utente corrente (è sufficiente un login da un display manager come gdm3/kdm/lightdm/xdm/... oppure l'uso di <code>startx</code> da un terminale virtuale <code>/dev/tty1</code>, <code>/dev/tty2</code>, ecc...);
* installato il client ''ssh''.
* installato il client ''ssh'' (pacchetto <code>openssh-client</code>, installato di default).


In particolare si controlli che siano definite le variabili d'ambiente <code>$DISPLAY</code> e <code>$XAUTHORITY</code>:
In particolare si controlli che siano definite le variabili d'ambiente <code>$DISPLAY</code> e <code>$XAUTHORITY</code>:
Riga 52: Riga 49:
<pre>
<pre>
$ echo "$XAUTHORITY"
$ echo "$XAUTHORITY"
/la-propria-home/.Xauthority
/percorso-della-propria-home/.Xauthority
</pre>
</pre>


Riga 58: Riga 55:
Per limitare l'esposizione delle applicazioni eseguite sul server X locale, rispetto a possibili attacchi da parte dell'applicazione eseguita su macchina remota (ma a cui è dato accesso allo stesso server X locale per potervi interagire), [[Xorg]] dispone di un primitivo controllo di accesso (''access control''), che consente di marcare alcune applicazioni come non fidate (''untrusted''), in base alla sessione con cui si sono registrate presso il server X.
Per limitare l'esposizione delle applicazioni eseguite sul server X locale, rispetto a possibili attacchi da parte dell'applicazione eseguita su macchina remota (ma a cui è dato accesso allo stesso server X locale per potervi interagire), [[Xorg]] dispone di un primitivo controllo di accesso (''access control''), che consente di marcare alcune applicazioni come non fidate (''untrusted''), in base alla sessione con cui si sono registrate presso il server X.


Ciò non risolve completamente le problematiche di sicurezza, ma limita la possibilità di ascolto alle sole applicazioni ''untrusted''. Come risultato di questa impostazione, un'applicazione remota non avrà gli stessi permessi di una eseguita localmente, per cui alcune operazioni potrebbero essergli precluse: in caso questo interferisca con il suo normale funzionamento, sarà però necessario dargli totale accesso, ossia considerarla fidata (''trusted''), consci però dei possibili rischi di sicurezza per tutte le applicazioni (anche di altri utenti) eseguite sullo stesso server X e per gli input immessi dall'utente.
Ciò non risolve completamente le problematiche di sicurezza, ma limita la possibilità di ascolto alle sole applicazioni ''untrusted''. Come risultato di questa impostazione, un'applicazione remota non avrà gli stessi permessi di una eseguita localmente, per cui alcune operazioni potrebbero essergli precluse: in caso questo interferisca con il suo normale funzionamento sarà perciò necessario dargli totale accesso, ossia considerarla fidata (''trusted''), consci dei possibili rischi di sicurezza per tutte le applicazioni (anche di altri utenti) eseguite sullo stesso server X e per gli input immessi dall'utente.
 
In Debian e derivate, questa modalità presenta un'ulteriore difficoltà, perché l'opzione è ignorata di default, a meno che l'opzione '''ForwardX11Trusted''' sia anche impostata a no, via linea di comando (opzione <code>-o</code>) oppure in un file di configurazione (quello di sistema <code>/etc/ssh/ssh_config</code>, valido per tutti gli utenti; oppure quello specifico per ogni utente in <code>~/.ssh/config</code>; si noti che il nome del primo è ''ssh_config'', mentre il secondo solo ''config'').


=== Utilizzo ===
=== Utilizzo ===
Dalla macchina client, è sufficiente lanciare <code>ssh</code> con l'opzione <code>-X</code>:
Dalla macchina client è sufficiente lanciare <code>ssh</code> con l'opzione <code>-X</code>:
<pre>
<pre>
$ ssh -X utente_remoto@host_remoto
$ ssh -o "ForwardX11Trusted=no" -X utente_remoto@host_remoto
utente_remoto@host_remoto:~$      (<-- sessione SSH)
utente_remoto@host_remoto:~$      (<-- sessione SSH)
</pre>
</pre>
per avviare una nuova sessione della [[shell]] testuale predefinita.
per avviare una nuova sessione della [[shell]] testuale predefinita.


All'interno di questa sessione sarà possibile avviare applicazioni grafiche sulla macchina remota, che saranno visualizzate e si potrà interagirvi sul server X locale, come se si trattasse di una qualsiasi altra applicazione, ma con ''access control'' attivo per isolare parzialmente questa applicazione (''untrusted'') da quelle locali.
All'interno di questa sessione sarà possibile avviare applicazioni grafiche sulla macchina remota, che saranno visualizzate e si potrà interagirvi tramite il server X locale, come se si trattasse di una qualsiasi altra applicazione, ma con ''access control'' attivo per isolare parzialmente questa applicazione (''untrusted'') da quelle locali.


Per esempio:
Per esempio:
Riga 82: Riga 81:
</pre>
</pre>


In alternativa è possibile specificare direttamente il comando da eseguire. Per esempio per <code>evince</code>:
In alternativa è possibile specificare direttamente il comando da eseguire. Per esempio con <code>evince</code>:
<pre>
<pre>
$ ssh -X utente_remoto@host_remoto -- evince
$ ssh -o "ForwardX11Trusted=no" -X utente_remoto@host_remoto -- evince
</pre>
</pre>
In tal caso la sessione SSH sarà terminata quando si chiuderà l'applicazione.
In tal caso la sessione SSH sarà terminata quando si chiuderà l'applicazione.
Per non scrivere '''ForwardX11Trusted''' ogni volta, basta scriverlo nella propria <code>~/.ssh/config</code> oppure in <code>/etc/ssh/ssh_config</code>, lato client:
<pre>
ForwardX11Trusted="no"
</pre>
Le modifiche hanno effetto immediatamente, fin dalla successiva esecuzione di <code>ssh -X ...</code> .


==== Compressione ====
==== Compressione ====
Riga 93: Riga 98:
$ ssh -X -C utente_remoto@host_remoto
$ ssh -X -C utente_remoto@host_remoto
</pre>
</pre>
In questo esempio si dà per scontato che '''ForwardX11Trusted''' sia già impostato in un file di configurazione. E si noti che la compressione può essere abilitata di default in maniera analoga con l'opzione '''Compression''', ma in genere è preferibile abilitare la compressione soltanto quando si avvia un'applicazione grafica con X11 forwarding, a meno che non si abbia una connessione molto lenta.


==== Avvio di un'intera sessione grafica ====
==== Avvio di un'intera sessione grafica ====
In questo esempio si considera ''blackbox'', che è un ambiente grafico minimale e quindi molto veloce, che si occupa soltanto della gestione delle finestre, dei menù accessibili con il mouse e di un pannello con gli spazi di lavoro. Dev'essere installato sulla macchina remota:
Se si vuole gestire tutte le applicazioni senza lanciarle da terminale, è possibile avviare un'intera sessione, sfruttando un server X annidato che agisce come proxy.
 
A titolo di esempio come sessione grafica si considera ''blackbox'', che rende disponibile un ambiente grafico minimale e quindi molto veloce, che si occupa soltanto della gestione delle finestre, dei menù accessibili con il mouse e di un pannello con gli spazi di lavoro. Dev'essere installato sulla macchina remota, si consiglia in combinazione a ''menu'':
<pre>
<pre>
# apt-get install blackbox menu
# apt install blackbox menu
</pre>
</pre>


Sulla macchina locale, deve essere invece installato un server grafico annidato che faccia da proxy per l'''X11 forwarding'', come per esempio <code>Xephyr</code>, che è un'evoluzione più veloce e raccomandata di <code>Xnest</code>:
Sulla macchina locale, deve essere invece installato un server grafico annidato che faccia da proxy per l'''X11 forwarding'', come per esempio <code>Xephyr</code>, che è un'evoluzione più veloce e raccomandata del precedente <code>Xnest</code>:
<pre>
<pre>
# apt-get install xserver-xephyr
# apt install xserver-xephyr
</pre>
</pre>


Sulla macchina locale, preparo quindi il server grafico proxy, lanciandolo in background:
Sulla macchina locale, preparo quindi il server grafico proxy, lanciandolo in background (come utente normale, senza privilegi):
<pre>
<pre>
$ Xephyr :1 -ac -nolisten tcp -screen 1024x768 &
$ Xephyr :1 -ac -nolisten tcp -screen 1024x768 &
</pre>
</pre>
dove:
dove:
* ''':1''' è un display libero (per esempio se <code>$DISPLAY</code> è ''':0''' e non ci sono altri server X in esecuzione; altrimenti usarne un altro);
* ''':1''' è un display libero (per esempio se <code>$DISPLAY</code> è ''':0''' e non ci sono altri server X in esecuzione; altrimenti bisogna usarne un altro);
* '''-ac''' significa di disabilitare l'access control (per le sole applicazioni all'interno di Xephyr; purtroppo non è possibile utilizzare entrambi gli ''access control'', non disponendo la versione compilata di Xephyr di un metodo per generare un cookie sicuro con <code>xauth generate</code>);
* '''-ac''' significa di disabilitare l'access control (per le sole applicazioni all'interno di Xephyr; purtroppo non è possibile utilizzare entrambi gli ''access control'', non disponendo la versione compilata di Xephyr di un metodo per generare un cookie sicuro quando interrogata con <code>xauth generate ...</code>);
* '''-nolisten tcp''' disabilita il protocollo TCP, permettendo soltanto connessioni locali (o redirette, come quelle via [[SSH]]);
* '''-nolisten tcp''' disabilita il protocollo TCP, permettendo soltanto connessioni locali (o redirette, come quelle via [[SSH]]);
* '''-screen''' ''XRES'''''x'''''YRES'' determina la risoluzione della finestra, che di default (e per ragioni di sicurezza) non potrà essere ridimensionata;
* '''-screen''' ''XRES'''''x'''''YRES'' determina la risoluzione della finestra, che di default (e per ragioni di sicurezza) non potrà essere ridimensionata;
* '''&''' al termine del comando, serve per lanciarlo in backgorund (è un'istruzione della [[bash|shell]], non di <code>Xephyr</code>).
* '''&''' al termine del comando, serve per lanciarlo in background (è un'istruzione della [[bash|shell]], non di <code>Xephyr</code>).


Poi lancio <code>blackbox</code> sul display (''':1''' o comunque quello usato con <code>Xephyr</code>) del server proxy. Sempre dalla macchina locale:
Poi lancio <code>blackbox</code> sul display (''':1''' o comunque quello usato con <code>Xephyr</code>) del server proxy. Sempre dalla macchina locale:
<pre>
<pre>
$ DISPLAY=:1 ssh utente_remoto@host_remoto -X -C -- blackbox
$ DISPLAY=:1 ssh -o "ForwardX11Trusted=no" -X -C utente_remoto@host_remoto -- blackbox
</pre>
</pre>


Nella finestra aperta da <code>Xephyr</code> si vedrà l'ambiente grafico di <code>blackbox</code>, da cui sarà possibile aprire tutte le applicazioni installate sulla macchina remota, senza bisogno di lanciarle singolarmente da terminale.
Nella finestra aperta da <code>Xephyr</code> si vedrà l'ambiente grafico di <code>blackbox</code>, da cui sarà possibile aprire tutte le applicazioni installate sulla macchina remota, senza bisogno di lanciarle singolarmente da terminale.
===== Con script =====
Ovviamente si può automatizzare il tutto in uno [[script]], una volta installato l'occorrente. Basterà per esempio creare un file <code>blackbox-ssh.sh</code> contenente:
<pre>
#! /bin/sh
# lancia Xephyr su display :1
Xephyr :1 -ac -nolisten tcp -screen 1024x768 &
pid_xephyr=$!
# lancia blackbox via ssh su display :1
exit_status=0
DISPLAY=:1 ssh -o "ForwardX11Trusted=no" -X -C "utente_remoto@host_remoto" -- blackbox ||
  exit_status=$?
# termina Xephyr quando blackbox termina
kill $pid_xephyr 2> /dev/null
{ sleep 5; kill -9 $pid_xephyr 2> /dev/null ; }&
wait $pid_xephyr 2> /dev/null
# esce con l'exit status di blackbox
exit $exit_status
</pre>
E dargli i permessi di esecuzione:
<pre>
$ chmod a+x ./blackbox-ssh.sh
</pre>
Per lanciarlo con un click (se l'autenticazione avviene solo via chiavi e senza richiesta di passphrase) oppure con:
<pre>
./blackbox-ssh.sh
</pre>


==== Senza access control ====
==== Senza access control ====
Riga 133: Riga 173:
utente_remoto@host_remoto:~$        (<-- sessione SSH)
utente_remoto@host_remoto:~$        (<-- sessione SSH)
</pre>
</pre>
Questa opzione permette anche di ignorare un'eventuale opzione '''ForwardX11Trusted''' impostata in <code>/etc/ssh/ssh_config</code> e/o quella nella propria home in <code>~/.ssh/config</code>.
Si ricorda nuovamente che in Debian e derivate, se l'opzione '''ForwardX11Trusted''' non è specificata, con l'opzione <code>-o</code> da linea di comando oppure in un file di configurazione, non c'è differenza tra <code>ssh -X</code> e <code>ssh -Y</code>, poiché è ignorata di default.


=== Configurazione ===
=== Configurazione ===
Per rendere automatiche tali configurazioni, si rimanda a [[OpenSSH: file di configurazione|questa parte della guida]].
Per maggiori dettagli sui file di configurazione, si rimanda a [[OpenSSH: file di configurazione|questa parte della guida]].


{{Autori
{{Autori
|Autore = [[Utente:HAL 9000|HAL 9000]] 17:55, 28 nov 2015 (CET)
|Autore = [[Utente:HAL 9000|HAL 9000]] 21:01, 21 lug 2019 (CEST)
|Estesa_da =
|Estesa_da =
|Verificata_da =
|Verificata_da =
3 581

contributi