10.6. Gestion de la sécurité sous XWindow

XWindow n'effectue pas de contrôle d'accès sur les opérations demandées par un processus connecté à un serveur X. Cela signifie que tous les processus qui ont accès à un display y ont un accès total. Par exemple, un processus peut parfaitement faire une prise d'écran et récupérer tous les événements provenant du clavier. Il va de soi que ce genre de processus pose un problème de sécurité majeur, aussi XWindow considère-t-il que seuls les processus lancés sur la machine locale au nom de l'utilisateur courant ont le droit de se connecter au serveur X. Cela protège donc le display de l'utilisateur contre les malversations de personnes mal intentionnées.

Cependant, cette restriction est assez forte, parce qu'elle va vous empêcher de lancer un programme graphique sous un autre nom d'utilisateur. Par exemple, vous ne pourrez pas lancer un programme nécessitant les droits administrateur et dont le bit setuid n'est pas positionné. En effet, une fois que vous vous serez identifié en tant que root avec la commande su, les programmes que vous lancerez le seront au nom de l'utilisateur root, et le serveur X refusera la connexion. Un autre cas d'école où cette restriction peut être gênante est le lancement d'un programme graphique sur une machine distante. La situation est encore plus grave, car cette fois la demande de connexion au serveur X ne provient pas de la machine où il s'exécute, et n'a aucune chance d'aboutir.

XWindow fournit donc les outils nécessaires pour contrôler le niveau de sécurité en cours. Classiquement, le serveur X utilise deux techniques pour contrôler la validité des demandes de connexion des clients. Le premier mécanisme de contrôle d'accès est relativement grossier, puisqu'il se base simplement sur les adresses des machines. Le deuxième mécanisme a été introduit ultérieurement afin de permettre des contrôles plus fins. Les contrôles se font alors à l'aide d'un mécanisme de clés privées, que seuls les clients autorisés connaissent.

10.6.1. La commande xhost

La commande xhost permet de fixer le niveau des contrôles d'accès basés sur les adresses de machines. Comme on l'a vu, le serveur X n'accepte les connexions que de la machine locale. Vous pouvez cependant lui indiquer d'accepter toutes les connexions provenant d'une autre machine avec une commande telle que celle-ci :

xhost +machine
machine est le nom de la machine en qui l'on a confiance. Si aucun nom de machine n'est spécifié, tous les mécanismes de contrôle d'accès sont désactivés.

Inversement, la suppression d'une machine de la liste des machines autorisées est réalisée par la commande suivante :

xhost -machine

La commande xhost - (sans nom de machine) permet de réactiver les mécanismes de contrôle d'accès s'ils ont été désactivés par un xhost +.

Notez bien que donner le droit de connexion à une machine suppose que l'on fasse confiance à tous les utilisateurs de cette machine, car alors ils pourront tous se connecter sur votre serveur X local. De plus, rien ne vous garantit que la machine à qui vous donnez ces droits n'a pas été usurpée par celle d'un pirate (technique dite de l'« IP spoofing »). Ce n'est donc évidemment pas la solution recommandée, surtout si vous êtes connecté à Internet.

10.6.2. La commande xauth

Le deuxième mécanisme de sécurité utilise une clé privée. Tous les clients qui désirent se connecter au serveur local doivent connaître cette clé, faute de quoi leur requête sera refusée. Ainsi, vous pouvez très simplement permettre l'utilisation de votre display à une personne donnée sur une machine donnée, simplement en lui communiquant la clé utilisée par le serveur X gérant votre display. Bien entendu, cette communication doit se faire de manière sûre.

Par défaut, les clés privées utilisées par les clients sont enregistrées dans le fichier .Xauthority de votre répertoire personnel. Ce fichier contient une clé privée pour chaque display auquel vous avez le droit de vous connecter. Les clients que vous lancez consultent donc ce fichier afin de déterminer la clé à utiliser, en fonction du display auquel ils désirent accéder. Une fois cette clé connue, ils peuvent s'authentifier auprès du serveur X gérant ce display, et ainsi obtenir une connexion. Notez bien que le fichier .Xauthority ne doit être accessible que par vous.

Si vous utilisez xdm, une nouvelle clé est automatiquement générée à chaque fois que vous vous connectez à un terminal X. xdm enregistre cette clé dans un fichier temporaire du répertoire référencé par le lien symbolique /etc/X11/xdm/authdir (qui référence généralement le répertoire /var/lib/xdm/authdir/), que seul l'utilisateur root peut accéder. Il communique ensuite ce fichier au serveur X local à l'aide de l'option -auth du serveur X pour que celui-ci puisse lire la clé à utiliser. Enfin, xdm enregistre cette clé dans votre fichier .Xauthority, pour que vous puissiez lancer des clients dans cette session X.

Comme vous pouvez le constater, ce mécanisme de sécurité est totalement transparent pour l'utilisateur. Cependant, il peut être nécessaire de manipuler le fichier .Xauthority pour lire les clés privées et les communiquer aux personnes de confiance qui doivent avoir accès à votre display. Ces manipulations peuvent être effectuées à l'aide de la commande xauth.

La clé associée à un display peut être obtenue avec la commande suivante :

xauth list display
display est le nom du display auquel la clé donne accès. xauth affiche alors le display, le type d'authentification utilisé (MIT-MAGIC-COOKIE-1) et la clé privée.

Vous pouvez communiquer cette clé par les moyens que vous voulez à la personne devant accéder à votre display. Celle-ci pourra alors utiliser la commande suivante pour ajouter la clé à son fichier .Xauthority :

xauth add display . clé
display est le display utilisant la clé clé. Le caractère '.' est une abréviation pour le type d'authentification « MIT-MAGIC-COOKIE-1 » (type d'authentification par défaut). Dès que la clé aura été ajoutée dans son fichier .Xauthority, cette personne aura accès à votre display.

Enfin, la commande suivante :

xauth remove display
permet de supprimer la clé utilisée pour le display display.

Note : Il est nécessaire d'utiliser une technique de communication sûre pour transmettre la clef, faute de quoi le mécanisme de sécurité de XWindow ne servirait à rien. L'utilisation d'OpenSSH est vivement recommandée.