Prihlaseni do GUI v kontejneru

Jan Kasprzak kas na fi.muni.cz
Pátek Leden 24 11:57:10 CET 2020


Jan Kasprzak wrote:
: namet k brainstormingu: jak nejlepe udelat, aby se na linuxovem stroji
: s lokalnim X serverem a treba lightdm mohl jeden vybrany uzivatel
: prihlasovat tak, ze by se mu nepustila lokalni session, ale session
: bezici uvnitr nejakeho kontejneru (at uz existujiciho, anebo spusteneho
: v ramci jeho prihlaseni)?

	Pokud by to nekoho zajimalo, podarilo se mi ubastlit
proof-of-concept nastaveni tak, aby se konkretni uzivatel prihlasil
do session uvnitr kontejneru. Posilam poznamky co jsem psal svym kolegum,
treba to nekomu k necemu bude i tady. Pripadne pokud nekdo vidite nejakou
principialni diru v tomto postupu, dejte vedet.

	V zasade se dela to, ze je samostatna session, ktera pres sudo
spusti xfce4-session (nebo startxfce) uvnitr systemd-nspawn kontejneru.

-Y.

Vyrobit zkouskoveho uzivatele:
# adduser zkouska

Umoznit lokalni prihlaseni pres X
# yum -y groupinstall xfce
# yum -y install lightdm
# systemctl enable lightdm

do /etc/lightdm/lightdm.conf do sekce [Seat:*] dat autologin

=========================================
[Seat:*]
...
autologin-user=zkouska
autologin-user-timeout=0
user-session=zkouska
=========================================

Vyrobit /usr/share/xsessions/zkouska.desktop s timto obsahem
(to je odkazovane vyse z user-session=zkouska):

=========================================
[Desktop Entry]
Version=1.0
Name=Zkouska Session
Comment=Zkouskova session
Exec=zkouska-session
Icon=
Type=Application
DesktopNames=Zkouska
=========================================

Vyrobit soubor /usr/bin/zkouska-session, dat chmod +x:

=========================================
#!/bin/bash

exec 2>>$HOME/zkouska.log

echo "Session starting at `date`" >&2
echo "HOME=$HOME" >&2

sudo /usr/bin/zkouska-container

echo "Sudo returned $?" >&2
echo "Session ended at `date`" >&2
=========================================

Vyrobit soubor /usr/bin/zkouska-container, dat chmod +x:

=========================================
#!/bin/bash

exec 2>/home/zkouska/zkouska-container.log

echo "Container starting at `date`" >&2
XAUTH=/home/zkouska/.Xauthority-kontejner
TEMPLATE=/home/zkouska/session-`date +%Y%m%d-%H%M`-XXXXXX
HOMEDIR=`mktemp -d $TEMPLATE`
chown -R zkouska:zkouska "$HOMEDIR"

systemd-nspawn -D /var/lib/machines/f31/ \
	--ephemeral \
	--private-network \
	--bind /tmp/.X11-unix \
	--bind "$HOMEDIR":/home/zkouska \
	--bind /var/lib/dbus \
	--bind /var/lib/polkit-1 \
	--bind-ro /etc/localtime \
	-E DISPLAY=unix:0 \
	-E HOME=/home/zkouska \
	--console=passive \
	--drop-capability=all \
	--private-network \
	--user=zkouska \
	--chdir=/home/zkouska \
	--as-pid2 /usr/bin/startxfce4 >&2

echo "Removing home directory" >&2
rm -rf "$HOMEDIR"

echo "Container returned $?" >&2
echo "Finished at `date`" >&2
=========================================

Vyrobit soubor /etc/sudoers.d/zkouska s jednim radkem:

=========================================
zkouska ALL=(ALL) NOPASSWD:/usr/bin/zkouska-container
=========================================

Nainstalovat kontejner do /var/lib/machines/f31:

# dnf -y --releasever=31 --installroot=/var/lib/machines/f31 \
	--enablerepo fedora --enablerepo updates \
	install dnf fedora-release @XFCE @fonts vim-enhanced \
		net-tools xeyes telnet

Zrusit xscreensaver, protoze se zamyka obrazovka a nejde odemknout
(asi problem se set-uid nebo neco a prava k /etc/shadow):

# dnf -y --releasever=31 --installroot=/var/lib/machines/f31 \
	--enablerepo fedora --enablerepo updates \
	remove xscreensaver-base


Spustit lightdm

# systemctl start lightdm

PROFIT!!!

TODO:
- nakonfigurovat, aby se uzivatel zkouska nemohl prihlasit pres ssh
	ani na textove konzole
- vyresit chybu policy kit
- vyzkouset s Ubuntu, gdm a GNOME, nebo co preferujete.
	Instalace kontejneru pro Ubuntu je popsana v systemd-nspawn(8).
- zkontrolovat, ze session "zkouska" nemuze vybrat jiny uzivatel
	(nebo teda v session spoustet id -u a skoncit, pokud bezim
	pod nekym jinym)
- promyslet kde vytvaret domovske adresare, logy, a vubec cesty a podobne.
- vyzkouset SELinux sandboxing, napriklad ze systemd-nspawn(8):
       Example 7. Run a container with SELinux sandbox security contexts

           # chcon system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 -R /srv/container
           # systemd-nspawn -L system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 \
                 -Z system_u:system_r:svirt_lxc_net_t:s0:c0,c1 -D /srv/container /bin/sh
- misto docasne vyrabeneho home adresare mozna udelat jednorazovy overlay,
	melo by se to delat tak, ze misto --bind "$HOMEDIR":/home/zkouska
	se systemd-nspawn rekne --overlay /home/zkouska::/home/zkouska,
	ale mne to z nejakeho duvodu padalo s timto:

Assertion 'm->source' failed at src/nspawn/nspawn-mount.c:179, function custom_mount_prepare_all(). Aborting.
/usr/bin/zkouska-container: line 29: 59217 Aborted                 (core dumped) systemd-nspawn -D /var/lib/machines/f31/ --ephemeral --private-network --bind /tmp/.X11-unix --overlay "$HOMEDIR"::/home/zkouska --bind /var/lib/dbus --bind /var/lib/polkit-1 --bind-ro /etc/localtime -E DISPLAY=unix:0 -E XAUTHORITY="$XAUTH" -E HOME=/home/zkouska --console=passive --drop-capability=all --private-network --user=zkouska --chdir=/home/zkouska --as-pid2 /usr/bin/startxfce4 1>&2

- pokud toto nepujde, tak treba davat domovske adresare do /var/tmp/
	a rsyncovat podle /home/zkouska, aby se tam dalo pripravit
	nejake nastaveni - spusteni IDE a podobne

-- 
| Jan "Yenya" Kasprzak <kas at {fi.muni.cz - work | yenya.net - private}> |
| http://www.fi.muni.cz/~kas/                         GPG: 4096R/A45477D5 |
      But fortunately wifi has a few, uh, interesting design choices
      that mean we can still do something.         --Matthew Garrett


Další informace o konferenci Linux