OpenSSH: X11 forwarding: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
(aggiunto script per ssh con Xephyr e blackbox)
Riga 15: Riga 15:
* autorizzati 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'');
* abilitato <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 58: Riga 56:
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.


=== 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 -X utente_remoto@host_remoto
Riga 68: Riga 66:
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 95: Riga 93:


==== 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, si consiglia in combinazione a ''menu'', per esempio con:
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-get 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-get install xserver-xephyr
Riga 110: Riga 110:
</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;
Riga 122: Riga 122:


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 "utente_remoto@host_remoto" -X -C -- 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 || true
# 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>


==== Senza access control ====
==== Senza access control ====