OpenSSH: X11 forwarding: differenze tra le versioni
m (→Lato server) |
(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. | ||
=== 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 | 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 | 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 | 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 ==== | ||
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 | 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 ==== |
Versione delle 17:36, 28 nov 2015
Attenzione: questo articolo è ancora incompleto e in fase di scrittura da parte del suo autore.
Sentitevi liberi di contribuire, proponendo modifiche alla guida tramite l'apposita pagina di discussione, in modo da non interferire con il lavoro portato avanti sulla voce. Per altre informazioni si rimanda al template. |
Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.
Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione. |
Versioni Compatibili Debian 7 "wheezy" Debian 8 "jessie" |
OpenSSH |
Sommario |
Introduzione
L'uso del comando ssh
, 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.
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 ssh
.
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.
Lato server
Requisiti:
- installato e in esecuzione il server SSH;
- autorizzati gli accessi (con chiave per utente/host o password) come per la connessione normale (senza X11 forwarding);
- abilitato
X11Forwarding
(vedere la sezione successiva), di default disabilitato.
Abilitare X11Forwarding
È necessario che sia presente (e non commentata) in /etc/ssh/sshd_config
la direttiva:
X11Forwarding yes
Con privilegi di amministrazione è sufficiente aprire il file con il proprio editor di testo preferito (per esempio nano):
# nano /etc/ssh/sshd_config
aggiungere la riga su X11Forwarding yes o decommentarla (rimuovendo il carattere #
iniziale) e salvare (con nano
premere Ctrl-o
e poi Ctrl-x
per uscire).
Infine ricaricare la configurazione del server:
# service ssh reload
È 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.
Per altre possibili configurazioni si rimanda a questa parte della guida.
Lato client
Requisiti:
- 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
startx
da un terminale virtuale/dev/tty1
,/dev/tty2
, ecc...); - installato il client ssh.
In particolare si controlli che siano definite le variabili d'ambiente $DISPLAY
e $XAUTHORITY
:
$ echo "$DISPLAY" :0
$ echo "$XAUTHORITY" /la-propria-home/.Xauthority
Access control
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à 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
Dalla macchina client è sufficiente lanciare ssh
con l'opzione -X
:
$ ssh -X utente_remoto@host_remoto utente_remoto@host_remoto:~$ (<-- sessione SSH)
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 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:
utente_remoto@host_remoto:~$ evince
lancia il programma evince
sulla macchina remota (dove deve essere installato), visualizzandolo sul server X locale in esecuzione (dove può anche non essere installato). Se si apre un documento, si noterà che si sta esplorando il file system dell'utente remoto sulla macchina remota.
Quando si ha terminato è sufficiente chiudere la sessione, scrivendo il comando exit
oppure premendo Ctrl-d
:
utente_remoto@host_remoto:~$ exit (<-- sessione SSH) $ (<-- shell locale)
In alternativa è possibile specificare direttamente il comando da eseguire. Per esempio con evince
:
$ ssh -X utente_remoto@host_remoto -- evince
In tal caso la sessione SSH sarà terminata quando si chiuderà l'applicazione.
Compressione
Un'opzione utile è -C
, che permette la compressione del traffico di rete, in particolare quello reindirizzato al server X locale, il che può velocizzare i tempi di risposta delle applicazioni remote:
$ ssh -X -C utente_remoto@host_remoto
Avvio di un'intera sessione grafica
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:
# apt-get install blackbox menu
Sulla macchina locale, deve essere invece installato un server grafico annidato che faccia da proxy per l'X11 forwarding, come per esempio Xephyr
, che è un'evoluzione più veloce e raccomandata del precedente Xnest
:
# apt-get install xserver-xephyr
Sulla macchina locale, preparo quindi il server grafico proxy, lanciandolo in background (come utente normale, senza privilegi):
$ Xephyr :1 -ac -nolisten tcp -screen 1024x768 &
dove:
- :1 è un display libero (per esempio se
$DISPLAY
è :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 quando interrogata con
xauth generate ...
); - -nolisten tcp disabilita il protocollo TCP, permettendo soltanto connessioni locali (o redirette, come quelle via SSH);
- -screen XRESxYRES 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 shell, non di
Xephyr
).
Poi lancio blackbox
sul display (:1 o comunque quello usato con Xephyr
) del server proxy. Sempre dalla macchina locale:
$ DISPLAY=:1 ssh utente_remoto@host_remoto -X -C -- blackbox
Nella finestra aperta da Xephyr
si vedrà l'ambiente grafico di blackbox
, 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 blackbox-ssh.sh
contenente:
#! /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
E dargli i permessi di esecuzione:
$ chmod a+x ./blackbox-ssh.sh
Senza access control
Per disattivare il controllo di accesso, effettuando una connessione fidata (trusted X11 forwarding), si deve utilizzare l'opzione -Y
:
$ ssh -Y utente_remoto@host_remoto utente_remoto@host_remoto:~$ (<-- sessione SSH)
Configurazione
Per rendere automatiche tali configurazioni, si rimanda a questa parte della guida.
Guida scritta da: HAL 9000 17:55, 28 nov 2015 (CET) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |