| Introducción
El objeto  de este artículo  es la instalación  y uso del  gestor de
pantalla X (X  Display Manager).  El gestor  de pantallas se ejecuta como
un demonio  en una  máquina y  gestiona  múltiples pantallas  X (tanto
remotas como  locales) ofreciendo una  gestión   básica al usuario  de
forma análoga  a como  lo   hacen init(8),  getty(1)   y
login(1) sobre terminales  de texto. También  ofrece utilidades
para  limpiar las pantallas   sobre las que ya no   hay un servidor  X
ejecutándose. Una de las características  más valiosas  del xdm es  su
habilidad   para  generar información de    autorización que puede ser
utilizada por el   servidor X para controlar   el acceso al  nivel  de
máquina   y usuario.  Gracias  a su  capacidad para relanzar sesiones X
utilizando técnicas  estándar de   autentificación,  xdm es  ideal  en
lugares donde una   máquina   es compartida por    múltiples  usuarios
ejecutando sesiones X individuales y personalizadas. Contenidos 
 
Aunque  aquí  sólo trataremos el tema   de la autorización (seguridad)
bajo xdm, la seguridad en X Window es en sí mismo un tema de
interés y será tratado con mayor profundidad en el próximo número.  Si
sólo estas interesado en ejecutar xdm sobre una máquina aislada puedes
saltarte la    sección     XDMCP ya que probablemente  tienes un setup
perfectamente pulido y fácil de instalar con tu distribución de Linux.
Si  este es el    caso, seguramente  puedes  pasar  las   secciones de
personalización y  de   puesta en  marcha del XDM   pues el  resto del
artículo trata principalmente con  entornos  de red e interacción  con
terminales X. También, si estás buscando un libro de la A a la Z sobre
instalación de terminales  X, te sugiero  el libro "The X Window
System Administrators Guide" de  O' Reilly & Associates, pues
aborda detalles de administración de  terminales X que están más  allá
del ámbito de este artículo.
 Gestión de sesiones bajo X 
En una conexión tradicional una sesión es un  shell de login, bajo xdm
una sesión se  controla por un gestor  de sesión arbitrario; porque en
un  entorno  de ventanas   un shell   de  login de   usuario  no tiene
necesariamente  un   programa   al    estilo  terminal  con     el que
conectarse.  Para la gestión de sesiones  en el entorno de ventanas X
nosotros    utilizamos el gestor   de ventanas  (window manager) como
"gestor de sesiones" y  cuando el proceso gestor de ventanas
termina, también lo hace la sesión del usuario.
 XDM, conceptos básicos 
xdm  es un Xclient que gestiona  la entrada y  salida de una conexión,
controla y coordina la sesión un usuario.  Xdm mantiene un registro de
qué  servidores X hay disponibles  para  conectarse leyendo el fichero
Xservers y escuchando el puerto  XDMCP para gestionar otros servidores
que lo pidan. Cuando al xdm se le da la gestión de un servidor X envía
una  ventana de login a la pantalla del servidor y espera la entrada de
algún usuario.  En cuanto que  un usuario introduce  su nombre y clave
(pasword) son verificados  utilizando  los mismos mecanismos  que  una
conexión estándar tty (consola de texto).  Luego xdm ejecuta una serie
de  guiones de shell (shell scripts)  que ponen en marcha los Xclients
que el usuario  prefiere. Ahora está en marcha   una sesión X  normal,
cuando el usuario se desconecte  de esta sesión,  xdm cierra todas las
conexiones y devuelve   la terminal al estado   de espera de  conexión
(login), listo para una nueva sesión. ¿Porqué utilizar XDM?
A pesar de las  características  de seguridad, uso  remoto  y facilidad,
xinit está considerado obsoleto por el X Consortium (ahora denominado The   Open   Group) con todas las
nuevas funcionalidades que  se han añadido  a xdm. Xdm ofrece una forma
de configurar  todo el entorno  del sistema a los administradores. Xdm
es también la única forma que conozco  de compartir la pantalla de una
máquina  entre  varios usuarios sin  tener  que matar y re-ejecutar el
servidor X.
 Configuración
Xdm se configura mediante ficheros ASCII estándar. Sus ficheros globales de
configuración se encuentran tradicionalmente en  /usr/lib/X11/xdm/etc/xdm mientras que los ficheros locales se encuentran en 
el directorio de trabajo (home) de cada usuario. De especial
importancia es el hecho de que en el fichero xmd-config se puede
indicar una localización diferente para todos los otros ficheros e
incluso su propia localización en el disco puede especificarse
explícitamente cuando se ejecuta xdm utilizando el parámetro
-config, por tanto sistemas con una instalación automatizada
pueden fácilmente modificarse para dejar la instalación original tal
cual. A continuación hay una pequeña descripción de cada fichero junto 
con un ejemplo comentado (cuando sea apropiado). Ficheros globales 
xdm-configEste fichero  especifica la ubicación de  todos  los demás ficheros de
configuración (si están situados en otros  directorios distintos a los
por defecto) y establece los  comandos para el setup, arranque, parada
y guión inicial del  xdm. En el ejemplo que   sigue se especifica  que
todos    los ficheros  adicionales       han  de ser    cargados  bajo
/etc/X11/xdm de forma que queden  los ficheros por defecto de
/usr/lib/X11/xdm sin modificar. 
DisplayManager.errorLogFile: /var/log/xdm-error.log
DisplayManager.pidFile: /var/run/xdm.pid
DisplayManager.keyFile: /etc/X11/xdm/xdm-keys
DisplayManager.servers: /etc/X11/xdm/Xservers
DisplayManager.accessFile: /etc/X11/xdm/Xaccess
DisplayManager._0.authorize: true
DisplayManager._1.authorize: true
DisplayManager._0.setup: /etc/X11/xdm/Xsetup_0
DisplayManager._0.startup: /etc/X11/xdm/GiveConsole
DisplayManager._0.reset: /etc/X11/xdm/TakeConsole
DisplayManager*resources: /etc/X11/xdm/Xresources
DisplayManager*session: /etc/X11/xdm/Xsession
DisplayManager*authComplain: false
 XserversUna lista de servidores que pueden ser gestionados por xdm. Por lo
menos este fichero debería incluir el servidor local. NOTA - este
fichero sólo se vuelve a leer después de terminar una sesión o
si xdm recibe la señal SIGHUP. Para enviar la señal SIGHUP a el xdm
debes conocer su número de PID del proceso. 
#  ps -a   |  grep  xdm
2639 ?  R 0:09     /usr/bin/X11/xdm
# kill -9 2639
Aquí puede ver un ejemplo del fichero Xservers utilizado en una
máquina aislada... 
# Primera línea debe ser el display local.
:0 local /usr/X11R6/bin/X
# :0 Especifíca consola
# local denota el servidor X está ejecutándose localmente 
# /usr/X11R6/bin/X ejecutable ejecutado al arrancar
# la sintaxis para el terminal X es un poco diferente
# pues ellos ejecutan el servidor X desde otra máquina
# SOLO pon terminales X si NO soportan XDMCP
eng1:0 foreign NCD xterminal
# eng1 es el nombre de la terminal
# :0 es el display a utilizar en la terminal
# foreign significa que el servidor X está ejecutándose en 
# una máquina distinta 
# NCD xterminal es la clase display específica de esta terminal
# y no son absolutamente necesarios.
eng2:0 foreign NCD xterminal
eng3:0 foreign Visual xterminal
 Xsession 
Guión inicial de puesta en marcha utilizado por cada sesión X.
 
#!/bin/sh
# la siguiente sección habilita la conexión segura cuando sea necesario
# utilizando  después del password activa el modo seguro
case $# in
1)
case $1 in
failsafe)
exec xterm -geometry 80x24-0-0
;;
esac
esac
# re-dirigir errores al fichero en el directorio home del usuario 
for errfile in "$HOME/.xsession-errors" "${TMPDIR-/tmp}/xses-$USER"
"/tmp/xses-$USER"
do
if ( cp /dev/null "$errfile" 2> /dev/null )
then
chmod 600 "$errfile"
exec > "$errfile" 2>&1
break
fi
done
# Utiliza los ficheros locales .xsession y .Xresources  si existen
startup=$HOME/.xsession
resources=$HOME/.Xresources
if [ -x "$startup" ]; then
exec "$startup"
elif [ -x "$HOME/.Xclients" ]; then
exec "$HOME/.Xclients"
elif [ -x /etc/X11/xinit/Xclients ]; then
exec /etc/X11/xinit/Xclients
else
if [ -f "$resources" ]; then
xrdb -load "$resources"
fi
exec xsm
fi
 Xresources 
 
Define los recursos que se cargarán vía xrdb(1) por todos los
servidores gestionados  por xdm.
 
# key settings to be used by Xlogin widget 
xlogin*login.translations: #override\
# Ctrl R stops xdm from managing display 
CtrlR: abort-display()\n\
# F1 or Ctrl Return run a failsafe session
# consisting of a single xterm window
F1: set-session-argument(failsafe) finish-field()\n\
CtrlReturn: set-session-argument(failsafe) finish-field()\n\
Return: set-session-argument() finish-field()
# display setings for Xlogin widget to be displayed by xdm
xlogin*borderWidth: 3
xlogin*greeting: CLIENTHOST
xlogin*namePrompt: login:\040
xlogin*fail: Sorry Try Again
#ifdef COLOR
xlogin*greetColor: CadetBlue
xlogin*failColor: red
*Foreground: black
*Background: #fffff0
#else
xlogin*Foreground: black
xlogin*Background: white
#endif
# settings for xconsole client which is used when xdm connection on
# local server is initialized. This keeps console messages sent
between
# logins from going everywhere across the screen
XConsole.text.geometry: 480x130
XConsole.verbose: true
XConsole*iconic: true
XConsole*font: fixed
Chooser*geometry: 700x500+300+200
Chooser*allowShellResize: false
Chooser*viewport.forceBars: true
Chooser*label.font: *-new century schoolbook-bold-i-normal-*-240-*
Chooser*label.label: XDMCP Host Menu from CLIENTHOST
Chooser*list.font: -*-*-medium-r-normal-*-*-230-*-*-c-*-iso8859-1
Chooser*Command.font: *-new century schoolbook-bold-r-normal-*-180-*
 xdm-pid 
Fichero que contiene el identificador (pid) del proceso xdm (sólo como 
información, no lo edites).
 xdm-errors 
Fichero de registro (log) de los errores del xdm.
 Xaccess 
Configura el control de acceso para XDMCP (X11R5 y posteriores). Este
fichero sólo define los permisos de acceso para consultas XDMCP . Este 
fichero también permite definir macros para agrupar lógicamente
máquinas relacionadas. El Control de acceso del servidor se activa
utilizando el recurso DisplayManager*authorize  en el
fichero xdm-config. Para más información sobre configuración
de XDMCP  y ejemplos ver la sección CHOOSER.
 GiveConsole 
Es un guión de  shell utilizado para  cambiar la propiedad de  la consola
del usuario. A no ser que tengas muy buenas razones, deja este guión
y el de takeconsole como están por defecto (que  son los que se
muestran a continuación):
 
#!/bin/sh
# Assign ownership of the console to the invoking user
# $XConsortium: GiveConsole,v 1.2 93/09/28 14:29:20 gildea Exp $
#
# By convention, both xconsole and xterm -C check that the
# console is owned by the invoking user and is readable before attaching
# the console output. This way a random user can invoke xterm -C without
# causing serious grief.
#
chown $USER /dev/console
 TakeConsole 
Un guión de shell que devuelve  la propiedad de la consola a "root"
(X11R5 y posteriores). Otra vez, deja este fichero tranquilo.
 
#!/bin/sh
# Reassign ownership of the console to root, this should disallow
# assignment of console output to any random users's xterm
# $XConsortium: TakeConsole,v 1.2 93/09/28 14:30:29 
#
chmod 622 /dev/console
chown root /dev/console
 Xsetup_0 
Guión shell  utilizado para inicializar la pantalla de la consola
local (X11R5 o posteriores). Inicializa la xconsole: una
terminal en ventana que muestra los mensajes del sistema que se
producen entre conexiones (logins).
 
#!/bin/sh
# $XConsortium: Xsetup_0,v 1.3 93/09/28 14:30:31 
/usr/X11R6/bin/xconsole -geometry 480x130-0-0 -daemon -notify
-verbose -fn fixed -exitOnFail 
 Ficheros Locales ~/.xsession 
Recursos específicos de cada usuario leidos por el guión global
Xsesion.
 ~/.xsession-errors Fichero de registro para los errores de cada usuario. ~/.Xauthority Contiene información de autorización del usuario. XDMCPEl X Display Manager Control  Protocol (XDMCP) fue primero introducido
en la  versión  X11R4  para resolver   varios  problemas entre  xdm  y
terminales X. Antes del XDMCP la única  forma que xdm tenía de conocer
qué  servidores   había    disponibles  era    leyendo    el   fichero
Xservers. Puesto que el fichero  Xservers solo se lee al
arrancar xdm, aparecían problemas  cuando  terminales X se apagaban  y
volvían  a enchufar. Básicamente,    cada vez que   una terminal  X se
conectaba (se ponía en marcha) después de estar apagada, era necesario
que el   Administrador del sistema forzara  xdm  a re-leer  el fichero
Xservers enviándole la señal SIGHUP. 
XDMCP permite que los servidores hablen con xdm sin tener éste  un
conocimiento explícito previo del servidor. Bajo XDMCP, la máquina
escucha peticiones (en cualquiera de los tres diferentes formas de
comunicación soportados) en un puerto XDMCP y cuando recibe unas
peticiones de gestión, crea una copia de él mismo  (spawns) y envía la 
pantalla de conexión a esa terminal.
 Modos de comunicación 
XDMCP  permite  utilizar  tres modos   de  comunicación con servidores
pidiendo gestión que no aparecen  en el fichero Xservers; estos
métodos son:  DIRECT, INDIRECT   o  BROADCAST. En  el  modo  DIRECT un
servidor está  haciendo  una petición no   específica de gestión  a la
red. El  primer  proceso xdm  que  responda  esta  petición DIRECT  se
convierte en el gestor del servidor. Una  petición INDIRECT resulta en
que la terminal  recibe una ventana con  la  lista de todas las  máquinas
disponibles para conectarse y te permite al usuario elegir qué máquina
le ofrece la  gestión. El modo  INDIRECT  es especialmente  útil en un
entorno con múltiples máquinas.  Para implementar el modelo INDIRECT  se
necesita  utilizar el   identificador CHOOSER   en el  fichero  de
recursos Xaccess.  Otra forma  de  implementar la  elección  es
utilizando el modo BROADCAST en  conjunción con el recurso CHOOSER, el
cual envía un  mensaje de BROADCAST  a todas las  máquinas de la red y
permite al usuario elegir entre ellas.
 Chooser 
Cuando se utilizan terminales X que no ofrecen un menú de máquinas el
arrancar el programa de elección puede ser utilizado junto con los
BROADCAST o INDIRECT. Para activar el programa de elección utiliza
CHOOSER como primera entrada en la lista de máquinas indirectas del
fichero Xaccess.
modos 
 
eng*.odhs.dsd.com CHOOSER BROADCAST
 
Esto  permite que todas las  terminales que comiencen por "eng" de odhs.dsd.com
utilicen   una ventana de selección  listando   todos las otras  máquinas
disponibles.  Un    escenario probable  sería  aquel en el que todas las
terminales del departamento de ingeniería tuvieran un conjunto de
máquinas a las cuales pueden conectarse, lo cual puede hacerse mejor
con el modo INDIRECT.
 
eng*.odhs.dsd.com CHOOSER dsdapps.odhs.dsd.com dbsrv.odhs.dsd.com
test.odhs.dsd.com
 
La anterior asignación permitirá a todos los terminales del
departamento de ingeniería  acceder a la aplicación, base de datos y
testear los servidores vía un menú de elección. 
El fichero Xaccess también te  permitirá definir macros para
agrupar lógicamente máquinas relacionadas. El siguiente ejemplo
utiliza estas macros con las asignaciones anteriores.
 
%ENGHOSTS dsdapps.odhs.dsd.com dbsrv.odhs.dsd.com test.odhs.dsd.com
eng*.odhs.dsd.com CHOOSER %ENGHOSTS
 
El aspecto del selector (para elegir) puede ser modificado a través
del fichero(s) Xresources.
 Ejecutando XDM
Para verificar que tu xdm se ejecuta sin necesidad de re-arrancar la
máquina, desde la consola ejecuta:
 
$  init 5
Esto normalmente lanzará el sistema al nivel 5. Xdm se ejecuta
automáticamente cuando el sistema entra en el nivel 5. Si cambiando al 
nivel 5 no arranca el xdm mira /etc/inittab, en este fichero
se especifica en qué nivel se arranca xdm (las distribuciones de
slackware  lo arrancan algunas veces en el nivel 4, pero la mayoría de 
las distribuciones lo hacen en el nivel 5). Ahora deberías ver la
ventana de xlogin pidiendo un nombre de cuenta y la clave asociada y
ser capaz de conectarte y comprobar varias opciones. Si estás seguro
que el sistema está en el nivel correcto de arranque de xdm pero no responde
como debería, échale un vistazo a la sección de problemas más adelante. En caso
contrario, desde este punto puedes jugar con cada una de las opciones 
(mira la sección de presonalización más adelante). Una vez tengas el
xdm configurado, puedes modificar /etc/inittab para cambiar el nivel
de arranque por defecto. En mi máquina es tan sencillo como cambiar: 
#/etc/inittab
id:3:initdefault:
por 
id:5:initdefault: 
 
Esto inicia a Linux en el nivel de arranque 5 por defecto, que a su
vez, automáticamente arranca xdm cada vez que el sistema arranca. 
 Resolviendo problemas 
Si xdm no funciona como es de esperar, el primer lugar donde mirar es
~/.xsession-errors. Este fichero local de errores contiene los
errores producidos solamente cuando has accedido a tu cuenta y es por tanto más
específico que los errores del sistema. Abajo, he esbozado algunos de
las potenciales pifias y sus potenciales soluciones.
 La ventana de conexión (login) no aparece en la
pantallaEste es muy probablemente un error en los ficheros de configuración,
¿Estás intentándolo antes de cambiar el nivel de arranque del sistema? Puedes conectarte con éxito y la ventana de
conexión desaparece 
Tu fichero .xsesion puede que no sea ejecutable. Intenta
conectarte, pero pulsa CTRL-RETURN después de la palabra clave
en lugar de Enter. Esto pasará por alto el guión
.xsesion y te dará un terminal simple en una ventana desde la
que puedes:
 
# chmod +x .xsession
e inténtalo otra vez. Después de conectarte, la pantalla parpadea y 
la ventana de conexión (login) vuelve a aparecer. 
Emplea el método descrito en el escenario anterior para saltarte el
fichero .xsesion durante la conexión y asegúrate que el último
comando  de  .xsesion se ejecuta en segundo plano (background).
 Conclusión
Espero que este artículo te haya convencido de la potencia y
flexibilidad de X Display Manager. Si lo que buscas es más información
sobre xdm por favor mira los enlaces que hay al final. En la siguiente 
entrega, investigaremos en el, a menudo olvidado, tema de la seguridad en 
X Window. No dudes en enviarme un mail si tienes dudas o algún
comentario a jmccarty@theshop.net.
 |