Xdm, de beeldschermbeheerder

ArticleCategory:

System Administration

AuthorImage:

[Photo of the Author]

TranslationInfo:

original in en Joel McCarty

en to nl Tom Uijldert

AboutTheAuthor:

Niets te melden.

Abstract:

Dit artikel gaat in op het instellen en gebruiken van de X display manager. Dit programma draait in de achtergrond op een machine (daemon) en beheert van daaruit meerdere X-schermen (hetzij lokaal, hetzij op afstand) waarmee het basisfunctionaliteit biedt voor het afhandelen van interactie met gebruikers. Daarbij kunnen we denken aan functionaliteit als in init(8), getty(1) en login(1). Tevens heeft xdm faciliteiten voor het opruimen van schermen waarop niet langer een X-server draait.

De meest waardevolle functionaliteit zit echter in het feit dat xdm autorisatie- informatie aan kan leveren die vervolgens door een X-server kan worden gebruikt voor het regelen van toegang tot systemen. Door z'n vermogen X login-sessies af te starten met daarin de standaard verificatie-technieken is xdm ideaal voor toepassing op een machine die door meerdere gebruikers wordt gedeeld.

ArticleIllustration:

[Illustratie]

ArticleBody:

Onderwerp

Hoewel dit artikel kort zal ingaan op het autorisatie-mechanisme van xdm is het onderwerp "beveiliging onder X" dermate uitgebreid dat dit een apart artikel waard is in het nummer van volgende maand. Als je alleen geïnteresseerd bent in het draaien van xdm op jouw machine dan kun je het gedeelte over XDMCP waarschijnlijk wel overslaan daar je distributie een bruikbare instelling zal hebben om direct te beginnen. Als dit inderdaad het geval is dan kun je toe met het bekijken van de instellingen en gewoon xdm draaien, de rest van dit artikel gaat in op netwerkomgevingen en de interactie met X-terminals.

Als je op zoek bent naar recepten voor het beheren van complete X-omgevingen dan raad ik het boek "The X Window System Administrators Guide" aan van O'Reilly & Associates. Dit boek gaat in detail in op het beheer en ligt buiten het onderwerp voor dit artikel.

Sessies beheren onder X

Bij de klassieke tty-login bestaat de sessie uit de login-shell van de gebruiker. Bij xdm wordt dit waargenomen door een willekeurige sessie- beheerder omdat in een windowing omgeving de login-shell van een gebruiker niet zonder meer is gekoppeld aan een terminal-achtige interface. Voor het beheer van een sessie onder X gebruiken we dus de window manager als sessiebeheerder en wanneer de window manager stopt, betekent dit ook het einde van de sessie.

Basisbegrippen van xdm

xdm is een Xclient die het beheer voert over het leggen, verbreken en coördineren van de verbinding(en) met een gebruiker. xdm houdt bij welke X-servers er allemaal ter beschikking zijn via het Xservers bestand en luistert ook naar XDMCP-verzoeken om beheer via het netwerk. Wanneer xdm het beheer krijgt toegewezen over een X-server dan zal het een login-scherm naar het betreffende beeldscherm sturen en wachten op invoer van de gebruiker. Nadat de gebruiker zijn naam en wachtwoord heeft ingetikt zal dezelfde verificatie-procedure worden doorlopen als bij een tty-login. Vervolgens zal xdm een aantal scripts uitvoeren die de Xclients zal starten die de gebruiker wil hebben. We hebben nu een reguliere X-sessie totdat de gebruiker zich afmeldt, waarna xdm de verbindingen sluit, de terminal in de login- toestand terugzet en wacht op de volgende sessie.

Waarom xdm?

Nog afgezien van de mogelijkheden met betrekking tot beveiliging en gemak is tevens xinit door het X Consortium (tegenwoordig The Open Group) overbodig verklaard waardoor alle nieuwe functionaliteit alleen in xdm wordt ingebouwd. xdm geeft beheerders de mogelijkheid omgevingen voor een heel systeem in te stellen. Tevens is xdm de enige manier (bij mijn weten) om een systeem door meerdere gebruikers te laten delen zonder dat er iets herstart hoeft te worden.

Instellen

xdm wordt ingesteld via standaard tekstbestanden. Traditioneel zijn de systeembestanden te vinden in /usr/lib/X11/xdm of /etc/xdm en de gebruikersbestanden (hoe kan het ook anders?) in de directory van de gebruiker. Belangrijk daarbij is dat het bestand xdm-config een compleet andere locatie voor de bestanden kan aanwijzen en dat dit bestand zélf ook ergens anders kan staan door xdm op te starten met de parameter -config. Aldus kun je instellingen wijzigen zonder de standaard instelling van je distributie te veranderen. Hieronder volgt een korte beschrijving van elk bestand en een voorbeeld met commentaar (waar nodig).

Systeembestanden

xdm-config

Dit bestand geeft de plaats van alle andere bestanden voor het instellen (als je daarvan gebruik wilt maken) en bevat de commando's voor het starten van setup, startup, reset en startscript. In onderstaand voorbeeld staan alle bestanden in /etc/X11/xdm zodat ik de standaard bestanden in /usr/lib/X11/xdm niet hoef te wijzigen.
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

Een lijst met servers die xdm kan beheren. Minimaal moet hierin het lokale schermbeheer staan.
Let op: dit bestand wordt alleen opnieuw gelezen nadat een sessie wordt beëindigd of nadat xdm een SIGHUP signal heeft gekregen. Voor het versturen van een dergelijk signaal moet je het procesnummer van xdm opzoeken en een $ kill doen van dat proces als volgt:
# ps -a | grep xdm

2639 ? R 0:09 /usr/bin/X11/xdm

# kill -9 2639
Hieronder een voorbeeld voor een machine met slechts één gebruiker.
# first line should be the local display

:0 local /usr/X11R6/bin/X
# :0 specifies console
# local denotes the X server is running on the locally
# /usr/X11R6/bin/X executable run at startup
# the syntax for X terminals is slightly different
# since they run their X server from another machine
# ONLY enter X terminals if they DO NOT support XDMCP

eng1:0 foreign NCD xterminal
# eng1 is the name of the terminal
# :0 is the display to use on the terminal
# foreign signifies the X server is running on a different machine
# NCD xterminal are display class resources specific to this terminal
# and aren't absolutely neccesary

eng2:0 foreign NCD xterminal
eng3:0 foreign Visual xterminal

Xsession

Het opstart-script dat wordt gedraaid bij iedere sessie:
#!/bin/sh

# following section enables failsafe logon when neccesary
# using <CTRL><RETURN> after password activates failsafe mode

case $# in
1)	case $1 in
	failsafe)
		exec xterm -geometry 80x24-0-0
	;;
	esac
esac

# redirect errors to a file in user's home directory

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

# use users local .xsession and .Xresources files if they exist
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

Bepaalt de resources die moeten worden geladen met xrdb(1) voor alle servers die xdm gaat beheren.
# key settings to be used by Xlogin widget 

xlogin*login.translations: #override\

# Ctrl R stops xdm from managing display
Ctrl<Key>R: abort-display()\n\
# F1 or Ctrl Return run a failsafe session
# consisting of a single xterm window
<Key>F1: set-session-argument(failsafe) finish-field()\n\
Ctrl<Key>Return: set-session-argument(failsafe) finish-field()\n\
<Key>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

Bevat het huidige procesnummer van xdm (alleen ter informatie, niet veranderen).

xdm-errors

Hierin komen alle foutmeldingen die xdm genereert.

Xaccess

Stelt de toegangsrechten in voor XDMCP (vanaf versie X11R5). Het bestand bepaalt alleen de toegangsrechten voor verzoeken van XDMCP. Je kunt hier ook macro's definiëren voor een logische groepering van machines.
Toegang tot de server wordt ingesteld middels de DisplayManager*authorize resource in het bestand xdm-config. Voor meer informatie over het instellen van XDMCP, met voorbeelden, zie de paragraaf over de chooser hieronder.

GiveConsole

Een script dat wordt gebruikt om de rechten van de console op de gebruiker over te dragen. Verander hier niets zonder dat je er een goede reden voor hebt.
#!/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

Take Console

Dit script geeft de rechten weer terug aan gebruiker root (vanaf versie X11R5). Ook deze niet zonder gegronde redenen veranderen.
#!/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

Een script dat de instelling van het locale console bepaalt (vanaf versie X11R5). Dit start xconsole, een terminal window die systeemmeldingen weergeeft tussen logins door.
#!/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

Gebruikersbestanden

~/.xsession

Een opstart script van de gebruiker die aan wordt geroepen vanuit Xsession. In tegenstelling tot ~/.xinit kan dit script in elke shell-taal zijn geschreven (~/.xinit kan alleen een Bourne of Bash shell script zijn).

~/.Xresources

Gebruikers resources die ook door Xsession worden ingelezen

~/.xsession-errors

Bevat de foutmeldingen van de specifieke sessie van de gebruiker.

~/.Xauthority

Bevat autorisatie informatie voor de server van de gebruiker.

XDMCP

Dit X Display Manager Control Protocol verscheen voor het eerst in X11 versie 4 om diverse problemen tussen xdm en X terminals op te lossen. Voorheen was xdm alleen op de hoogte van servers die vermeld waren in het bestand Xservers. Doordat dit bestand alleen tijdens opstarten wordt ingelezen gaf dit problemen met terminals die uit- en weer aan werden gezet. Hierdoor moest iedere keer een systeembeheerder ingrijpen met een SIGHUP signaal om xdm te dwingen de configuratie opnieuw te lezen zodat de betreffende terminal weer werd herkend.

XDMCP maakt het mogelijk dat servers met xdm kunnen praten zonder dat deze ze reeds kent. Met XDMCP luistert de machine op de XDMCP-poort naar verzoeken op het netwerk (voor alle drie de mogelijke communicatiemethoden). Bij het ontvangen van een dergelijk verzoek start het een kopie van zichzelf en stuurt het loginscherm naar de terminal.

Communicatie methoden

XDMCP biedt drie manieren voor het afhandelen van een verzoek: DIRECT, INDIRECT en BROADCAST.

Met de methode DIRECT wordt een willekeurig verzoek op het netwerk geplaatst. Het eerste xdm proces dat reageert krijgt dan het beheer over de server.
De methode INDIRECT heeft een keuzemenu tot gevolg waarin alle machines staan die een verbinding kunnen verzorgen. De gebruiker kan er vervolgens één uitkiezen. De methode INDIRECT is vooral geschikt in een omgeving met meerdere machines.
Om deze methode te kunnen gebruiken moet je de CHOOSER optie aanzetten in het bestand Xaccess.
Een alternatief is het gebruik van de methode BROADCAST, in samenwerking met CHOOSER, die een verzoek verzendt over het gehele netwerk naar alle machines en de gebruiker vervolgens laat kiezen.

Chooser

Als een X-terminal niet over een menu beschikt met alle beschikbare machines dan kan gebruik worden gemaakt van de Chooser, in combinatie met BROADCAST of INDIRECT. Neem, om dit te activeren, als eerste de optie CHOOSER op in het bestand Xaccess:
eng*.odhs.dsd.com CHOOSER BROADCAST
Deze regel maakt het mogelijk dat alle terminals van engineering bij odhs.dsd.com een keuzescherm krijgen met daarop alle beschikbare machines. Een wellicht beter scenario is dat ze een vaste lijst van beschikbare machines te zien krijgen waarmee ze verbinding kunnen leggen. Dit kan met de methode INDIRECT:
eng*.odhs.dsd.com CHOOSER \
	dsdapps.odhs.dsd.com \
	dbsrv.odhs.dsd.com \
	test.odhs.dsd.com
Deze instelling geeft toegang tot de applicatie-, database- en test servers voor alle engineers via een keuzemenu.

Het bestand Xaccess laat het verder toe macro's te definiëren voor logisch te groeperen machines. Hieronder een voorbeeld met een macro die gebruik maakt van de instelling als hierboven gegeven:

%ENGHOSTS dsdapps.odhs.dsd.com dbsrv.odhs.dsd.com test.odhs.dsd.com

eng*.odhs.dsd.com CHOOSER %ENGHOSTS
De presentatie van het keuzemenu kan verder in worden gesteld door waarden in het bestand Xresources te veranderen.

xdm gebruiken

Om je xdm instelling uit te testen zonder opnieuw op te starten kun je het volgende commando geven:
# init 5
Hiermee gaat het systeem naar run level 5. xdm start meestal automatisch op dit niveau. Als het dat niet doet, kijk dan eens in /etc/inittab. Daarin staat op welk niveau xdm wordt gestart (Slackware bijvoorbeeld laat het soms op niveau 4 starten maar de meeste mij bekende distributies houden het op 5). Als het goed is zie je nu het xlogin programma en kun je je aanmelden en je instellingen uittesten. Als je zeker weet dat je alles volgens het boekje hebt gedaan en xdm reageert nog steeds niet naar behoren, ga dan naar de oplossingen-paragraaf hieronder.

In het andere geval kun je nu gaan prutsen aan je individuele instellingen. Wanneer je eenmaal xdm geheel naar wens hebt ingesteld kun je de instelling van je machine, in /etc/inittab, als volgt veranderen zodat deze tijdens opstarten naar niveau 5 gaat in plaats van 3. Verander :

id:3:initdefault:
in
id:5:initdefault:
Dit laat Linux altijd opstarten in run level 5, wat op zijn beurt het opstarten van xdm tot gevolg heeft.

xdm problemen en oplossingen

Als xdm niet doet wat je wilt kun je allereerst in het bestand ~/.xsession-errors kijken. Deze bevat foutmeldingen die specifiek het gevolg zijn van jouw sessie en bevat dus meer informatie dan de systeembestanden. Hieronder een aantal bekende valkuilen en een manier om er niet in te vallen.

Het login menu verschijnt niet op het scherm

Hoogstwaarschijnlijk een instellingsfout. Je test dit toch wel uit voordat je opstart met run level 5, toch?

Je login is correct maar het login menu verschijnt weer

Het kan zijn dat je bestand .xsession niet uitvoerbaar is (geen execute rechten). Probeer nog een keer in te loggen maar toets nu CTRL-RETURN in na het invoeren van je wachtwoord (in plaats van gewoon 'return'). Daarmee wordt het script .xsession niet uitgevoerd en krijg je een enkel terminal-scherm van waaruit je het volgende commando kan geven:
# chmod +x .xsession
en het opnieuw proberen.

Na inloggen knippert het scherm kort en het login-menu verschijnt weer

Gebruik de hierboven beschreven methode om .xsession te omzeilen en kijk of het laatste commando in dit bestand op de voorgrond wordt gestart.

Afronding

Ik hoop dat dit artikel je een inzicht heeft gegeven in de kracht en uitbreidbaarheid van de X Display Manager. Als je op zoek bent naar meer uitgebreide informatie over xdm, zie daarvoor de links aan het eind van dit artikel. In de volgende uitgave zullen we ingaan op het meestal verwaarloosde onderwerp "beveiliging in X". Vragen en opmerkingen kunnen gestuurd worden aan jmccarty@theshop.net.

Meer informatie