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-config Este 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
Xservers Una 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.
XDMCP El 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 pantalla Este 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 .
|