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 jmccarty@theshop.net.
|