/usr/share/doc/HOWTO/fr-html/Remote-X-Apps.html is in doc-linux-fr-html 2013.01-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta name="generator" content=
"HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
<meta name="GENERATOR" content="LinuxDoc-Tools 0.9.69">
<title>Petit guide d'exécution à distance des
applications X</title>
</head>
<body>
<h1>Petit guide d'exécution à distance des
applications X</h1>
<h2>Version française du <em>Remote X Apps
mini-HOWTO</em></h2>
<h2><a href="http://www.xs4all.nl/~zweije/">Vincent Zweije</a> <
<a href="mailto:zweije@xs4all.nl">zweije@xs4all.nl</a>></h2>
V 0.7.5, 8 décembre 2001
<hr>
<em>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 <a href=
"mailto:fbothamy@mail.dotcom.fr">fbothamy@mail.dotcom.fr</a>.
Relecture de la version française : Olivier Kaloudoff
<a href="mailto:kalou@kalou.net">kalou@kalou.net</a>.</em>
<hr>
<h2><a name="s1" id="s1">1. Introduction</a></h2>
<p>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 :</p>
<ol>
<li>Il y a eu de nombreuses questions, sur Usenet, sur la
manière de faire tourner des applications X à
distance ;</li>
<li>J'ai vu beaucoup, beaucoup de conseils d'utilisation de
« <code>xhost +hostname</code> » ou
même de « <code>xhost +</code> » pour
réaliser des connexions X. <b>C'est d'une
insécurité totale</b>, et il existe de bien
meilleures méthodes ;</li>
<li>Je n'ai pas connaissance d'un document simple décrivant
les options dont <em>on peut</em> disposer. Si vous avez des
informations complémentaires, s'il vous plaît,
faites-le moi savoir (en anglais) : <a href=
"mailto:zweije@xs4all.nl"><zweije@xs4all.nl></a>.</li>
</ol>
<p>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.</p>
<p>La version (anglaise) la plus récente de ce document est
toujours disponible sur le WWW à <a href=
"http://www.xs4all.nl/~zweije/xauth.html">http://www.xs4all.nl/~zweije/xauth.html</a>.
Il est également disponible en tant que mini-HOWTO Linux
« Applications X à distance » (Remote
X Apps) à : <a href=
"http://www.tldp.org/HOWTO/mini/Remote-X-Apps">http://www.tldp.org/HOWTO/mini/Remote-X-Apps</a>.
Les (mini-)HOWTO du projet de documentation Linux (LDP) sont
disponibles par http ou ftp sur <a href=
"http://www.tldp.org">www.tldp.org</a>.</p>
<p>La version française la plus récente de ce
document est toujours disponible sur le site du projet <a href=
"http://www.traduc.org">traduc.org</a> à <a href=
"http://www.traduc.org/docs/HOWTO/mini/lecture/Remote-X-Apps.html">http://www.traduc.org/docs/HOWTO/mini/lecture/Remote-X-Apps.html</a>.</p>
<p>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
<a href="http://www.gnu.org/">GNU</a> Free Documentation Licence.
<em>This document is released under version 1.1 of the <a href=
"http://www.gnu.org/">GNU</a> Free Documentation Licence</em>.</p>
<p>Le contenu de ce petit guide a été mis à
jour le 8 décembre 2001 par <a href=
"http://www.xs4all.nl/~zweije/index.html">Vincent Zweije</a>. La
version française de ce document a été mise
à jour le 4 mars 2003 par <a href=
"mailto:fbothamy@mail.dotcom.fr">Frédéric
Bothamy</a>. La relecture de cette nouvelle version
française a été réalisée par
<a href="mailto:kalou@kalou.net">Olivier Kaloudoff</a>.</p>
<h2><a name="s2" id="s2">2. Lectures
complémentaires</a></h2>
<p>Un document, en rapport avec cela, sur le WWW traite de
« Que faire quand Tk dit que votre écran n'est
pas sûr », <a href=
"http://ce-toolkit.crd.ge.com/tkxauth/">http://ce-toolkit.crd.ge.com/tkxauth/</a>.
Il a été écrit par <a href=
"http://ce-toolkit.crd.ge.com/people/kennykb.html">Kevin Kenny</a>.
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.</p>
<p>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
<a href="http://www.oreilly.com/">O'Reilly and Associates</a>
é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.</p>
<p>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 à <a href=
"http://ciac.llnl.gov/ciac/documents/ciac2316.html">http://ciac.llnl.gov/ciac/documents/ciac2316.html</a>.</p>
<p>Consultez également les forums de diffusion Usenet, tels
que : <code>comp.windows.x</code>,
<code>comp.os.linux.x</code> et
<code>comp.os.linux.networking</code>.</p>
<h2><a name="s3" id="s3">3. Le contexte</a></h2>
<p>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.</p>
<p>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 <a href=
"http://www.vigor.nu/dxpc/">http://www.vigor.nu/dxpc/</a> ou LBX
<a href=
"http://www.traduc.org/docs/HOWTO/mini/lecture/LBX.html">http://www.traduc.org/docs/HOWTO/mini/lecture/LBX.html</a>
(disponible en version originale sur le site de l'auteur :
<a href=
"http://www.paulandlesley.org/faqs/LBX-HOWTO.html">http://www.paulandlesley.org/faqs/LBX-HOWTO.html</a>).</p>
<p>Vous avez deux choses à faire pour réaliser tout
cela :</p>
<ol>
<li>Indiquer à l'unité d'affichage locale (le
serveur) qu'elle doit accepter les connexions venant de
l'ordinateur à distance.</li>
<li>Dire à l'application à distance (le client) de
rediriger ses sorties vers votre unité d'affichage
locale.</li>
</ol>
<h2><a name="s4" id="s4">4. Un peu de théorie</a></h2>
<p>Le mot magique est <code>DISPLAY (unité
d'affichage)</code>. 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.</p>
<p>Une unité d'affichage est identifiée par un nom,
de type, par exemple :</p>
<ul>
<li><code>DISPLAY=light.uni.verse:0</code></li>
<li><code>DISPLAY=localhost:4</code></li>
<li><code>DISPLAY=:0</code></li>
</ul>
<p>Un nom d'unité d'affichage est constitué d'un nom
d'hôte (par exemple : <code>light.uni.verse</code> et
<code>localhost</code>), du signe deux point (<code>:</code>), et
d'un numéro de séquence (tels que <code>0</code> et
<code>4</code>). 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.</p>
<p>Si jamais il vous arrive de voir le nom d'une unité
d'affichage avec un <code>.n</code> 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
<code>n=0</code>, et c'est le numéro par défaut.</p>
<p>D'autres formes de <code>DISPLAY</code> existent, mais celle-ci
suffira pour notre propos.</p>
<p>Pour celui qui est curieux de technique :</p>
<ul>
<li><code>hostname:D.S</code> signifie écran <code>S</code>
sur unité d'affichage <code>D</code> de l'hôte
<code>hostname</code> : le serveur X de cette unité
d'affichage est à l'écoute du port TCP
<code>6000+D</code>.</li>
<li><code>host/unix:D.S</code> signifie écran <code>S</code>
sur unité d'affichage <code>D</code> de l'hôte
<code>host</code> : le serveur X de cette unité
d'affichage est à l'écoute du socket de domaine UNIX
<code>/tmp/.X11-unix/XD</code> (et donc, seul <code>host</code>
peut l'atteindre).</li>
<li><code>:D.S</code> est équivalent à
<code>host/unix:D.S</code>, où <code>host</code> est le nom
de l'hôte local.</li>
</ul>
<h2><a name="s5" id="s5">5. Dire au client ...</a></h2>
<p>Le programme client (par exemple, votre application graphique)
sait à quelle unité d'affichage il doit se connecter
en consultant la variable d'environnement <code>DISPLAY</code>.
Cependant ce paramétrage peut être modifié en
lançant le client avec l'argument <code>-display
hostname:0</code> dans la ligne de commande. Quelques exemples
peuvent clarifier les choses.</p>
<p>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 <code>light.uni.verse:0</code>. Nous
voulons faire tourner le programme de dessin xfig sur un ordinateur
à distance, appelé <code>dark.matt.er</code>, et
afficher sa sortie ici, sur light.</p>
<p>Supposons que vous vous soyez déjà connecté
par telnet à l'ordinateur distant,
<code>dark.matt.er</code>.</p>
<p>Si l'interpréteur de commande de l'ordinateur
éloigné est csh :</p>
<blockquote>
<pre>
<code>dark% setenv DISPLAY light.uni.verse:0
dark% xfig &
</code>
</pre></blockquote>
<p>Ou, d'une autre manière :</p>
<blockquote>
<pre>
<code>dark% xfig -display light.uni.verse:0 &
</code>
</pre></blockquote>
<p>Si c'est sh qui tourne sur l'ordinateur à
distance :</p>
<blockquote>
<pre>
<code>dark$ DISPLAY=light.uni.verse:0
dark$ export DISPLAY
dark$ xfig &
</code>
</pre></blockquote>
<p>Ou, autrement :</p>
<blockquote>
<pre>
<code>dark$ DISPLAY=light.uni.verse:0 xfig &
</code>
</pre></blockquote>
<p>Ou, bien sûr, également :</p>
<blockquote>
<pre>
<code>dark$ xfig -display light.uni.verse:0 &
</code>
</pre></blockquote>
<p>Il paraît que certaines versions de telnet transmettent
automatiquement la variable <code>DISPLAY</code> à
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 <em>doivent</em> transmettre la variable d'environnement
<code>TERM</code>, et avec un bidouillage judicieux, il est
possible de superposer la variable <code>DISPLAY</code> sur la
variable <code>TERM</code>.</p>
<p>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
<code>DISPLAY</code> à <code>TERM</code>. Puis, lancez
telnet. Du côté de l'ordinateur distant, dans le
fichier <code>.*shrc</code> concerné, lisez la valeur de
<code>DISPLAY</code> à partir de <code>TERM</code>.</p>
<h2><a name="s6" id="s6">6. Dire au serveur ...</a></h2>
<p>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 !</p>
<p>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.</p>
<p>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.</p>
<p>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 <code>-nolisten tcp</code>.
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 <code>/etc/X11/xinit/xserverrc</code> pour
un point de départ.</p>
<h2><a name="ss6.1" id="ss6.1">6.1 Xhost</a></h2>
<p>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 <em>n'importe
quel</em> hôte peut se connecter !</p>
<p>Vous pouvez contrôler la liste des hôtes du serveur
avec le programme <code>xhost</code>. Pour utiliser ce
mécanisme dans l'exemple précédent,
faites :</p>
<blockquote>
<pre>
<code>light$ xhost +dark.matt.er
</code>
</pre></blockquote>
<p>Ceci permet toutes les connexions à partir de
l'hôte <code>dark.matt.er</code>. 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 :</p>
<blockquote>
<pre>
<code>light$ xhost -dark.matt.er
</code>
</pre></blockquote>
<p>Vous pouvez désactiver la vérification des
hôtes avec :</p>
<blockquote>
<pre>
<code>light$ xhost +
</code>
</pre></blockquote>
<p>Ceci désactive la vérification des accès
des hôtes et donc permet à <em>tout le monde</em> de
se connecter. Vous ne devriez <em>jamais</em> faire cela sur un
réseau où vous n'avez pas confiance dans
<em>tous</em> les utilisateurs (tel internet). Vous pouvez
réactiver la vérification des hôtes
avec :</p>
<blockquote>
<pre>
<code>light$ xhost -
</code>
</pre></blockquote>
<p><code>xhost -</code> par lui-même <em>ne supprime pas</em>
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).</p>
<p><em>Xhost est un mécanisme vraiment très peu
sûr.</em> 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).</p>
<h2><a name="ss6.2" id="ss6.2">6.2 Xauth</a></h2>
<p>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.</p>
<p>Les cookies pour les différentes unités
d'affichage sont stockés ensemble dans
<code>~/.Xauthority</code>. Votre fichier
<code>~/.Xauthority</code> doit être inaccessible pour les
utilisateurs groupe/autres. Le programme xauth gère ces
cookies, d'où le surnom xauth dans ce schéma.</p>
<p>Vous pouvez spécifier un fichier cookie différent
avec la variable d'environnement <code>XAUTHORITY</code>, mais vous
aurez rarement besoin de le faire. Si vous ne savez pas quel
fichier cookie votre xauth utilise, faites un <code>xauth -v</code>
et il vous l'indiquera.</p>
<p>Au démarrage d'une session, le serveur lit un cookie dans
le fichier qui est indiqué par l'argument
<code>-auth</code>. Ensuite, le serveur ne permet la connexion que
des clients qui connaissent le même cookie. Quand le cookie
dans <code>~/.Xauthority</code> change, <em>le serveur ne
récupérera pas la modification</em>.</p>
<p>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
<code>~/.Xauthority</code> à moins qu'un client ne les y
mettent. Selon David Wiggins :</p>
<blockquote>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.</blockquote>
<p>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.</p>
<h3>Fabrication du cookie</h3>
<p>Si vous voulez utiliser xauth, vous devez lancer le serveur X
avec l'argument <code>-auth authfile</code>. Si vous utilisez le
script <b>startx</b> 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.</p>
<p>Extrait de <code>/usr/X11R6/bin/startx</code> :</p>
<blockquote>
<pre>
<code>mcookie|sed -e 's/^/add :0 . /'|xauth -q
xinit -- -auth "$HOME/.Xauthority"
</code>
</pre></blockquote>
<p>Mcookie est un petit programme du paquet util-linux, site
primaire <a href=
"ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux">ftp://ftp.win.tue.nl/pub/linux-local/utils/util-linux</a>.
Autrement, vous pouvez utiliser md5sum pour créer quelques
données aléatoires (de, par exemple,
<code>/dev/urandom</code> ou <code>ps -axl</code>) au format
cookie :</p>
<blockquote>
<pre>
<code>dd if=/dev/urandom count=1|md5sum|sed -e 's/^/add :0 . /'|xauth -q
xinit -- -auth "$HOME/.Xauthority"
</code>
</pre></blockquote>
<p>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 <code>~/.xserverrc</code>. 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 <code>~/.xserverrc</code> le <code>mcookie</code> de la ligne
ci-dessus pour créer un cookie puis lancer le
véritable serveur X :</p>
<blockquote>
<pre>
<code>#!/bin/sh
mcookie|sed -e 's/^/add :0 . /'|xauth -q
exec /usr/X11R6/bin/X "$@" -auth "$HOME/.Xauthority"
</code>
</pre></blockquote>
<p>Si vous utilisez xdm pour gérer vos sessions X, vous
pouvez utiliser xauth facilement. Définissez les ressources
du DisplayManager.authDir dans
<code>/etc/X11/xdm/xdm-config</code>. Xdm passera l'argument
<code>-auth</code> au serveur X à son démarrage. Au
moment de la connexion sous xdm, xdm place le cookie dans
<code>~/.Xauthority</code> pour vous. Consultez xdm(1) pour de plus
amples informations. Par exemple, mon
<code>/etc/X11/xdm/xdm-config</code> contient la ligne
suivante :</p>
<blockquote>
<pre>
<code>DisplayManager.authDir: /var/lib/xdm
</code>
</pre></blockquote>
<h3>Transfert du cookie</h3>
<p>Maintenant que vous avez lancé votre session X sur le
serveur hôte <code>light.uni.verse</code> et que vous avez
votre cookie dans <code>~/.Xauthority</code>, il vous faut
transférer le cookie sur le client,
<code>dark.matt.er</code>. Il y a plusieurs façons de le
faire.</p>
<h3>Répertoires personnels (home) partagés</h3>
<p>Le plus simple est que vos répertoires sur
<code>light</code> et <code>dark</code> soient partagés. Les
fichiers <code>~/.Xauthority</code> 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 <code>:0</code> dans <code>~/.Xauthority</code>, 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,
<code>:0</code> et <code>light:0</code> avec un peu
d'astuce :</p>
<blockquote>
<pre>
<code>#!/bin/sh
mcookie|sed -e 's/^/add :0 . /' -e p -e "s/:/$HOST&/"|xauth -q
exec /usr/X11R6/bin/X "$@" -auth "$HOME/.Xauthority"
</code>
</pre></blockquote>
<h3>En utilisant le shell à distance, <code>rsh</code></h3>
<p>Si les répertoires <em>home</em> ne sont pas
partagés, vous pouvez transférer le cookie au moyen
de rsh, le shell à distance :</p>
<blockquote>
<pre>
<code>light$ xauth nlist "${HOST}:0" | rsh dark.matt.er xauth nmerge -
</code>
</pre></blockquote>
<ol>
<li>Extraire le cookie de votre fichier local
<code>~/.Xauthority</code> (<code>xauth nlist :0</code>).</li>
<li>Le transférer vers dark.matt.er (<code>| rsh
dark.matt.er</code>).</li>
<li>Le mettre dans <code>~/.Xauthority</code> là
(<code>xauth nmerge -</code>).</li>
</ol>
<p>Notez l'utilisation de <code>${HOST}</code>. 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 à <code>:0</code> comme étant une
référence à la machine distante, ce qui ne
correspond pas à ce que l'on veut !</p>
<h3>Manuellement, par Telnet</h3>
<p>Il est possible que <code>rsh</code> ne fonctionne pas chez
vous. En plus de cela, <code>rsh</code> 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 <code>rsh</code>, vous pouvez également
transférer le cookie manuellement, comme ceci :</p>
<blockquote>
<pre>
<code>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$
</code>
</pre></blockquote>
<p>Consultez également rsh(1) et xauth(1x) pour de plus
amples informations.</p>
<h3>En automatisant la méthode Telnet</h3>
<p>Il doit être possible de superposer le cookie sur la
variable <code>TERM</code> ou <code>DISPLAY</code> quand vous
utilisez telnet sur l'hôte éloigné. Cela doit
fonctionner de la même manière que de superposer la
variable <code>DISPLAY</code> sur la variable <code>TERM</code>.
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.</p>
<p>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
<code>$TERM</code> si certains veulent le voir.</p>
<h3>Utilisation du cookie</h3>
<p>Une application X, telle que <code>xfig</code> ci-dessus, sur
<code>dark.matt.er</code>, ira automatiquement voir le cookie dans
<code>~/.Xauthority</code> pour s'authentifier.</p>
<p>L'utilisation de <code>localhost:D</code> entraîne une
petite difficulté. Les applications X clientes traduisent
<code>localhost:D</code> en <code>host/unix:D</code> pour effectuer
la recherche du cookie. Effectivement, cela signifie qu'un cookie
pour <code>localhost:D</code> dans votre <code>~/.Xauthority</code>
n'a <em>aucun</em> effet.</p>
<p>Si l'on y réfléchit, c'est logique.
L'interprétation de <code>localhost</code> 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.</p>
<h2><a name="ss6.3" id="ss6.3">6.3 Ssh</a></h2>
<p>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.</p>
<p>Pour activer la transmission X par ssh, utilisez l'option de la
ligne de commande <code>-X</code> ou écrivez ce qui suit
dans votre fichier local de configuration de ssh :</p>
<blockquote>
<pre>
<code>Host remote.host.name
ForwardX11 yes
</code>
</pre></blockquote>
<p>Le serveur ssh (<code>sshd</code>) du côté distant
positionnera automatiquement la variable <code>DISPLAY</code> 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
<code>~/.Xauthority</code> là-bas. Ainsi, l'autorisation X
avec ssh est complètement automatique.</p>
<p>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 <a href=
"http://www.ssh.org/">http://www.ssh.org/</a>, la page d'accueil de
ssh.</p>
<p>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.</p>
<h2><a name="s7" id="s7">7. Les applications X avec un
identificateur d'utilisateur (User-id) différent</a></h2>
<p>Supposez que vous vouliez faire tourner un outil graphique de
configuration qui nécessite d'avoir les privilèges du
compte <em>root</em> alors que la session X actuelle se
déroule sous votre compte. Cela peut sembler étrange
au premier abord, mais le serveur X <em>ne</em> permettra
<em>pas</em> à cet outil d'accéder à votre
unité d'affichage. Comment cela est-il possible alors que
<em>root</em> peut normalement tout faire ? Et comment
contourner ce problème ?</p>
<p>Élargissons le propos au cas où l'on veut faire
tourner une application X, sous un identificateur d'utilisateur
<code>clientuser</code>, alors que la session X a été
lancée par <code>serveruser</code>. Si vous avez lu le
paragraphe sur les <em>cookies</em>, il est évident que
<code>clientuser</code> ne peut pas accéder à votre
unité d'affichage :
<code>~clientuser/.Xauthority</code> ne contient pas le cookie
magique qui permet d'accéder à l'unité
d'affichage. Le cookie correct se trouve dans
<code>~serveruser/.Xauthority</code>.</p>
<h2><a name="ss7.1" id="ss7.1">7.1 Plusieurs utilisateurs sur le
même hôte</a></h2>
<p>Naturellement, tout ce qui marche pour un X distant marchera
aussi pour un X à partir d'un identificateur d'utilisateur
différent (particulièrement <code>slogin localhost -l
clientuser</code>). 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 <em>cookie magique</em>.</p>
<p>On supposera que l'on utilise <code>su</code> pour passer d'un
identificateur utilisateur à l'autre. Essentiellement, il
faut écrire un script qui appelle <code>su</code>, mais
enveloppe la commande que <code>su</code> 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 <code>DISPLAY</code> et le transfert du <em>cookie
magique</em>.</p>
<p>L'initialisation de <code>DISPLAY</code> est relativement
facile ; il faut simplement définir
<code>DISPLAY="$DISPLAY"</code> avant d'exécuter l'argument
de la commande su. Donc, il faut simplement faire :</p>
<blockquote>
<pre>
<code>su - clientuser -c "env DISPLAY="$DISPLAY" clientprogram &"
</code>
</pre></blockquote>
<p>Ce n'est pas tout, il faut encore transférer le cookie.
On peut le retrouver en utilisant <code>xauth list
"$DISPLAY"</code>. Cette commande renvoie le cookie dans un format
qui convient pour l'utiliser dans la commande <code>xauth
add</code> : ce dont nous avons justement besoin !</p>
<p>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 <code>su</code>
par l'intermédiaire d'un canal de transmission car
<code>su</code> 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.</p>
<p>Donc, on écrit un script de ce style en le
paramétrant avec <code>clientuser</code> et
<code>clientprogram</code>. 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 :</p>
<blockquote>
<pre>
<code>#!/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>&-"
}
</code>
</pre></blockquote>
<p>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 <code>'$*'</code>, les guillemets simples dans
<code>command</code> vont perturber les guillemets de
l'argument(<code>'$*'</code>) de la commande <code>su</code>. Si
cela entraîne quelque chose de vraiment gênant,
envoyez-moi un courrier électronique.</p>
<p>Nommez le script <code>/usr/local/bin/xsu</code>, et vous pouvez
faire :</p>
<blockquote>
<pre>
<code>xsu clientuser 'command &'
</code>
</pre></blockquote>
<p>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 (<code>sudo</code>), mais ce n'est pas
l'endroit pour en parler.</p>
<p>Le petit script <code>xsu</code> mentionné ci-dessus a
servi comme base pour un script plus étendu appelé
<code>sux</code> qui a, apparemment, trouvé sa place comme
paquet dans la distribution <a href=
"http://www.debian.org/">Debian</a>.</p>
<h2><a name="ss7.2" id="ss7.2">7.2 Root est l'utilisateur
client</a></h2>
<p>É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
<code>~/.Xauthority</code> de tout le monde. Il n'y a pas besoin de
transférer le cookie. Tout ce qu'il y a à faire
consiste à initialiser <code>DISPLAY</code>, et à
faire pointer <code>XAUTHORITY</code> sur
<code>~serveruser/.Xauthority</code>. Donc, vous pouvez
écrire :</p>
<blockquote>
<pre>
<code>su - -c "exec env DISPLAY='$DISPLAY' \
XAUTHORITY='${XAUTHORITY-$HOME/.Xauthority}' \
command"
</code>
</pre></blockquote>
<p>Et, en mettant cela dans un script, cela donne quelque chose
comme </p>
<blockquote>
<pre>
<code>#!/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 '$*'"
</code>
</pre></blockquote>
<p>Nommez le script <code>/usr/local/bin/xroot</code>, et vous
pouvez faire :</p>
<blockquote>
<pre>
<code>xroot 'control-panel &'
</code>
</pre></blockquote>
<p>Cependant, si vous avez déjà initialisé
<code>xsu</code> , il n'y a pas de vraie raison de faire cela.</p>
<h2><a name="s8" id="s8">8. Faire tourner un gestionnaire de
fenêtres distant</a></h2>
<p>Un gestionnaire de fenêtres (comme <code>twm</code>,
<code>wmaker</code>, ou <code>fvwm95</code>) est une application
comme n'importe quelle autre. La procédure normale devrait
fonctionner.</p>
<p>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.</p>
<p>Par manque de chance, beaucoup de scripts de sessions X se
terminent par un</p>
<blockquote>
<pre>
<code>exec le-gestionnaire-de-fenetres-de-votre-choix
</code>
</pre></blockquote>
<p>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.</p>
<p>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 <code>~/.xsession</code>
ou <code>~/.xinitrc</code>) pour arriver à vos fins.</p>
<p>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.</p>
<h2><a name="s9" id="s9">9. Mettre en place un terminal X</a></h2>
<p>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 !</p>
<p>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.</p>
<p>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.</p>
<p>Pour trouver des lectures liées à ce sujet, jetez
un coup d'oeil aux documents suivants :</p>
<ul>
<li>Le <em>petit guide XDM et Terminal X</em> ( <a href=
"http://www.traduc.org/docs/HOWTO/mini/lecture/XDM-Xterm.html">http://www.traduc.org/docs/HOWTO/mini/lecture/XDM-Xterm.html</a>).
Ce document est une description complète de ce qui est
possible avec XDMCP et xdm, appliqué à la
construction de terminaux X. Vous devriez vraiment le lire.</li>
<li>Le <em>guide pratique XDMCP</em> ( <a href=
"http://www.traduc.org/docs/HOWTO/lecture/XDMCP-HOWTO.html">http://www.traduc.org/docs/HOWTO/lecture/XDMCP-HOWTO.html</a>).
Ce document décrit les étapes nécessaires
à la mise en place de xdm pour utiliser des serveurs X
distants, comme depuis un terminal X. La configuration du serveur X
dans une telle situation est décrite de façon plus
succinte.</li>
<li>Le <em>petit guide Xterminal</em> ( <a href=
"http://www.traduc.org/docs/HOWTO/mini/lecture/X-Terminal.html">http://www.traduc.org/docs/HOWTO/mini/lecture/X-Terminal.html</a>).
Il n'est pas actuellement maintenu, mais il peut contenir quelques
informations intéressantes pour vous.</li>
</ul>
<p>À 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.</p>
<h2><a name="ss9.1" id="ss9.1">9.1 Une fois de plus, un peu de
théorie en premier</a></h2>
<p>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.</p>
<p>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 ?</p>
<p>Le programme qui fournit le service XDMCP sur le serveur XDMCP
est <code>xdm</code>. Donc, pour exécuter un terminal X,
vous devez configurer deux programmes : <code>X</code> (le
client XDMCP) sur le terminal X et xdm (le serveur XDMCP) sur
l'hôte distant.</p>
<p>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.
<b>Vous ne devez donc exécuter X à distance que sur
un réseau sécurisé !</b></p>
<h2><a name="ss9.2" id="ss9.2">9.2 Configurer <code>X</code> comme
client XDMCP</a></h2>
<p>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 <em>n'avez pas</em> 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.</p>
<p>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.</p>
<ol>
<li>Si vous connaissez l'hôte qui va vous fournir une
session, utilisez-le directement. Exécutez
<blockquote>
<pre>
<code>X -query sessionhost
</code>
</pre></blockquote>
et, en supposant que <code>xdm</code> fonctionne sur
<code>sessionhost</code>, vous obtiendrez une fenêtre de
connexion et, après connexion, une session X.</li>
<li>Si l'hôte duquel vous obtiendrez la session vous importe
peu, utilisez la méthode d'émission de
multi-diffusion. Exécutez
<blockquote>
<pre>
<code>X -broadcast
</code>
</pre></blockquote>
et, en supposant que <code>xdm</code> 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) <code>xdm</code> qui répond et, après
connexion, une session X.</li>
<li>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
<blockquote>
<pre>
<code>X -indirect xdmcpserver
</code>
</pre></blockquote>
et, en supposant que <code>xdm</code> 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.</li>
</ol>
<p>Il se peut que vous ayez remarqué l'absence de l'option
<code>-auth</code>. 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 <code>~/.Xauthority</code>
après la connexion.</p>
<p>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
<code>-once</code>. Notez que ceci ne semble pas fonctionner avec
l'option <code>-indirect</code> à cause de
l'implémentation du « chooser ».</p>
<p>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
<code>/etc/inittab</code>. Veuillez consulter la documentation de
votre propre distribution pour savoir comment modifier vos scripts
d'amorçage ou <code>/etc/inittab</code>.</p>
<p>N'exécutez <em>pas</em> un serveur X ainsi depuis le
fichier de configuration <code>Xservers</code>. <code>xdm</code>
s'attend à pouvoir se connecter à de tels serveurs et
il pourrait les tuer s'il ne peut pas se connecter.</p>
<h2><a name="ss9.3" id="ss9.3">9.3 Configurer <code>xdm</code>
comme serveur XDMCP</a></h2>
<p>Le programme qui fournit le service XDMCP (le service de
session) est généralement <code>xdm</code>. Il existe
des variantes de celui-ci, comme <code>wdm</code> ou
<code>gdm</code> sur Linux, mais ceux-ci fonctionnent
fondamentalement de la même façon. Assurez-vous donc
que <code>xdm</code> 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, <code>xdm</code> est
déjà installé ; la plupart des
distributions Linux sont ainsi fournis de nos jours.</p>
<p>En plus de <code>xdm</code>, vous aurez besoin des programmes
que vous désirez exécuter dans une session X.
C'est-à-dire, tous les clients X comme <code>xterm</code>,
<code>xfig</code>, <code>xclock</code>, des gestionnaires de
fenêtre et ainsi de suite. Cependant, pour un serveur XDMCP,
vous n'avez <em>pas</em> besoin d'installer de serveur X ; le
serveur X fonctionnera à la place sur le terminal X.</p>
<p>À 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 <em>direct</em> qui consiste
à permettre la connexion d'un client XDMCP et à lui
fournir une session X. Il y a également le service
<em>indirect</em> dans lequel le serveur fournit une liste
d'hôtes fournissant un service direct, au choix pour le
client XDMCP.</p>
<p>Tous les services <code>xdm</code> sont configurés dans
le fichier d'accès, généralement situé
à <code>/etc/X11/xdm/Xaccess</code> ou un emplacement
semblable. Cet emplacement est en fait défini dans le
fichier de configuration général de <code>xdm</code>
<code>/etc/X11/xdm/xdm-config</code> par la ressource
<code>accessFile</code>. Veuillez voir votre manuel
<code>xdm</code> pour l'emplacement par défaut.</p>
<ol>
<li>
<p>Si vous désirez autoriser <code>xdm</code> à
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 <code>Xaccess</code>. En fait, vous pouvez placer un
expression rationnelle correspondant à plusieurs
hôtes. Voici quelques expressions valides :</p>
<blockquote>
<pre>
<code>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é)
</code>
</pre></blockquote>
<p>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.</p>
<p>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é.</p>
<p>Prenez vos propres décisions ici, mais je recommande de
ne pas activer ce service au monde entier à moins d'avoir
une bonne raison.</p>
</li>
<li>
<p>Si vous désirez fournir aux clients XDMCP (<code>X
-indirect xdmcpserver</code>) 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é <code>CHOOSER</code> et la liste des hôtes que
le client peut choisir. À la place de la liste des
hôtes, vous pouvez également spécifier
<code>BROADCAST</code> ; avec ceci, <code>xdm</code>
émet en multi-diffusion sur le réseau pour interroger
les serveurs désirant fournir une session. Des exemples
valides :</p>
<blockquote>
<pre>
<code>xterm023.my.domain CHOOSER seshost1 seshost2
*.my.domain CHOOSER BROADCAST
* CHOOSER extseshost1 extseshost2
</code>
</pre></blockquote>
Le premier exemple permet à <code>xterm023</code> de choisir
entre des sessions sur <code>seshost1</code> et sur
<code>seshost2</code>. Le deuxième exemple permet à
tout hôte dans <code>my.domain</code> de choisir n'importe
quel hôte fournissant une session X. Le troisième
exemple permet à tout hôte de choisir une session
entre <code>extseshost1</code> et <code>extseshost2</code>.
<p>Ce n'est probablement pas une bonne idée de faire <code>*
CHOOSER BROADCAST</code>. 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.</p>
</li>
</ol>
<p>Quand vous avez reconfiguré <code>xdm</code>, envoyez-lui
le signal <code>HUP</code> pour le forcer à relire ses
fichiers de configuration.</p>
<blockquote>
<pre>
<code># kill -HUP pid-of-xdm
#
</code>
</pre></blockquote>
<h2><a name="ss9.4" id="ss9.4">9.4 XDMCP techniquement</a></h2>
<p>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. <code>xdm</code> 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 <code>-once</code> du serveur X ne se combine pas avec
<code>-indirect</code>.</p>
<h2><a name="s10" id="s10">10. Maintenance</a></h2>
<p>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.</p>
<blockquote>
<pre>
<code>xterm Xt error: Can't open display:
</code>
</pre></blockquote>
<p>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 <code>-display</code>. 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 <code>setenv</code> ou <code>export</code> selon votre
shell).</p>
<blockquote>
<pre>
<code>_X11TransSocketINETConnect: Can't connect: errno = 101
xterm Xt error: Can't open display: love.dial.xs4all.nl:0
</code>
</pre></blockquote>
<p>Erreur 101 signifie « Réseau
inaccessible ». L'application n'arrive pas à se
connecter au serveur à travers le réseau.
Vérifiez que la variable <code>DISPLAY</code> 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).</p>
<blockquote>
<pre>
<code>_X11TransSocketINETConnect: Can't connect: errno = 111
xterm Xt error: Can't open display: love.dial.xs4all.nl:0
</code>
</pre></blockquote>
<p>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.</p>
<p>Sinon, il est possible que le serveur X a été
configuré pour <em>ne pas</em> é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
<code>-nolisten tcp</code> et si oui, enlevez-le.</p>
<blockquote>
<pre>
<code>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
</code>
</pre></blockquote>
<p>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).</p>
</body>
</html>
|