Petit guide d'ex�cution � distance des applications X

Version fran�aise du Remote X Apps mini-HOWTO

Vincent Zweije < zweije@xs4all.nl>

V 0.7.5, 8 d�cembre 2001
Ce petit guide d�crit comment ex�cuter des applications X � distance. C'est-�-dire, comment faire pour qu'un programme X s'affiche sur un �cran d'ordinateur diff�rent de celui sur lequel il s'ex�cute. Ou, autrement dit, comment faire tourner un programme X sur un ordinateur diff�rent de celui devant lequel vous �tes assis. L'accent de ce petit guide sera mis sur les questions de s�curit�. Ce petit guide contient �galement des informations sur la mani�re de faire tourner des applications X en local, mais avec un identificateur d'utilisateur (user-id) diff�rent ainsi que des informations sur la fa�on de mettre en place un ordinateur comme terminal X. Adaptation fran�aise : Albert-Paul Bouillot, Fr�d�ric Bothamy fbothamy@mail.dotcom.fr. Relecture de la version fran�aise : Olivier Kaloudoff kalou@kalou.net.

1. Introduction

Ce petit guide constitue un guide sur la mani�re de faire tourner des applications X � distance. J'ai r�dig� ce document pour plusieurs raisons :

  1. Il y a eu de nombreuses questions, sur Usenet, sur la mani�re de faire tourner des applications X � distance ;
  2. J'ai vu beaucoup, beaucoup de conseils d'utilisation de « xhost +hostname » ou m�me de « xhost + » pour r�aliser des connexions X. C'est d'une ins�curit� totale, et il existe de bien meilleures m�thodes ;
  3. Je n'ai pas connaissance d'un document simple d�crivant les options dont on peut disposer. Si vous avez des informations compl�mentaires, s'il vous pla�t, faites-le moi savoir (en anglais) : <zweije@xs4all.nl>.

Ce document a �t� �crit en pensant � des syst�mes de type Unix. Si le syst�me d'exploitation de votre ordinateur local ou de celui qui est � distance est de type diff�rent, vous devriez trouver ici des informations sur la mani�re dont les choses se passent. Cependant, il vous faudra modifier les exemples par vous-m�me pour les utiliser sur votre propre syst�me.

La version (anglaise) la plus r�cente de ce document est toujours disponible sur le WWW � http://www.xs4all.nl/~zweije/xauth.html. Il est �galement disponible en tant que mini-HOWTO Linux « Applications X � distance » (Remote X Apps) � : http://www.tldp.org/HOWTO/mini/Remote-X-Apps. Les (mini-)HOWTO du projet de documentation Linux (LDP) sont disponibles par http ou ftp sur www.tldp.org.

La version fran�aise la plus r�cente de ce document est toujours disponible sur le site du projet traduc.orghttp://www.traduc.org/docs/HOWTO/mini/lecture/Remote-X-Apps.html.

Ceci constitue la version 0.7.5. Aucune garantie, seulement de bonnes intentions. Je suis ouvert aux suggestions, id�es, ajouts, pointeurs utiles, corrections (typo), et c�tera. Je veux que cela reste un document simple et lisible, dans la bonne moyenne du style des guides pratiques du projet de documentation Linux. Les querelles seront redirig�es vers /dev/null. Ce document est diffus� sous la version 1.1 de la licence GNU Free Documentation Licence. This document is released under version 1.1 of the GNU Free Documentation Licence.

Le contenu de ce petit guide a �t� mis � jour le 8 d�cembre 2001 par Vincent Zweije. La version fran�aise de ce document a �t� mise � jour le 4 mars 2003 par Fr�d�ric Bothamy. La relecture de cette nouvelle version fran�aise a �t� r�alis�e par Olivier Kaloudoff.

2. Lectures compl�mentaires

Un document, en rapport avec cela, sur le WWW traite de « Que faire quand Tk dit que votre �cran n'est pas s�r », http://ce-toolkit.crd.ge.com/tkxauth/. Il a �t� �crit par Kevin Kenny. Il sugg�re une solution similaire � celle de ce document pour l'authentification X (xauth). Cependant, Kevin vise plus � l'utilisation de xdm pour diriger xauth � votre place.

On m'a indiqu� que le volume 8 de la s�rie consacr�e au syst�me X Window, le « Guide de l'administrateur du syst�me X Window » de chez O'Reilly and Associates �tait une bonne source d'informations. Cependant, ce guide n'a pas �t� mis � jour depuis sa publication d'origine en 1992. Il ne couvre donc que X11R4 et X11R5, tout ce qui est sp�cifique � X11R6 n'est pas couvert.

Il y a �galement un autre document qui ressemble beaucoup � celui que vous �tes en train de lire, dont le titre est « Securing X Windows », et qui est disponible � http://ciac.llnl.gov/ciac/documents/ciac2316.html.

Consultez �galement les forums de diffusion Usenet, tels que : comp.windows.x, comp.os.linux.x et comp.os.linux.networking.

3. Le contexte

Vous utilisez deux ordinateurs. Sur le premier, vous �tes dans l'environnement X Window pour taper au clavier et regarder l'�cran. Sur le second, vous effectuez un important traitement graphique. Vous voulez que les sorties du second soient affich�es sur l'�cran du premier. Le syst�me X Window rend cela possible.

Naturellement, vous devez disposer d'une connexion � un r�seau pour pouvoir le r�aliser. De pr�f�rence rapide, car le protocole X est un d�voreur de ressources r�seau. Mais, avec un peu de patience et un protocole de compression de donn�es adapt�, vous pouvez m�me faire tourner des applications par l'interm�diaire d'un modem. Pour un protocole de compression pour X, vous pouvez aller consulter les sites : dxpc http://www.vigor.nu/dxpc/ ou LBX http://www.traduc.org/docs/HOWTO/mini/lecture/LBX.html (disponible en version originale sur le site de l'auteur : http://www.paulandlesley.org/faqs/LBX-HOWTO.html).

Vous avez deux choses � faire pour r�aliser tout cela :

  1. Indiquer � l'unit� d'affichage locale (le serveur) qu'elle doit accepter les connexions venant de l'ordinateur � distance.
  2. Dire � l'application � distance (le client) de rediriger ses sorties vers votre unit� d'affichage locale.

4. Un peu de th�orie

Le mot magique est DISPLAY (unit� d'affichage). Dans le syst�me X Window, une unit� d'affichage est constitu�e (en simplifiant) d'un clavier, d'un mulot et d'un �cran. Une unit� d'affichage est g�r�e par un programme serveur, plus connu sous le nom de serveur X. Le serveur fournit des fonctionnalit�s d'affichage aux autres programmes qui se connectent � lui.

Une unit� d'affichage est identifi�e par un nom, de type, par exemple :

Un nom d'unit� d'affichage est constitu� d'un nom d'h�te (par exemple : light.uni.verse et localhost), du signe deux point (:), et d'un num�ro de s�quence (tels que 0 et 4). Le nom d'h�te de l'unit� d'affichage est le nom de l'ordinateur sur lequel tourne le serveur X. Si le nom de l'h�te est omis, cela signifie qu'il s'agit de l'ordinateur local. D'habitude, le num�ro de s�quence est 0 – cela peut changer s'il y a plusieurs unit�s d'affichage connect�es sur le m�me ordinateur.

Si jamais il vous arrive de voir le nom d'une unit� d'affichage avec un .n suppl�mentaire accol� � son nom, c'est qu'il s'agit d'un num�ro d'�cran. Une unit� d'affichage peut, en th�orie, avoir plusieurs �crans. Cependant, d'habitude, il n'y en a qu'un, qui porte le num�ro n=0, et c'est le num�ro par d�faut.

D'autres formes de DISPLAY existent, mais celle-ci suffira pour notre propos.

Pour celui qui est curieux de technique :

5. Dire au client ...

Le programme client (par exemple, votre application graphique) sait � quelle unit� d'affichage il doit se connecter en consultant la variable d'environnement DISPLAY. Cependant ce param�trage peut �tre modifi� en lan�ant le client avec l'argument -display hostname:0 dans la ligne de commande. Quelques exemples peuvent clarifier les choses.

Notre ordinateur est connu du monde ext�rieur sous le nom light, et nous sommes dans le domaine uni.verse. Si nous fonctionnons avec un serveur X normal, l'unit� d'affichage est connue comme �tant light.uni.verse:0. Nous voulons faire tourner le programme de dessin xfig sur un ordinateur � distance, appel� dark.matt.er, et afficher sa sortie ici, sur light.

Supposons que vous vous soyez d�j� connect� par telnet � l'ordinateur distant, dark.matt.er.

Si l'interpr�teur de commande de l'ordinateur �loign� est csh :

dark% setenv DISPLAY light.uni.verse:0
dark% xfig &

Ou, d'une autre mani�re :

dark% xfig -display light.uni.verse:0 &

Si c'est sh qui tourne sur l'ordinateur � distance :

dark$ DISPLAY=light.uni.verse:0
dark$ export DISPLAY
dark$ xfig &

Ou, autrement :

dark$ DISPLAY=light.uni.verse:0 xfig &

Ou, bien s�r, �galement :

dark$ xfig -display light.uni.verse:0 &

Il para�t que certaines versions de telnet transmettent automatiquement la variable DISPLAY � l'ordinateur h�te �loign�. Si vous avez l'une de celles-ci, vous avez de la chance, et c'est effectivement automatique. Si ce n'est pas le cas, la plupart des versions de telnet doivent transmettre la variable d'environnement TERM, et avec un bidouillage judicieux, il est possible de superposer la variable DISPLAY sur la variable TERM.

L'id�e, sous-jacente � cette superposition, est de r�aliser une sorte de script pour effectuer ceci : avant la connexion par telnet, donnez la valeur de DISPLAYTERM. Puis, lancez telnet. Du c�t� de l'ordinateur distant, dans le fichier .*shrc concern�, lisez la valeur de DISPLAY � partir de TERM.

6. Dire au serveur ...

Le serveur n'acceptera pas de connexions venant de n'importe o�. Vous ne voulez pas que n'importe qui puisse afficher des fen�tres sur votre �cran. Ou lire ce vous tapez – souvenez-vous que votre clavier fait partie de votre unit� d'affichage !

Trop peu de gens semble r�aliser que permettre l'acc�s � leur unit� d'affichage pose des probl�mes de s�curit�. Quelqu'un qui dispose d'un acc�s � votre unit� d'affichage peut lire et �crire sur vos �crans, lire vos frappes au clavier, et suivre les d�placements de votre mulot.

La plupart des serveurs disposent de deux mani�res d'authentifier les demandes de connexions qui arrivent : le m�canisme de la liste d'h�tes (xhost) et le m�canisme du mot de passe secret (magic cookie) (xauth). De plus, il y a ssh, l'interpr�teur de commande s�curis�, qui peut acheminer les connexions X.

Veuillez noter que certains serveurs X (de XFree86) peuvent �tre configur�s pour ne pas �couter sur le port habituel TCP avec le param�tre -nolisten tcp. La configuration par d�faut de Debian GNU/Linux, notamment, d�sactive l'�coute sur le port TCP par le serveur X. Si vous d�sirez utiliser X � distance sur un syst�me Debian, vous devriez r�activer ceci en modifiant la fa�on dont est lanc� le serveur X. Veuillez voir le fichier /etc/X11/xinit/xserverrc pour un point de d�part.

6.1 Xhost

Xhost permet les acc�s bas�s sur les nom d'h�tes. Le serveur entretient une liste des h�tes qui sont autoris�s � se connecter � lui. Il peut aussi d�sactiver compl�tement la v�rification des h�tes. Attention : cela signifie que plus aucun contr�le n'est effectu�, et donc, que n'importe quel h�te peut se connecter !

Vous pouvez contr�ler la liste des h�tes du serveur avec le programme xhost. Pour utiliser ce m�canisme dans l'exemple pr�c�dent, faites :

light$ xhost +dark.matt.er

Ceci permet toutes les connexions � partir de l'h�te dark.matt.er. D�s que votre client X a r�alis� sa connexion et affiche une fen�tre, par s�curit�, supprimez les permissions pour d'autres connexions avec :

light$ xhost -dark.matt.er

Vous pouvez d�sactiver la v�rification des h�tes avec :

light$ xhost +

Ceci d�sactive la v�rification des acc�s des h�tes et donc permet � tout le monde de se connecter. Vous ne devriez jamais faire cela sur un r�seau o� vous n'avez pas confiance dans tous les utilisateurs (tel internet). Vous pouvez r�activer la v�rification des h�tes avec :

light$ xhost -

xhost - par lui-m�me ne supprime pas tous les h�tes de la liste d'acc�s (ce qui serait tout � fait inutile - vous ne pourriez plus vous connecter de n'importe o�, pas m�me de votre h�te local).

Xhost est un m�canisme vraiment tr�s peu s�r. Il ne fait pas de distinction entre les diff�rents utilisateurs sur l'h�te � distance. De plus, les noms d'h�tes (en r�alit� des adresses) peuvent �tre manipul�s. C'est mauvais si vous vous trouvez sur un r�seau douteux (d�j�, par exemple, avec un acc�s PPP t�l�phonique � Internet).

6.2 Xauth

Xauth autorise l'acc�s � tous ceux qui connaissent le bon secret. On appelle un tel secret un enregistrement d'autorisation ou cookie. Ce m�canisme d'autorisation est d�sign� c�r�monieusement comme �tant le MIT-MAGIC-COOKIE-1.

Les cookies pour les diff�rentes unit�s d'affichage sont stock�s ensemble dans ~/.Xauthority. Votre fichier ~/.Xauthority doit �tre inaccessible pour les utilisateurs groupe/autres. Le programme xauth g�re ces cookies, d'o� le surnom xauth dans ce sch�ma.

Vous pouvez sp�cifier un fichier cookie diff�rent avec la variable d'environnement XAUTHORITY, mais vous aurez rarement besoin de le faire. Si vous ne savez pas quel fichier cookie votre xauth utilise, faites un xauth -v et il vous l'indiquera.

Au d�marrage d'une session, le serveur lit un cookie dans le fichier qui est indiqu� par l'argument -auth. Ensuite, le serveur ne permet la connexion que des clients qui connaissent le m�me cookie. Quand le cookie dans ~/.Xauthority change, le serveur ne r�cup�rera pas la modification.

Les serveurs les plus r�cents peuvent g�n�rer des cookies � la vol�e pour des clients qui le demandent. Les cookies sont cependant encore conserv�s dans le serveur : ils ne finissent pas dans ~/.Xauthority � moins qu'un client ne les y mettent. Selon David Wiggins :

Une possibilit� suppl�mentaire , qui peut vous int�resser, a �t� ajout�e dans X11R6.3. Par l'interm�diaire de la nouvelle extension SECURITY, le serveur X lui-m�me peut g�n�rer et renvoyer de nouveaux cookies � la vol�e. De plus, on peut d�signer les cookies comme �tant « douteux » de sorte que les applications qui se connectent avec de tels cookies auront une capacit� op�ratoire restreinte. Par exemple, ils ne pourront pas regarder les entr�es au clavier/mulot, ou le contenu des fen�tres, d'autres clients « fiables ». Il y a une nouvelle sous-commande « generate » de xauth pour rendre cette fonctionnalit�, pas forc�ment facile, mais au moins possible � utiliser.

Xauth poss�de un avantage clair, au niveau de la s�curit�, sur xhost. Vous pouvez limiter l'acc�s � des utilisateurs sp�cifiques sur des ordinateurs sp�cifiques. Il ne permet pas l'usurpation d'adresse comme le permet xhost. Et, si vous le d�sirez, vous pouvez encore utiliser xhost en parall�le pour permettre des connexions.

Fabrication du cookie

Si vous voulez utiliser xauth, vous devez lancer le serveur X avec l'argument -auth authfile. Si vous utilisez le script startx pour lancer le serveur X, c'est le bon endroit pour le faire. Cr�ez l'enregistrement d'autorisation comme indiqu� ci-dessous dans votre script startx.

Extrait de /usr/X11R6/bin/startx :

mcookie|sed -e 's/^/add :0 . /'|xauth -q
xinit -- -auth "$HOME/.Xauthority"

Mcookie est un petit programme du paquet util-linux, site primaire ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux. Autrement, vous pouvez utiliser md5sum pour cr�er quelques donn�es al�atoires (de, par exemple, /dev/urandom ou ps -axl) au format cookie :

dd if=/dev/urandom count=1|md5sum|sed -e 's/^/add :0 . /'|xauth -q
xinit -- -auth "$HOME/.Xauthority"

Si vous ne pouvez pas �diter le script startx (parce que vous n'�tes pas root), demandez � votre administrateur syst�me de configurer startx correctement, ou, � la place, laissez-le configurer xdm. S'il ne peut, ou ne veut, pas, vous pouvez �crire un script ~/.xserverrc. Si vous avez ce script, il sera ex�cut� par xinit au lieu du v�ritable serveur X. Alors, vous pourrez lancer le serveur X v�ritable � partir de ce script avec les arguments adapt�s. Pour faire cela, faites utiliser par votre ~/.xserverrc le mcookie de la ligne ci-dessus pour cr�er un cookie puis lancer le v�ritable serveur X :

#!/bin/sh
mcookie|sed -e 's/^/add :0 . /'|xauth -q
exec /usr/X11R6/bin/X "$@" -auth "$HOME/.Xauthority"

Si vous utilisez xdm pour g�rer vos sessions X, vous pouvez utiliser xauth facilement. D�finissez les ressources du DisplayManager.authDir dans /etc/X11/xdm/xdm-config. Xdm passera l'argument -auth au serveur X � son d�marrage. Au moment de la connexion sous xdm, xdm place le cookie dans ~/.Xauthority pour vous. Consultez xdm(1) pour de plus amples informations. Par exemple, mon /etc/X11/xdm/xdm-config contient la ligne suivante :

DisplayManager.authDir: /var/lib/xdm

Transfert du cookie

Maintenant que vous avez lanc� votre session X sur le serveur h�te light.uni.verse et que vous avez votre cookie dans ~/.Xauthority, il vous faut transf�rer le cookie sur le client, dark.matt.er. Il y a plusieurs fa�ons de le faire.

R�pertoires personnels (home) partag�s

Le plus simple est que vos r�pertoires sur light et dark soient partag�s. Les fichiers ~/.Xauthority sont les m�mes, donc le cookie est transf�r� instantan�ment. Cependant, il y a un pi�ge : lorsque vous mettez un cookie pour :0 dans ~/.Xauthority, dark va croire que c'est un cookie pour lui au lieu de light. Il faut que vous utilisiez un nom d'h�te explicite � la cr�ation du cookie : on ne peut pas faire autrement. Vous pouvez installer le m�me cookie pour, � la fois, :0 et light:0 avec un peu d'astuce :

#!/bin/sh
mcookie|sed -e 's/^/add :0 . /' -e p -e "s/:/$HOST&/"|xauth -q
exec /usr/X11R6/bin/X "$@" -auth "$HOME/.Xauthority"

En utilisant le shell � distance, rsh

Si les r�pertoires home ne sont pas partag�s, vous pouvez transf�rer le cookie au moyen de rsh, le shell � distance :

light$ xauth nlist "${HOST}:0" | rsh dark.matt.er xauth nmerge -

  1. Extraire le cookie de votre fichier local ~/.Xauthority (xauth nlist :0).
  2. Le transf�rer vers dark.matt.er (| rsh dark.matt.er).
  3. Le mettre dans ~/.Xauthority l� (xauth nmerge -).

Notez l'utilisation de ${HOST}. Vous devez transf�rer le cookie qui est explicitement associ� � l'h�te local. Une application X distante interpr�terait une valeur d'unit� d'affichage �gale � :0 comme �tant une r�f�rence � la machine distante, ce qui ne correspond pas � ce que l'on veut !

Manuellement, par Telnet

Il est possible que rsh ne fonctionne pas chez vous. En plus de cela, rsh a un inconv�nient en ce qui concerne la s�curit� (noms d'h�tes usurp�s, si je me souviens bien). Si vous ne pouvez, ou ne voulez, pas utiliser rsh, vous pouvez �galement transf�rer le cookie manuellement, comme ceci :

light$ echo $DISPLAY
:0
light$ xauth list $DISPLAY
light/unix:0 MIT-MAGIC-COOKIE-1 076aaecfd370fd2af6bb9f5550b26926
light$ rlogin dark.matt.er
Password:
dark% setenv DISPLAY light.uni.verse:0
dark% xauth
Using authority file /home/zweije/.Xauthority
xauth> add light.uni.verse:0 . 076aaecfd370fd2af6bb9f5550b26926
xauth> exit
Writing authority file /home/zweije/.Xauthority
dark% xfig &
[15332]
dark% logout
light$

Consultez �galement rsh(1) et xauth(1x) pour de plus amples informations.

En automatisant la m�thode Telnet

Il doit �tre possible de superposer le cookie sur la variable TERM ou DISPLAY quand vous utilisez telnet sur l'h�te �loign�. Cela doit fonctionner de la m�me mani�re que de superposer la variable DISPLAY sur la variable TERM. Regardez la section 5 : Dire au client. De mon point de vue, sur ce sujet, vous prenez vos responsabilit�s, mais cela m'int�resse si quelqu'un peut me confirmer ou m'infirmer cela.

Notez, cependant, qu'avec certains Unix les variables d'environnement peuvent �tre visibles par les autres et vous ne pourrez pas emp�cher la visualisation du cookie dans $TERM si certains veulent le voir.

Utilisation du cookie

Une application X, telle que xfig ci-dessus, sur dark.matt.er, ira automatiquement voir le cookie dans ~/.Xauthority pour s'authentifier.

L'utilisation de localhost:D entra�ne une petite difficult�. Les applications X clientes traduisent localhost:D en host/unix:D pour effectuer la recherche du cookie. Effectivement, cela signifie qu'un cookie pour localhost:D dans votre ~/.Xauthority n'a aucun effet.

Si l'on y r�fl�chit, c'est logique. L'interpr�tation de localhost d�pend enti�rement de la machine sur laquelle s'effectue cette interpr�tation. Si ce n'�tait pas le cas, cela causerait un horrible bazar dans le cas d'un r�pertoire personnel (home) partag�, par exemple par l'interm�diaire de NFS, avec plusieurs h�tes interf�rant chacun avec ses propres cookies.

6.3 Ssh

Les enregistrements d'autorisation sont transmis sur le r�seau sans codage. Si vous vous souciez de ce que l'on puisse espionner vos connexions, utilisez ssh, le shell s�curis�. Il effectuera des transmissions X s�curis�es au moyen de connexions chiffr�es.

Pour activer la transmission X par ssh, utilisez l'option de la ligne de commande -X ou �crivez ce qui suit dans votre fichier local de configuration de ssh :

Host remote.host.name
  ForwardX11 yes

Le serveur ssh (sshd) du c�t� distant positionnera automatiquement la variable DISPLAY sur l'extr�mit� du tunnel X transmis. Le tunnel distant r�cup�re son propre cookie ; le serveur ssh distant le g�n�re pour vous et le place dans ~/.Xauthority l�-bas. Ainsi, l'autorisation X avec ssh est compl�tement automatique.

De plus, il est g�nial pour d'autres choses aussi. C'est une bonne am�lioration structurelle de votre syst�me. Allez simplement voir http://www.ssh.org/, la page d'accueil de ssh.

Si vous poss�dez d'autres informations sur les m�thodes d'authentification ou de chiffrement des connexions X, par exemple, gr�ce � Kerberos, envoyez-les moi, je les int�grerai ici.

7. Les applications X avec un identificateur d'utilisateur (User-id) diff�rent

Supposez que vous vouliez faire tourner un outil graphique de configuration qui n�cessite d'avoir les privil�ges du compte root alors que la session X actuelle se d�roule sous votre compte. Cela peut sembler �trange au premier abord, mais le serveur X ne permettra pas � cet outil d'acc�der � votre unit� d'affichage. Comment cela est-il possible alors que root peut normalement tout faire ? Et comment contourner ce probl�me ?

�largissons le propos au cas o� l'on veut faire tourner une application X, sous un identificateur d'utilisateur clientuser, alors que la session X a �t� lanc�e par serveruser. Si vous avez lu le paragraphe sur les cookies, il est �vident que clientuser ne peut pas acc�der � votre unit� d'affichage : ~clientuser/.Xauthority ne contient pas le cookie magique qui permet d'acc�der � l'unit� d'affichage. Le cookie correct se trouve dans ~serveruser/.Xauthority.

7.1 Plusieurs utilisateurs sur le m�me h�te

Naturellement, tout ce qui marche pour un X distant marchera aussi pour un X � partir d'un identificateur d'utilisateur diff�rent (particuli�rement slogin localhost -l clientuser). Et ici l'h�te client et l'h�te serveur sont pr�cis�ment les m�mes. Cependant, quand les deux h�tes sont les m�mes, il y a quelques raccourcis pour transf�rer le cookie magique.

On supposera que l'on utilise su pour passer d'un identificateur utilisateur � l'autre. Essentiellement, il faut �crire un script qui appelle su, mais enveloppe la commande que su ex�cute d'un peu de code qui effectue les t�ches n�cessaires pour le X distant. Ces t�ches n�cessaires sont l'initialisation de la variable DISPLAY et le transfert du cookie magique.

L'initialisation de DISPLAY est relativement facile ; il faut simplement d�finir DISPLAY="$DISPLAY" avant d'ex�cuter l'argument de la commande su. Donc, il faut simplement faire :

su - clientuser -c "env DISPLAY="$DISPLAY" clientprogram &"

Ce n'est pas tout, il faut encore transf�rer le cookie. On peut le retrouver en utilisant xauth list "$DISPLAY". Cette commande renvoie le cookie dans un format qui convient pour l'utiliser dans la commande xauth add : ce dont nous avons justement besoin !

On pourrait imaginer passer le cookie par l'interm�diaire d'un canal de transmission. Manque de chance, ce n'est pas si facile de passer quelque chose � la commande su par l'interm�diaire d'un canal de transmission car su attend le mot de passe de l'entr�e standard. Cependant, dans un script shell on peut jongler avec quelques descripteurs de fichiers et arriver � le faire.

Donc, on �crit un script de ce style en le param�trant avec clientuser et clientprogram. Pendant que nous y sommes, am�liorons un peu ce script, �a va le rendre un peu moins compr�hensible mais un peu plus robuste. Le tout ressemble � cela :

#!/bin/sh

if [ $# -lt 2 ]
then echo "usage: `basename $0` clientuser command" >&2
     exit 2
fi

CLIENTUSER="$1"
shift

# FD 4 becomes stdin too
exec 4>&0

xauth list "$DISPLAY" | sed -e 's/^/add /' | {

    # FD 3 becomes xauth output
    # FD 0 becomes stdin again
    # FD 4 is closed
    exec 3>&0 0>&4 4>&-

    exec su - "$CLIENTUSER" -c \
         "xauth -q <&3
          exec env DISPLAY='$DISPLAY' "'"$SHELL"'" -c '$*' 3>&-"

}

Je pense que c'est portable et que cela fonctionne suffisamment correctement dans la plupart des circonstances. Le seul d�faut auquel je pense en ce moment est d� � l'utilisation de '$*', les guillemets simples dans command vont perturber les guillemets de l'argument('$*') de la commande su. Si cela entra�ne quelque chose de vraiment g�nant, envoyez-moi un courrier �lectronique.

Nommez le script /usr/local/bin/xsu, et vous pouvez faire :

xsu clientuser 'command &'

Cela ne peut pas �tre plus facile, � moins que vous ne vous d�barrassiez du mot de passe. Oui, il existe des moyens pour y arriver (sudo), mais ce n'est pas l'endroit pour en parler.

Le petit script xsu mentionn� ci-dessus a servi comme base pour un script plus �tendu appel� sux qui a, apparemment, trouv� sa place comme paquet dans la distribution Debian.

7.2 Root est l'utilisateur client

�videmment, tout ce qui marche pour un client non root doit fonctionner pour root. Cependant, avec root vous pouvez faire cela encore plus facilement, car celui-ci peut lire le fichier ~/.Xauthority de tout le monde. Il n'y a pas besoin de transf�rer le cookie. Tout ce qu'il y a � faire consiste � initialiser DISPLAY, et � faire pointer XAUTHORITY sur ~serveruser/.Xauthority. Donc, vous pouvez �crire :

su - -c "exec env DISPLAY='$DISPLAY' \
                  XAUTHORITY='${XAUTHORITY-$HOME/.Xauthority}' \
                  command"

Et, en mettant cela dans un script, cela donne quelque chose comme 

#!/bin/sh
if [ $# -lt 1 ]
then echo "usage: `basename $0` command" >&2
     exit 2
fi
su - -c "exec env DISPLAY='$DISPLAY' \
                  XAUTHORITY='${XAUTHORITY-$HOME/.Xauthority}' \
                  "'"$SHELL"'" -c '$*'"

Nommez le script /usr/local/bin/xroot, et vous pouvez faire :

xroot 'control-panel &'

Cependant, si vous avez d�j� initialis� xsu , il n'y a pas de vraie raison de faire cela.

8. Faire tourner un gestionnaire de fen�tres distant

Un gestionnaire de fen�tres (comme twm, wmaker, ou fvwm95) est une application comme n'importe quelle autre. La proc�dure normale devrait fonctionner.

Enfin, presque. Il ne peut tourner, au plus, qu'un seul gestionnaire de fen�tres � un instant donn� dans une unit� d'affichage. Si vous faites d�j� tourner un gestionnaire de fen�tre local, vous ne pouvez pas lancer le gestionnaire distant (il le dira et s'arr�tera). Il faut tuer (ou simplement quitter) le gestionnaire local en premier.

Par manque de chance, beaucoup de scripts de sessions X se terminent par un

exec le-gestionnaire-de-fenetres-de-votre-choix

et cela signifie que quand le gestionnaire de fen�tre (local) se termine, votre session se termine, et le syst�me (xdm ou xinit) consid�re que votre session est termin�e, et effectivement, vous d�connecte.

Vous aurez encore � faire quelques contorsions, mais vous devez y arriver et ce n'est pas trop difficile. Amusez-vous un peu avec votre script de session (normalement ~/.xsession ou ~/.xinitrc) pour arriver � vos fins.

Attention, un gestionnaire de fen�tres permet souvent de faire tourner de nouveaux programmes qui s'ex�cuteront sur la machine locale. C'est-�-dire locale � la machine sur lequel tourne le gestionnaire de fen�tres. Si vous faites tourner un gestionnaire de fen�tres distant, il lancera des applications distantes, et ce n'est peut-�tre pas ce que vous voulez. Naturellement, elles continueront � s'afficher sur l'unit� d'affichage qui est locale pour vous.

9. Mettre en place un terminal X

Trouvez une utilisation � votre vieux PC ! Faites-en un endroit suppl�mentaire pour pouvoir travailler ! Pas besoin d'acheter un nouveau mat�riel co�teux ! Vous avez d�j� tout ce qu'il faut !

S�rieusement, vous pouvez mettre en place un vieux PC comme terminal X. Un terminal X est un ordinateur qui fondamentalement n'ex�cute rien d'autre qu'un serveur X. Vous pouvez vous connecter dessus et obtenir une session X, avec des xterms, xbiff, xclock et tout autre client X concevable. Cependant, les clients X s'ex�cuteront sur l'h�te distant et ils utiliseront le serveur X distant pour afficher leur sortie sur votre terminal X local. M�me le gestionnaire de fen�tre s'ex�cutera � distance.

Un terminal X consomme peu de ressources en comparaison d'une machine Unix compl�te. J'ai ici un terminal X constitu� par un processeur 486, 16 Mo de RAM et 250 Mo d'espace disque. Oh et une connexion r�seau, naturellement. Il n'a m�me pas besoin d'avoir des r�pertoires utilisateurs.

Pour trouver des lectures li�es � ce sujet, jetez un coup d'oeil aux documents suivants :

� la diff�rence des documents ci-dessus, le document que vous �tes en train de lire se limite � une courte description de XDMCP, mais il insiste plus sur les probl�mes de s�curit� impliqu�s.

9.1 Une fois de plus, un peu de th�orie en premier

En ce qui concerne X, le terminal X va n'ex�cuter rien d'autre qu'un serveur X. Ce serveur X sera configur� pour dialoguer avec l'h�te distant en utilisant XDMCP (le protocole de contr�le de gestion d'affichage X, � X Display Manager Control Protocol �). Il va demander � l'h�te distant une session X. L'h�te distant fournira une fen�tre de connexion dans le terminal X et apr�s la connexion, il ex�cutera une session X avec tout l'habillage y compris le gestionnaire de fen�tres, tout cela utilisant X distant pour l'affichage sur le terminal X.

Vous aurez probablement remarqu� que l'h�te distant agit comme un serveur, bien que pas comme un serveur X. L'h�te distant fournit les sessions X aux serveurs X qui les demandent. Ainsi, selon XDMCP, l'h�te distant est en fait un serveur, fournissant des sessions X, �galement connu sous le nom de serveur XDMCP. Le serveur X joue le r�le d'un client XDMCP ! Vous me suivez ?

Le programme qui fournit le service XDMCP sur le serveur XDMCP est xdm. Donc, pour ex�cuter un terminal X, vous devez configurer deux programmes : X (le client XDMCP) sur le terminal X et xdm (le serveur XDMCP) sur l'h�te distant.

Vous devez toujours vous rappeler que le protocole X (et le protocole XDMCP) n'est pas chiffr�. Si vous devez utiliser X � distance, tout ce qui transite sur le r�seau peut �tre espionn� par d'autres h�tes du r�seau. Ceci est particuli�rement n�faste avec les sessions X distantes car la premi�re chose qui se passe est la connexion en donnant l'utilisateur et le mot de passe. Vous ne devez donc ex�cuter X � distance que sur un r�seau s�curis� !

9.2 Configurer X comme client XDMCP

Si vous d�sirez mettre en place une machine Linux comme terminal X, vous avez besoin de tr�s peu de ressources. Fondamentalement, vous avez besoin de ce qu'il est n�cessaire d'avoir pour faire fonctionner une machine Linux d�pouill�e plus un serveur X. Sp�cifiquement, vous n'avez pas besoin des clients et biblioth�ques X. Il peut �tre utile d'installer certaines polices X, mais vous pouvez �galement utiliser un serveur de polices situ� quelque part sur le r�seau.

Il existe plusieurs moyens pour un serveur X d'obtenir une session X d'un serveur XDMCP. La plus simple est d'aller directement � un serveur XDMCP connu et de lui en demander une. Le serveur peut �galement �mettre en multi-diffusion une requ�te et utiliser le premier serveur XDMCP qui r�pond. Enfin, le serveur X peut demander � un serveur XDMCP de lui fournir une liste des h�tes qui acceptent de fournir une session et laisser l'utilisateur choisir l'h�te de session.

  1. Si vous connaissez l'h�te qui va vous fournir une session, utilisez-le directement. Ex�cutez
    X -query sessionhost
    
    et, en supposant que xdm fonctionne sur sessionhost, vous obtiendrez une fen�tre de connexion et, apr�s connexion, une session X.
  2. Si l'h�te duquel vous obtiendrez la session vous importe peu, utilisez la m�thode d'�mission de multi-diffusion. Ex�cutez
    X -broadcast
    
    et, en supposant que xdm fonctionne sur un h�te quelque part sur le r�seau, vous obtiendrez une fen�tre de connexion du premier (et, on l'esp�re, du plus rapide) xdm qui r�pond et, apr�s connexion, une session X.
  3. Si vous d�sirez choisir l'h�te o� vous voulez avoir votre session, demandez au serveur XDMCP une liste des h�tes. Ex�cutez
    X -indirect xdmcpserver
    
    et, en supposant que xdm est bien configur� sur ce serveur, une liste des h�tes vous sera pr�sent�e parmi lesquels vous pourrez choisir. Choisissez-en un ; vous obtiendrez la fen�tre de connexion pour cet h�te et, apr�s connexion, la session que vous avez demand�e.

Il se peut que vous ayez remarqu� l'absence de l'option -auth. Le serveur X utilisera XDMCP pour n�gocier le mot de passe secret (� magic cookie �) avec le serveur XDMCP. Le serveur XDMCP placera le cookie dans votre ~/.Xauthority apr�s la connexion.

Apr�s la fermeture d'une session, le serveur X va boucler, il reviendra au serveur XDMCP d'origine et lui demandera une nouvelle session (ou une liste de choix). Si vous ne d�sirez pas cela, vous pouvez utiliser l'option -once. Notez que ceci ne semble pas fonctionner avec l'option -indirect � cause de l'impl�mentation du � chooser �.

Quand vous avez d�termin� la fa�on dont vous allez ex�cuter le serveur X, vous pouvez alors le placer dans un script de d�marrage ou m�me l'ex�cuter directement � partir de /etc/inittab. Veuillez consulter la documentation de votre propre distribution pour savoir comment modifier vos scripts d'amor�age ou /etc/inittab.

N'ex�cutez pas un serveur X ainsi depuis le fichier de configuration Xservers. xdm s'attend � pouvoir se connecter � de tels serveurs et il pourrait les tuer s'il ne peut pas se connecter.

9.3 Configurer xdm comme serveur XDMCP

Le programme qui fournit le service XDMCP (le service de session) est g�n�ralement xdm. Il existe des variantes de celui-ci, comme wdm ou gdm sur Linux, mais ceux-ci fonctionnent fondamentalement de la m�me fa�on. Assurez-vous donc que xdm ou une variante est install� sur l'h�te o� vous d�sirez ex�cuter vos sessions X. Si vous disposez d'une connexion graphique locale depuis l'h�te de session X, xdm est d�j� install� ; la plupart des distributions Linux sont ainsi fournis de nos jours.

En plus de xdm, vous aurez besoin des programmes que vous d�sirez ex�cuter dans une session X. C'est-�-dire, tous les clients X comme xterm, xfig, xclock, des gestionnaires de fen�tre et ainsi de suite. Cependant, pour un serveur XDMCP, vous n'avez pas besoin d'installer de serveur X ; le serveur X fonctionnera � la place sur le terminal X.

� partir de l'histoire sur le serveur X ci-dessus, vous pouvez en conclure qu'il y a fondamentalement deux types de services XDMCP. Il y a le service direct qui consiste � permettre la connexion d'un client XDMCP et � lui fournir une session X. Il y a �galement le service indirect dans lequel le serveur fournit une liste d'h�tes fournissant un service direct, au choix pour le client XDMCP.

Tous les services xdm sont configur�s dans le fichier d'acc�s, g�n�ralement situ� � /etc/X11/xdm/Xaccess ou un emplacement semblable. Cet emplacement est en fait d�fini dans le fichier de configuration g�n�ral de xdm /etc/X11/xdm/xdm-config par la ressource accessFile. Veuillez voir votre manuel xdm pour l'emplacement par d�faut.

  1. Si vous d�sirez autoriser xdm � fournir des sessions X aux clients XDMCP, que ce soit par multi-diffusion ou non, placez le nom d'h�te du client XDMCP (le serveur X, vous vous souvenez ?) seul sur une ligne dans le fichier Xaccess. En fait, vous pouvez placer un expression rationnelle correspondant � plusieurs h�tes. Voici quelques expressions valides :

    xterm023.my.domain      # xterm023.my.domain peut obtenir une session X
    *.my.domain             # tout h�te dans my.domain peut obtenir une session X
    *                       # tout h�te sur Internet peut obtenir une session X (non s�curis�)
    

    Vouloir fournir une session X � tout h�te sur Internet est discutable. De fa�on �vidente, tout service que vous fournissez est une faille de s�curit� potentielle dans la s�curit� de votre serveur. D'un autre c�t�, le serveur devrait �tre s�curis� lui-m�me et un client XDMCP demandant une session X doit fournir une authentification valide avant que la session X ne soit accord�e.

    De plus, la session X utilise une connexion X distante qui n'est pas chiffr�e. La paire nom d'utilisateur/mot de passe de connexion sera transport�e sur cette connexion. Toute personne pourrait alors espionner des combinaisons valides d'utilisateur/mot de passe tout comme sur des connexions telnet simple. Ceci est m�me pire que d'avoir son mot de passe secret (� magic cookie �) espionn�.

    Prenez vos propres d�cisions ici, mais je recommande de ne pas activer ce service au monde entier � moins d'avoir une bonne raison.

  2. Si vous d�sirez fournir aux clients XDMCP (X -indirect xdmcpserver) une liste de choix (une liste d'h�tes pour choisir duquel ils obtiendront une session X), faite suivre l'expression rationnelle du client par le mot-cl� CHOOSER et la liste des h�tes que le client peut choisir. � la place de la liste des h�tes, vous pouvez �galement sp�cifier BROADCAST ; avec ceci, xdm �met en multi-diffusion sur le r�seau pour interroger les serveurs d�sirant fournir une session. Des exemples valides :

    xterm023.my.domain      CHOOSER seshost1 seshost2
    *.my.domain             CHOOSER BROADCAST
    *                       CHOOSER extseshost1 extseshost2
    
    Le premier exemple permet � xterm023 de choisir entre des sessions sur seshost1 et sur seshost2. Le deuxi�me exemple permet � tout h�te dans my.domain de choisir n'importe quel h�te fournissant une session X. Le troisi�me exemple permet � tout h�te de choisir une session entre extseshost1 et extseshost2.

    Ce n'est probablement pas une bonne id�e de faire * CHOOSER BROADCAST. Ceci permettrait � tout h�te en dehors de votre r�seau d'obtenir des informations sur les h�tes dans votre r�seau. Vous ne voulez probablement pas communiquer une telle information. En fait, autoriser un choix pour tout h�te ext�rieur n'est probablement pas tr�s utile de toute fa�on, car vous ne devriez pas autoriser des connexions arbitraires directes non plus.

Quand vous avez reconfigur� xdm, envoyez-lui le signal HUP pour le forcer � relire ses fichiers de configuration.

# kill -HUP pid-of-xdm
#

9.4 XDMCP techniquement

Techniquement, pour autant que je puisse le voir, XDMCP n'est pas tout � fait ce � quoi vous pouvez vous attendre d'apr�s la description ci-dessus. xdm peut rediriger des serveurs X se connectant, vers un autre endroit et il utilise cette astuce pour impl�menter la liste de choix. Ainsi, le choix se produit dans xdm et non dans le serveur X bien que la liste de choix soit repr�sent�e dans l'affichage du serveur X. C'est �galement pour cela que l'option -once du serveur X ne se combine pas avec -indirect.

10. Maintenance

D'ordinaire, la premi�re fois que vous allez essayer de faire tourner une application X � distance, �a ne marchera pas. Voici quelques-uns des messages d'erreur habituels, leur cause probable et des solutions pour vous aider � progresser.

xterm Xt error: Can't open display:

Il n'y a pas de variable DISPLAY renseign�e dans votre environnement et vous n'avez pas non plus lanc� l'application avec le drapeau -display. L'application assume que la variable display contient une cha�ne de caract�res vide, ce qui est syntaxiquement incorrect. La solution � cela consiste � s'assurer que la variable DISPLAY est correctement renseign�e dans l'environnement (avec setenv ou export selon votre shell).

_X11TransSocketINETConnect: Can't connect: errno = 101
xterm Xt error: Can't open display: love.dial.xs4all.nl:0

Erreur 101 signifie « R�seau inaccessible ». L'application n'arrive pas � se connecter au serveur � travers le r�seau. V�rifiez que la variable DISPLAY est correctement renseign�e et que la machine serveur est accessible � partir de votre client (ce qui devrait �tre le cas, car apr�s tout vous �tes probablement connect� au serveur en ayant une session telnet avec votre client).

_X11TransSocketINETConnect: Can't connect: errno = 111
xterm Xt error: Can't open display: love.dial.xs4all.nl:0

Erreur 111 signifie « Connexion refus�e ». La machine � laquelle vous �tes en train d'essayer de vous connecter peut �tre atteinte, mais le serveur indiqu� n'existe pas � cet endroit. V�rifiez que vous utilisez le nom d'h�te correct et le num�ro d'unit� d'affichage ad�quat.

Sinon, il est possible que le serveur X a �t� configur� pour ne pas �couter sur le port TCP habituel. Pour savoir s'il s'agit de ce cas, regardez si le serveur X a �t� lanc� avec le param�tre -nolisten tcp et si oui, enlevez-le.

Xlib: connection to ":0.0" refused by server
Xlib: Client is not authorized to connect to Server
xterm Xt error: Can't open display: love.dial.xs4all.nl:0.0

Le client pourrait r�aliser une connexion avec le serveur, mais celui-ci ne permet pas au client de l'utiliser (pas autoris�). Assurez-vous que vous avez transf�r� le bon cookie au client, et qu'il n'est pas p�rim� (le serveur utilise un nouveau cookie au d�marrage d'une nouvelle session).