sécurité X11

1. Introduction

Il y a trois niveaux de contrôle d'accès à un serveur X :

 

  1. xhost, au niveau des machines,
  2. xauth, au niveau des utilisateurs,
  3. dans les applications.

 

Le contrôle d'accès ne se fait qu'à l'établissement de la connexion d'un client au serveur X par XOpenDisplay(3X).

 

2. Xhost

xhost gère une liste de machines autorisées à se connecter au serveur X.

Un serveur X gère une liste de machines, à partir desquelles tout utilisateur est autorisé à se connecter à ce serveur (i.e. XOpenDisplay(3X)). Le serveur X a aussi un flag indiquant si le contrôle d'accès au niveau des machines est actif.

 

xhost +

désactive le contrôle d'accès, cette utilisation est à proscrire.

 

xhost -

active le contrôle d'accès, mais est largement insuffisante. En particulier elle ne vide pas la liste des machines autorisées.

 

xhost nomdemachine

ajoute la machine nomdemachine à la liste des machines autorisées à se connecter au serveur X,

 

xhost -nomdemachine

supprime nom de machine de la liste des machines autorisées à se connecter au serveur X. Pour vider la liste, il faut en supprimer toutes les machines avec une commande comme :

 

xhost `xhost | awk -F: 'NR > 1 {printf ("-%s ", $NF)}'`

 

xhost

donne la liste des machines autorisées à se connecter au serveur X, et indique si le contrôle d'accès est actif. Il est vivement recommandé d'utiliser cette commande lors de la première utilisation d'un serveur X, car certains d'entre eux ont la possibilité de démarrer avec une liste de machines autorisées non vide. Si tel est le cas, regarder du côté d'un fichier /etc/X*hosts, d'une configuration d'options par fichier, en NVRAM, ou téléchargée.

 

3. Authentification des utilisateurs

Lorsqu'un client X initie une connexion (XOpenDisplay(3X)) avec un serveur X pour lequel le contrôle d'accès est actif et que la machine de laquelle ce client appelle n'est pas dans la liste des machines autorisées, alors ce client peut fournir une clé (le cookie) au serveur. Le client trouve (par défaut) cette clé dans le fichier /.Xauthority. L'accès à ce fichier est contrôlé par le système de fichiers (mode 0600).

La clé initiale est passée au serveur X par 'xdm' en argument au démarrage :

 

/usr/bin/X11/X -auth pathname

 

où pathname (owner root, mode 600) est un fichier contenant la clé initiale.

Lorsqu'un utilisateur s'est identifié (login/password), xdm stocke cette clé (maintenant côté client) dans le fichier : /.Xauthority.

Ce fichier peut être partagé sur plusieurs machines d'un réseau si par NFS, le répertoire $HOME est toujours au même endroit.

 

4. Xauth

xauth gère des clés d'accès à un serveur X. Ces clés sont stockées dans /.Xauthority, et donc sous le contrôle du système de fichiers.

Les fichiers .Xauthority contiennent des triplets <addresse IP d'un serveur> <methodedechiffrement> <cle>

La seule (en France, et pour l'instant) méthode de chiffrement utilisable est MIT-MAGIC-COOKIE-1 : protection par choix dans un espace de clés énorme (2 puissance 128).

 

 xauth list

liste sous une forme texte le contenu du fichier contenant les clés.

xauth add nomduDisplay methodedechiffrement cleenhexa ajoute la clé pour ce serveur X.

 

Une opération de copier/coller entre deux fenêtres permet de passer facilement la clé.

 

 xauth nextract
 xauth nmerge

fonctions similaires à list et add, mais en format hexa et avec lecture et écriture dans un fichier (pouvant etre stdin/stdout).

 

 xauth nextract
          xauth nextract - <Display> | rsh <host> /usr/bin/X11/xauth nmerge -

 

Bien faire attention à ce que Display doit être la façon que host a de nommer le serveur X sur lequel on travaille. Par exemple si le serveur X actuel est ":0.0" que l'on est sur la machine 'mars.planete.edu' et que l'on veut pouvoir ouvrir des fenêtres depuis la machine "violon.musique.fr" alors il faudra utiliser :

 

       xauth nextract - mars.planete.edu:0.0 | rsh violon.musique.fr /usr/bin/X11/xauth nmerge -

 

Dès que l'on veut faire du contrôle d'accès avec X, et utiliser des machines en dehors de son domaine, il devient vital d'utiliser une seule méthode pour nommer toutes les machines. La seule méthode qui soit viable consiste à utiliser le DNS. Si l'on tient toutefois à utiliser d'autres méthodes comme les fichiers /etc/hosts ou NIS, il est essentiel que toutes ces méthodes soient cohérentes entre elles, et il faut donc mettre dans les fichiers hosts les FQDN comme noms primaires, et dans les map NIS host.byname les FQDN seulement, car l'ordre d'obtention des noms n'est pas fiable lors d'une résolution par NIS.

 

       xauth delete <nomduDisplay>

supprime la clé d'accès à ce serveur X.

 

Aujourd'hui, la méthode la plus "recommandable" consiste à activer le contrôle d'accès en partant d'une liste de machines autorisées totalement vide, ce que l'on peut vérifier avec "xhost". Puis à utiliser "xauth".

 

5. OpenWindows sans xdm

Le mécanisme de base est le même que avec 'xauth', mais la clé est stockée ailleurs :

~/.xnews.display

 

La création de la clé initiale se fait avec :

/usr/openwin/lib/mkcookie

 

Cette méthode de démarrage d'un serveur X est déconseillée, par le partage en mode écriture d'un même périphérique (ici l'écran) par 2 drivers différents (en mode caractère, et en mode bitmap) s'ignorant totalement, ne peux pas marcher longtemps.

 

6. Xterm

L'application "xterm" permet de verouiller temporairement l'accès au serveur X (XGrabServer(3X)). Cette fonction s'appelle "Secure keyboard" dans le menu obtenu en utilisant la touche contrôle, et le bouton de gauche.

À partir de ce moment aucune application cliente ne pourra se connecter au serveur. Et des applications déjà connectées, seule l'application "xterm" ayant fait le "XGrabServer(3X)" pourra continuer à communiquer avec le serveur.

 

Une méthode plus sympathique consiste à définir une touche de fonction qui bascule ce mode, en ajoutant dans son fichier /.Xresources les lignes suivantes :

 

*VT100.Translations: #override\n\
<Key> F6:   secure() \n\
\
/*      attention a ne pas supprimer la ligne ci-dessus */

 

Dans ce cas, avant toute utilisation de commande nécessitant l'utilisation d'un mot de passe, comme rlogin, telnet, ... on tapera "F6", et dès que l'authentification sera terminée, on tapera a nouveau "F6". Attention, seul l'accès au serveur X sera inhibé de cette facon, bien evidemment le mot de passe ainsi protégé, circulera comme d'habitude en clair sur le réseau.

 

Cette méthode de verrouillage de l'accès à un serveur X ne présente plus autant d'intérêt si le contrôle d'accès par utilisateur est correctement utilisé, et que l'accès à "root" sur les systèmes d'où peuvent avoir à se connecter des clients n'est pas compromis.

 

7. Xlock

L'application "xlock" permet de verrouiller de la même façon l'accès au serveur X, et de masquer toutes les fenêtres en affichant au premier plan un économiseur d'écran. Le serveur X ne sera débloqué que lorsque le mot de passe correct de l'utilisateur aura été tapé. On peut définir dans son fichier de configuration de gestionnaire de fenêtres un raccourcis clavier permettant de verrouiller facilement son serveur X. Par exemple avec "twm" on peut ajouter la ligne

suivante dans son fichier /.twmrc :

"F6"    = m : all           : !"xlock &"

 

ce qui fait que la combinaison "méta" et touche de fonction "F6" dans tout contexte (c'est a dire n'importe où à l'écran) lancera "xlock".