home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / mini / Remote-X-Apps < prev    next >
Text File  |  1998-10-01  |  18KB  |  595 lines

  1.   Remote X Apps mini-HOWTO
  2.   Vincent Zweije, zweije@xs4all.nl
  3.   v, 14 July 1998
  4.  
  5.   This mini-HOWTO describes how to run remote X applications.  That is,
  6.   how to have an X program display on a different computer than the one
  7.   it's running on.  Or conversely: how to make an X program run on a
  8.   different computer than the one you're sitting at.  The focus of this
  9.   mini-HOWTO is on security.
  10.   ______________________________________________________________________
  11.  
  12.   Table of Contents
  13.  
  14.  
  15.   1. Introduction
  16.  
  17.   2. Related Reading
  18.  
  19.   3. The Scene
  20.  
  21.   4. A Little Theory
  22.  
  23.   5. Telling the Client
  24.  
  25.   6. Telling the Server
  26.  
  27.      6.1 Xhost
  28.      6.2 Xauth
  29.         6.2.1 Making the Cookie
  30.         6.2.2 Transporting the Cookie
  31.         6.2.3 Using the Cookie
  32.      6.3 Ssh
  33.  
  34.   7. Troubleshooting
  35.  
  36.  
  37.  
  38.   ______________________________________________________________________
  39.  
  40.   1.  Introduction
  41.  
  42.   This mini-HOWTO is a guide how to do remote X applications.  It was
  43.   written for several reasons.
  44.  
  45.   1. Many questions have appeared on usenet on how to run a remote X
  46.      application.
  47.  
  48.   2. I see many, many hints of ``use xhost +hostname'' or even ``xhost
  49.      +'' to allow X connections. This is ridiculously insecure, and
  50.      there are better methods.
  51.  
  52.   3. I do not know of a simple document that describes the options you
  53.      do have. Please inform me zweije@xs4all.nl if you know more.
  54.  
  55.   This document has been written with unix-like systems in mind. If
  56.   either your local or remote operating system are of another flavour,
  57.   you may find here how things work. However, you will have to translate
  58.   examples yourself to apply to your own system(s).
  59.  
  60.   The most recent version of this document is always available on WWW at
  61.   http://www.xs4all.nl/~zweije/xauth.html. It is also available as the
  62.   Linux Remote X Apps mini-HOWTO at
  63.   http://sunsite.unc.edu/LDP/HOWTO/mini/Remote-X-Apps. Linux
  64.   (mini-)HOWTOs are available by http or ftp from sunsite.unc.edu.
  65.  
  66.  
  67.   This is version 0.5.1. No guarantees, only good intentions. I'm open
  68.   to suggestions, ideas, additions, useful pointers, (typo) corrections,
  69.   etc... I want this to remain a simple readable document, though, in
  70.   the best-meant HOWTO style. Flames to /dev/null.
  71.  
  72.   Contents last updated on 14 July 1998 by Vincent Zweije
  73.  
  74.  
  75.   2.  Related Reading
  76.  
  77.   A related document on WWW is ``What to do when Tk says that your
  78.   display is insecure'', http://ce-toolkit.crd.ge.com/tkxauth/. It was
  79.   written by Kevin Kenny. It suggests a similar solution to X
  80.   authentication to that in this document (xauth). However, Kevin aims
  81.   more at using xdm to steer xauth for you.
  82.  
  83.   The X System Window System Vol. 8 X ``Window System Administrator's
  84.   Guide'' from O'Reilly and Associates has also been brought to my
  85.   attention as a good source of information. Unfortunately, I've not
  86.   been able to check it out.
  87.  
  88.   Yet another document much like the one you're reading now, titled
  89.   ``Securing X Windows'', is available at
  90.   http://ciac.llnl.gov/ciac/documents/ciac2316.html.
  91.  
  92.   Also check out usenet newsgroups, such as comp.windows.x,
  93.   comp.os.linux.x, and comp.os.linux.networking.
  94.  
  95.  
  96.   3.  The Scene
  97.  
  98.   You're using two computers. You're using the X window system of the
  99.   first to type to and look at. You're using the second to do some
  100.   important graphical work. You want the second to show its output on
  101.   the display of the first. The X window system makes this possible.
  102.  
  103.   Of course, you need a network connection for this. Preferably a fast
  104.   one; the X protocol is a network hog. But with a little patience and
  105.   suitable protocol compression, you can even run applications over a
  106.   modem. For X protocol compression, you might want to check out dxpc
  107.   http://ccwf.cc.utexas.edu/~zvonler/dxpc/ or LBX
  108.   http://www.ultranet.com/~pauld/faqs/LBX-HOWTO.html
  109.   <http://www.ultranet.com/~pauld/faqs/LBX-HOWTO.html> (also known as
  110.   the LBX mini-HOWTO).
  111.  
  112.   You must do two things to achieve all this:
  113.  
  114.  
  115.   1. Tell the local display (the server) to accept connections from the
  116.      remote computer.
  117.  
  118.   2. Tell the remote application (the client) to direct its output to
  119.      your local display.
  120.  
  121.  
  122.   4.  A Little Theory
  123.  
  124.   The magic word is DISPLAY. In the X window system, a display consists
  125.   (simplified) of a keyboard, a mouse and a screen. A display is managed
  126.   by a server program, known as an X server. The server serves
  127.   displaying capabilities to other programs that connect to it.
  128.  
  129.   A display is indicated with a name, for instance:
  130.  
  131.  
  132.  
  133.   ╖  DISPLAY=light.uni.verse:0
  134.  
  135.   ╖  DISPLAY=localhost:4
  136.  
  137.   ╖  DISPLAY=:0
  138.  
  139.   The display consists of a hostname (such as light.uni.verse and
  140.   localhost), a colon (:), and a sequence number (such as 0 and 4). The
  141.   hostname of the display is the name of the computer where the X server
  142.   runs. An omitted hostname means the local host. The sequence number is
  143.   usually 0 -- it can be varied if there are multiple displays connected
  144.   to one computer.
  145.  
  146.   If you ever come across a display indication with an extra .n attached
  147.   to it, that's the screen number. A display can actually have multiple
  148.   screens. Usually there's only one screen though, with number n=0, so
  149.   that's the default.
  150.  
  151.   Other forms of DISPLAY exist, but the above will do for our purposes.
  152.  
  153.  
  154.   5.  Telling the Client
  155.  
  156.   The client program (for instance, your graphics application) knows
  157.   which display to connect to by inspecting the DISPLAY environment
  158.   variable. This setting can be overridden, though, by giving the client
  159.   the command line argument -display hostname:0 when it's started. Some
  160.   examples may clarify things.
  161.  
  162.   Our computer is known to the outside as light, and we're in domain
  163.   uni.verse. If we're running a normal X server, the display is known as
  164.   light.uni.verse:0. We want to run the drawing program xfig on a remote
  165.   computer, called dark.matt.er, and display its output here on light.
  166.  
  167.   Suppose you have already telnetted into the remote computer,
  168.   dark.matt.er.
  169.  
  170.   If you have csh running on the remote computer:
  171.  
  172.  
  173.  
  174.        dark% setenv DISPLAY light.uni.verse:0
  175.        dark% xfig &
  176.  
  177.  
  178.  
  179.  
  180.   or alternatively:
  181.  
  182.  
  183.  
  184.        dark% xfig -display light.uni.verse:0 &
  185.  
  186.  
  187.  
  188.  
  189.   If you have sh running on the remote computer:
  190.  
  191.  
  192.  
  193.        dark$ DISPLAY=light.uni.verse:0
  194.        dark$ export DISPLAY
  195.        dark$ xfig &
  196.  
  197.  
  198.  
  199.   or, alternatively:
  200.  
  201.  
  202.  
  203.        dark$ DISPLAY=light.uni.verse:0 xfig &
  204.  
  205.  
  206.  
  207.  
  208.   or, of course, also:
  209.  
  210.  
  211.  
  212.        dark$ xfig -display light.uni.verse:0 &
  213.  
  214.  
  215.  
  216.  
  217.   It seems that some versions of telnet automatically transport the
  218.   DISPLAY variable to the remote host. If you have one of those, you're
  219.   lucky, and you don't have to set it by hand. If not, most versions of
  220.   telnet do transport the TERM environment variable; with some judicious
  221.   hacking it is possible to piggyback the DISPLAY variable on to the
  222.   TERM variable.
  223.  
  224.   The idea with piggybacking is that you do some scripting to achieve
  225.   the following: before telnetting, attach the value of DISPLAY to TERM.
  226.   Then telnet out.  At the remote end, in the applicable .*shrc file,
  227.   read the value of DISPLAY from TERM.
  228.  
  229.  
  230.   6.  Telling the Server
  231.  
  232.   The server will not accept connections from just anywhere. You don't
  233.   want everyone to be able to display windows on your screen. Or read
  234.   what you type -- remember that your keyboard is part of your display!
  235.  
  236.   Too few people seem to realise that allowing access to your display
  237.   poses a security risk. Someone with access to your display can read
  238.   and write your screens, read your keystrokes, and read your mouse
  239.   actions.
  240.  
  241.   Most servers know two ways of authenticating connections to it: the
  242.   host list mechanism (xhost) and the magic cookie mechanism (xauth).
  243.   Then there is ssh, the secure shell, that can forward X connections.
  244.  
  245.  
  246.   6.1.  Xhost
  247.  
  248.   Xhost allows access based on hostnames. The server maintains a list of
  249.   hosts which are allowed to connect to it. It can also disable host
  250.   checking entirely. Beware: this means no checks are done, so every
  251.   host may connect!
  252.  
  253.   You can control the server's host list with the xhost program. To use
  254.   this mechanism in the previous example, do:
  255.  
  256.  
  257.  
  258.        light$ xhost +dark.matt.er
  259.  
  260.  
  261.  
  262.  
  263.   This allows all connections from host dark.matt.er. As soon as your X
  264.   client has made its connection and displays a window, for safety,
  265.   revoke permissions for more connections with:
  266.  
  267.  
  268.  
  269.        light$ xhost -dark.matt.er
  270.  
  271.  
  272.  
  273.  
  274.   You can disable host checking with:
  275.  
  276.  
  277.  
  278.        light$ xhost +
  279.  
  280.  
  281.  
  282.  
  283.   This disables host access checking and thus allows everyone to
  284.   connect. You should never do this on a network on which you don't
  285.   trust all users (such as Internet). You can re-enable host checking
  286.   with:
  287.  
  288.  
  289.  
  290.        light$ xhost -
  291.  
  292.  
  293.  
  294.  
  295.   xhost - by itself does not remove all hosts from the access list (that
  296.   would be quite useless - you wouldn't be able to connect from
  297.   anywhere, not even your local host).
  298.  
  299.   Xhost is a very insecure mechanism. It does not distinguish between
  300.   different users on the remote host. Also, hostnames (addresses
  301.   actually) can be spoofed. This is bad if you're on an untrusted
  302.   network (for instance already with dialup PPP access to Internet).
  303.  
  304.  
  305.   6.2.  Xauth
  306.  
  307.   Xauth allows access to anyone who knows the right secret. Such a
  308.   secret is called an authorization record, or a magic cookie. This
  309.   authorization scheme is formally called MIT-MAGIC-COOKIE-1.
  310.  
  311.   The cookies for different displays are stored together in
  312.   ~/.Xauthority.  Your ~/.Xauthority must be inaccessible for
  313.   group/other users.  The xauth program manages these cookies, hence the
  314.   nickname xauth for the scheme.
  315.  
  316.   On starting a session, the server reads a cookie from the file that is
  317.   indicated by the -auth argument. After that, the server only allows
  318.   connections from clients that know the same cookie. When the cookie in
  319.   ~/.Xauthority changes, the server will not pick up the change.
  320.  
  321.   Newer servers can generate cookies on the fly for clients that ask for
  322.   it. Cookies are still kept inside the server though; the don't end up
  323.   in ~/.Xauthority unless a client puts them there. According to David
  324.   Wiggins:
  325.  
  326.  
  327.        A further wrinkle was added in X11R6.3 that you may be
  328.        interested in. Via the new SECURITY extension, the X server
  329.        itself can generate and return new cookies on the fly. Fur¡
  330.        thermore, the cookies can be designated ``untrusted'' so
  331.   that applications making connections with such cookies will
  332.   be restricted in their operation. For example, they won't be
  333.   able to steal keyboard/mouse input, or window contents, from
  334.   other trusted clients. There is a new ``generate'' subcom¡
  335.   mand to xauth to make this facility at least possible to
  336.   use, if not easy.
  337.  
  338.  
  339.   Xauth has a clear security advantage over xhost. You can limit access
  340.   to specific users on specific computers. It does not suffer from
  341.   spoofed addresses as xhost does. And if you want to, you can still use
  342.   xhost next to it to allow connections.
  343.  
  344.  
  345.   6.2.1.  Making the Cookie
  346.  
  347.   If you want to use xauth, you must start the X server with the -auth
  348.   authfile argument. If you use the startx script, that's the right
  349.   place to do it. Create the authorization record as below in your
  350.   startx script.
  351.  
  352.   Excerpt from /usr/X11R6/bin/startx:
  353.  
  354.  
  355.  
  356.        mcookie|sed -e 's/^/add :0 . /'|xauth -q
  357.        xinit -- -auth "$HOME/.Xauthority"
  358.  
  359.  
  360.  
  361.  
  362.   Mcookie is a tiny program in the util-linux package, primary site
  363.   ftp://ftp.math.uio.no/pub/linux/.  Alternatively, you can use md5sum
  364.   to massage some random data (from, for instance, /dev/urandom or ps
  365.   -axl) into cookie format:
  366.  
  367.  
  368.  
  369.        dd if=/dev/urandom count=1|md5sum|sed -e 's/^/add :0 . /'|xauth -q
  370.        xinit -- -auth "$HOME/.Xauthority"
  371.  
  372.  
  373.  
  374.  
  375.   If you can't edit the startx script (because you aren't root), get
  376.   your system administrator to set up startx properly, or let him set up
  377.   xdm instead. If he can't or won't, you can make a ~/.xserverrc script.
  378.   If you have this script, it is run by xinit instead of the real X
  379.   server. Then you can start the real X server from this script with the
  380.   proper arguments. To do so, have your ~/.xserverrc use the magic
  381.   cookie line above to create a cookie and then exec the real X server:
  382.  
  383.  
  384.  
  385.        #!/bin/sh
  386.        mcookie|sed -e 's/^/add :0 . /'|xauth -q
  387.        exec /usr/X11R6/bin/X "$@" -auth "$HOME/.Xauthority"
  388.  
  389.  
  390.  
  391.  
  392.   If you use xdm to manage your X sessions, you can use xauth easily.
  393.   Define the DisplayManager.authDir resource in /etc/X11/xdm/xdm-config.
  394.   Xdm will pass the -auth argument to the X server when it starts.  When
  395.   you then log in under xdm, xdm puts the cookie in your ~/.Xauthority
  396.   for you.  See xdm(1) for more information. For instance, my
  397.   /etc/X11/xdm/xdm-config has the following line in it:
  398.  
  399.  
  400.  
  401.        DisplayManager.authDir: /var/lib/xdm
  402.  
  403.  
  404.  
  405.  
  406.  
  407.   6.2.2.  Transporting the Cookie
  408.  
  409.   Now that you have started your X session on the server host
  410.   light.uni.verse and have your cookie in ~/.Xauthority, you will have
  411.   to transfer the cookie to the client host, dark.matt.er.
  412.  
  413.   The easiest is when your home directories on light and dark are
  414.   shared. The ~/.Xauthority files are the same, so the cookie is
  415.   transported instantaneously.  However, there's a catch: when you put a
  416.   cookie for :0 in ~/.Xauthority, dark will think it's a cookie for
  417.   itself instead of for light.  You must use an explicit host name when
  418.   you create the cookie; you can't leave it out.  You can install the
  419.   same cookie for both :0 and light:0 with:
  420.  
  421.  
  422.  
  423.        #!/bin/sh
  424.        cookie=`mcookie`
  425.        xauth add :0 . $cookie
  426.        xauth add "$HOST:0" . $cookie
  427.        exec /usr/X11R6/bin/X "$@" -auth "$HOME/.Xauthority"
  428.  
  429.  
  430.  
  431.  
  432.   If the home directories aren't shared, you can transport the cookie by
  433.   means of rsh, the remote shell:
  434.  
  435.  
  436.  
  437.        light$ xauth nlist :0 | rsh dark.matt.er xauth nmerge -
  438.  
  439.  
  440.  
  441.  
  442.  
  443.   1. Extract the cookie from your local ~/.Xauthority (xauth nlist :0).
  444.  
  445.   2. Transfer it to dark.matt.er (| rsh dark.matt.er).
  446.  
  447.   3. Put it in the ~/.Xauthority there (xauth nmerge -).
  448.  
  449.   It's possible that rsh doesn't work for you. Besides that, rsh also
  450.   has a security drawback (spoofed host names again, if I remember
  451.   correctly). If you can't or don't want to use rsh, you can also
  452.   transfer the cookie manually, like:
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.   light$ echo $DISPLAY
  464.   :0
  465.   light$ xauth list $DISPLAY
  466.   light/unix:0 MIT-MAGIC-COOKIE-1 076aaecfd370fd2af6bb9f5550b26926
  467.   light$ rlogin dark.matt.er
  468.   Password:
  469.   dark% setenv DISPLAY light.uni.verse:0
  470.   dark% xauth add $DISPLAY . 076aaecfd370fd2af6bb9f5550b26926
  471.   dark% xfig &
  472.   [15332]
  473.   dark% logout
  474.   light$
  475.  
  476.  
  477.  
  478.  
  479.   See also rsh(1) and xauth(1x) for more information.
  480.  
  481.   It may be possible to piggyback the cookie on the TERM or DISPLAY
  482.   variable when you do a telnet to the remote host.  This would go the
  483.   same way as piggybacking the DISPLAY variable on the TERM variable.
  484.   See section 5: Telling the Client.  You're on own here from my point
  485.   of view, but I'm interested if anyone can confirm or deny this.
  486.  
  487.  
  488.   6.2.3.  Using the Cookie
  489.  
  490.   An X application on dark.matt.er, such as xfig above, will
  491.   automatically look in ~/.Xauthority there for the cookie to
  492.   authenticate itself with.
  493.  
  494.  
  495.   6.3.  Ssh
  496.  
  497.   Authority records are transmitted with no encryption. If you're even
  498.   worried someone might snoop on your connections, use ssh, the secure
  499.   shell. It will do X forwarding over encrypted connections. And
  500.   besides, it's great in other ways too. It's a good structural
  501.   improvement to your system. Just visit http://www.cs.hut.fi/ssh/, the
  502.   ssh home page.
  503.  
  504.   Who knows anything else on authentication schemes or encrypting X
  505.   connections? Maybe kerberos?
  506.  
  507.  
  508.   7.  Troubleshooting
  509.  
  510.   The first time you try to run a remote X application, it usually does
  511.   not work. Here are a few common error messages, their probable causes,
  512.   and solutions to help you on your way.
  513.  
  514.  
  515.  
  516.        xterm Xt error: Can't open display:
  517.  
  518.  
  519.  
  520.  
  521.   There is no DISPLAY variable in the environment, and you didn't tell
  522.   the application with the -display flag either. The application assumes
  523.   the empty string, but that is syntactically invalid. To solve this, be
  524.   sure that you set the DISPLAY variable correctly in the environment
  525.   (with setenv or export depending on your shell).
  526.  
  527.  
  528.  
  529.   _X11TransSocketINETConnect: Can't connect: errno = 101
  530.   xterm Xt error: Can't open display: love.dial.xs4all.nl:0
  531.  
  532.  
  533.  
  534.  
  535.   Errno 101 is ``Network is unreachable''.  The application could not
  536.   make a network connection to the server.  Check that you have the
  537.   correct DISPLAY set, and that the server machine is reachable from
  538.   your client (it should be, after all you're probably logged in to the
  539.   server and telnetting to the client).
  540.  
  541.  
  542.  
  543.        _X11TransSocketINETConnect: Can't connect: errno = 111
  544.        xterm Xt error: Can't open display: love.dial.xs4all.nl:0
  545.  
  546.  
  547.  
  548.  
  549.   Errno 111 is ``Connection refused''.  The server machine you're trying
  550.   to connect to is reachable, but the indicated server does not exist
  551.   there. Check that you are using the right host name and the right
  552.   display number.
  553.  
  554.  
  555.  
  556.        Xlib: connection to ":0.0" refused by server
  557.        Xlib: Client is not authorized to connect to Server
  558.        xterm Xt error: Can't open display: love.dial.xs4all.nl:0.0
  559.  
  560.  
  561.  
  562.  
  563.   The client could make a connection to the server, but the server does
  564.   not allow the client to use it (not authorized). Make sure that you
  565.   have transported the correct magic cookie to the client, and that it
  566.   has not expired (the server uses a new cookie when a new session
  567.   starts).
  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.