OpenBSD xenodm config

A xenodm az OpenBSD alapértelmezett display managere, egy XDM fork. Alapból elég csúnyácska, de van lehetőség testreszabni config fájlok szerkesztésével.

Én ezt a neten megosztott beállítást vettem alapul. Beállítottam még az autologin-t, amit az /etc/X11/xenodm/xenodm-config fájl szerkesztésével lehet:

DisplayManager*autoLogin       kikadf

Ez mindjárt okozott is egy kis meglepetést:

  1. ha kijelentkeztem a wm-ből, nem kaptam login képernyőt, hanem rögtön vissza is léptetett
  2. leállításnál bezárodott a wm, aztán az alkalmazások, majd mielőtt leállt volna a rendszer egyből vissza is léptetett a wm-be, majd aztán azt is lelőtte az os újra, vagy a xenodm-et lőtte már ki az vitte magával. Elég hülyén nézett ki...

 

Olvasgatva a xenodm-ről, minden lényeges config és script fájl az /etc/X11/xenodm/ könyvtárban van, működése az alábbi:

1. Elindul a xenodm, ami beolvassa a xenodm-config-ot, az Xservers config fájlt (ilyet tartalmaz: ":0 local /usr/X11R6/bin/X :0 vt05"), és a Xresources config fájlt az X kliens beállításaival.

2. Indul az Xsetup_0 script, ami megjeleníti a login képernyőt. Viszont, ha az autologin engedélyezve van, akkor ez a lépés kimarad!

3. Login után (vagy login képernyőn pötyögés, vagy autologin) indul még root joggal az Xstartup script. Mármint az alapértelmezett beállítások szerint mégsem mert a xenodm_config fájlban ez van: 

DisplayManager*startup:         /etc/X11/xenodm/Xstartup
DisplayManager*reset:           /etc/X11/xenodm/Xreset
...
DisplayManager._0.startup:      /etc/X11/xenodm/GiveConsole
DisplayManager._0.reset:        /etc/X11/xenodm/TakeConsole

Szóval általánosságban az Xstartup indul, de :0 server esetén a GiveConsole. Ezeknek a feladata az user jogosultságok megadása, az X server egy nologin-os _x11 nevében fut, a wm pedig a bejelentkezett user nevében.

4. Ezután indul az Xsession script az user nevében, ami majd indítja az user ~/.xsession scriptjét, ami majd indítja a wm-et, meg ami még van benne. Vésztartaléknak, ha nincs ~/.xsession, akkor indítja az OpenBSD alapértelmezett fvwm-et. Ha az ~/.xsession script, vagy fwm végzett, az Xsession script is befejezi a munkát és kilép.

5. Az Xsession befejezése (wm-ből kijelentkezés, leállítás, vagy újraindítás) után indul az Xreset script root-ként, vagy :0 X server esetén a TakeConsole script. Ez visszaállítja a jogosultságokat amit az Xstartup/GiveConsole beállított, majd goto 1.

 

A manual alapján a xenodm két signal-ra reagál, a SIGHUP-ra újraindul az X server, a SIGTERM-re meg kilép. Az autologinos 2. számú probléma amiatt van, hogy mire a xenodm megkapja a SIGTERM signal-t, addigra (mivel közben a wm már leállt és ezért az Xsession script végig ért) működéséből adódóan újraindítja a login folyamatot, ami az autologin miatt gyorsan indítja az Xsession -> ~/.xsession -> wm -et. Ha nem volna autologin, akkor az Xsetup_0 is lefutna és megállna a folyamat a login képernyőnél.

Az 1. számú probléma meg adja magát, az autologin miatt nem fut le az Xsetup_0 script, ami összeállítaná a login képernyőt, hanem egyből az Xsession indul.

Az lenne jó tehát, ha autologin esetén boot után bejelentkezne automatikusan a megadott user, de aztán már nem. Így lehetne kijelentkezni, más user-ként belépni, más wm-et indítani, stb. Az OS leállásakor sem lépne újra be a wm-be, hanem megállna a login képernyőn, ami nem nézne ki olyan hülyén.

Mivel a xenodm beállításai között nem találtam megoldást, első megoldási kísérletem az volt, hogy a GiveConsole script-ben elhelyezek egy sed-es sort, ami a xenodm-config-ban kikommenteli az autologinos sort, majd az OS leállásakor az rc.shutdown script meg visszaállítja. Nem működött, mert a xenodm-config csak olvasási jogosultsággal bír, azt meg nem akartam piszkálni.

 

A "megoldás" az alábbi lett:

1. xenodm futtatása egyéni config-al:

doas rcctl set xenodm flags -config /etc/X11/xenodm/xenodm-config-custom

2. alapértelmezett xenodm-config másolása xenodm-config-autologin néven, amihez az autologin beállítását adtam hozzá. Majd:

ln -sf xenodm-config-autologin xenodm-config-custom

3. GiveConsole szerkesztése, hogy az alapértelmezett (nincs autologin) configra mutasson a xenodm-config-custom:

cd /etc/X11/xenodm
ln -sf xenodm-config xenodm-config-custom

4. /etc/rc.shutdown (ha nincs, van egy üres példa script az /etc/examples könyvtárban) szerkesztése: 

cd /etc/X11/xenodm/
ln -sf xenodm-config-autologin xenodm-config-custom

 

Nem túl elegáns workaround, de működik.

 

Aztán jó lett volna a login felületen egy lehetőség session választásra, melyik wm induljon. Szoktam próbálgatni ilyen olyan wm-eket, több kevesebb ideig, többször nekifutva. Erre nem találtam példát a neten, de az általam választott dark clean "téma" xmessage-n alapuló sleep/restart/shotdown bar-ja tök jó ihletett adott.

1. ~/.xsession szerkesztése a wm-ek indítására:

if [ -s /tmp/xenodm-session ]; then
        export XENODM_SESSION=$(cat /tmp/xenodm-session)
else
        export XENODM_SESSION=LXQt
fi

case $XENODM_SESSION in
        LXQt)
                exec ck-launch-session /usr/local/bin/startlxqt
                ;;
        Openbox)
                exec openbox-session
                ;;
        cwm)
                exec cwm
                ;;
        *)
                # fallback
                exec ck-launch-session /usr/local/bin/startlxqt
                ;;
esac

2. Létrehoztam az /etc/X11/xenodm/session-list fájlt:

SESSIONLIST="LXQt_30 Openbox_31 cwm_32"

Az elv, hogy a ~/.xsession-nak megfelelő wm név a hozzá "_" -al kapcsolt xmessage gomb kóddal vannak felsorolva a wm-ek. 30-39 között használok gomb kódokat, igazából ezek xmessage exit kódok és az 1-et használja csak gyárilag az xmessage, de kell az Xsetup_0 scriptbe egy elágazáshoz, hogy tudjam mik lehetnek a gombok. Azért a külön konfig fájl, hogy később csak ezt kelljen szerkeszteni, az Xsetup_0 meg generálja majd ez alapján a megfelelő xmessage parancsot.

3. /etc/X11/xenodm/Xsetup_0 szerkesztése:

# session chooser bar
(
# get session list
. /etc/X11/xenodm/session-list
# set default session
if [ ! -s /tmp/xenodm-session ]; then
  echo "LXQt" > /tmp/xenodm-session
fi

# make button list
for _session in $SESSIONLIST; do
  if [ -z $XBUTTONS ]; then
    XBUTTONS="[ ${_session%_*} ]:${_session#*_}"
  else
    XBUTTONS="$XBUTTONS,[ ${_session%_*} ]:${_session#*_}"
  fi
done

# start bar
while true; do
  xmessage -geometry +32-32 -buttons "${XBUTTONS}" "Session: $(cat /tmp/xenodm-session)"
  CACTION=$?
  echo "Session Chooser: code $CACTION"
  if [ $CACTION -ge 30 ] && [ $CACTION -le 39 ]; then
    echo $SESSIONLIST | sed "s/_$CACTION.*//;s/.* //" > /tmp/xenodm-session
  else
    echo "Session Chooser: $CACTION is not a button code."
  fi
  # stop looping if xclock died (killed by GiveConsole)
  if [ -z "$(pgrep -U root xclock)" ]; then break; fi
done
) &

A default, vagy kiválasztott wm-et a /tmp/xenodm-session fájlba írja, mert környezeti változóval nem bírtam megoldani, mire az ~/.xsession-hoz ért már elveszett...

 

Aztán még akartam egy olyat is, hogy a login screen írja ki, hogy milyen rendszer is amiben vagyok, verzió stb. ezt is az xmessage segítségével oldottam meg, egy szimpla gomb, ami kattintásra csak megváltoztatja a gomb feliratát, rövidebb, vagy hosszabb uname kimenetre:

# uname
(
XUNAMES=$(uname -sr)
XUNAMEA=$(uname -a)
XUNAME=$XUNAMES
while true; do
  xmessage -geometry +32+2 -buttons "$XUNAME":0 ""
  UACTION=$?
  echo "Uname bar: code $UACTION"
  if [ $UACTION -eq 0 ]; then
    if [ "$XUNAME" = "$XUNAMES" ]; then
      XUNAME=$XUNAMEA
    else
      XUNAME=$XUNAMES
    fi
  else
    echo "Uname bar: $UACTION is not a button code."
  fi
  # stop looping if xclock died (killed by GiveConsole)
  if [ -z "$(pgrep -U root xclock)" ]; then break; fi
done
) &

 

Ez a végeredmény:

xenodm-20220814-1841

Ha valakit érdekel:

Xsetup_0 Xresources GiveConsole eleje

Hozzászólások

Szerkesztve: 2022. 08. 15., h – 19:26

Sima terminálos login nem tetszik? Majd abból az X indtása ha kell? Nekem az jönne be minimalistának :)

A login screen szép lett szerintem.

Megkérdezhetem hogy mire használod az OpenBSD-t? Normál user OS vagy munka?

Kösz.

 csak érdekelnek a nem túl mainstream OS-ek.

Régi szép időkben mikor fiatal voltam és bolond, próbálkoztam én is sokmindennel.

Solaris-t desktopnak,  futtattam openVMS-t, a sarokban még mindig itt van a HP visualize masina HP-UX 11.11, meg egy Sun V240 Solaris 10-el.

Anno az egyetemen, volt SunOS "dekstopom", AIX 4.3 asra is forgattam VICE x64 emulator rég volt igaz se volt ...

Fedora 36, Thinkpad x280

De, van konzolos login is, megoldható shellrc-ből, hogy tty-ról bejelentkezve mindjárt startx-szel, vagy xinit-tel induljon el az X, a megfelelő xinitrc-vel, stb., de annak az a buktatója, hogy setuid probléma miatt nem fog menni X-ben a hardveres gyorsítás/DRI. Ez egy kifejezetten OpenBSD-specifikus probléma, más BSD variánsokon, Linuxokon, stb. nem létezik.

Így sajnos OpenBSD-n kvázi kötelező a xenodm-et használni (bár lehet másik, bloatabb login manager is kiváltja), ha tényleg használható X kell. Alapból viszont a xenodm embertelen ocsmányul néz ki, tényleg az a szint, hogy majdnem elhányod magad, de szerencsére teljesen át lehet szabni a kinézetét, kicsit amolyan CSS-szerűen. Nem CSS-ben van, de egy olvasható, beszédes szintaxisú konfigfájl van hozzá.

Az autologinnak viszont erősen ellene vagyok. A user és a rendszer biztonságát szolgálja, hogy be kell jelentkezni, jelszót be kell írni. Igen, kényelmetlen gépelgetni, de a kényelem és a biztonság mindig is egymással ellentétes fogalmak voltak. Tudom, most erre azt mondjátok, hogy az adott usert nem érdekli a biztonság, de erre meg én azt mondom, hogy de, mert ha OpenBSD-t használ, annak pont ez lenne a legfőbb lényege, hogy az egész a biztonsági paranoiára, helyes biztonsági gyakorlatra van rágyúrva. Akinek kényelem kell, annak inkább javaslom valamelyik full DE-s, normibiztos Linuxot, ha BSD-vonalon kell, akkor hellosystem, ami pont hasonló lustaságra van rágyúrva, egy user, nuku login, stb..

És nem, a titkosítás sem oldja meg, mert az csak bootkor kéri be a jelszót (onnantól transzparens, és ha már fut a rendszer, akkor nem véd az ellen, hogy amíg nem vagy gépnél, valaki oda ne üljön matatni), vagy megint bejelentkezés kell hozzá, ha user/home szintű titkosítás. Ezért szokás reflexből is zárolni a rendszert (lockscreen), vagy kijelentkezni, ha az ember nincs gépnél, de a gép be van kapcsolva, a rendszer fut. Sőt, azzal sem szoktam egyetérteni, hogy sok lusta ember beállítja a sudo-t, doas-t, stb.-t, hogy korlátlan ideig, jelszó nélkül lehessen rendszergazdai jogokkal garázdálkodni, az is baromi veszélyes, ha le akar futni valami ártó kód, az is lazán tudja magát futtatni, adva van neki a kényelmes privilégiumszerzés. Azon sem múlik, hogy valaki paranoid-e, meg hogy van-e rejtegetni valója. Ha nincs, akkor is az ember saját gépe, rendszere, a saját vára, főleg manapság, mikor mindenki a useradatokra, megfigyelésre, telemetriára, pishingre, stb. utazik, nem árt használni a beépített biztonsági alapfeature-öket, és helyes gyakorlatot követni. Nem, nem kell olyan messzire elmenni feltétlen, hogy OpenBSD, meg SELinux, extra hardening, de könnyelműnek, túl kényelmesnek sem jó lenni, mert az meg átesés a ló túloldalára.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

de annak az a buktatója, hogy setuid probléma miatt nem fog menni X-ben a hardveres gyorsítás/DRI.

/etc/X11/xenodm/GiveConsole github 

Gyanítom, ha ezt reprodukálod az akármilyen más login esetén, nem lesz problémád. A xenodm rém egyszerű, nem egy nagy magic tool, amit nem lehet megkerülni :)

Kösz, ezt ki fogom próbálni, ha legközelebb telepítem. Engem a xenodm irritál, ronda, meg nem kell, Linuxon sem véletlen, hogy nem használok login managert, hanem simán, tty-ból jelentkezek be. Ez egy kicsit kényelmetlen, mert nem csak a jelszót kell beírni bejelentkezéskor, hanem a felhasználói nevet is, de ez megint egyfajta biztonsági funkciónak is felfogható, hogy egy esetleges támadónak nem csak a jelszót kell kitalálnia, hanem a login másik részét is.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Nem tudom, OpenBSD alatt mit lehet, de személy szerint FreeBSD-n azt csináltam, hogy a useremet automatikusan bejelentkeztettem mélykonzolon :), és a ~/.login-ban van, ha a tty a ttyv0, akkor induljon a startx (a megvalósítás pl. itt olvasható). Persze ez csak egyfelhasználós gépen használható megoldás.