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