Ich habe nun einen libvirt_lxc container erstellt, dazu habe ich
folgendes gemacht:
1 | echo LIBVIRT_DEFAULT_URI=lxc:/// >> /etc/environment
| 2 | mkdir -p /vm/tor/
| 3 | cd /vm/tor/
| 4 | debootstrap --variant=minbase --arch=amd64 stretch . http://httpredir.debian.org/debian
| 5 | virsh define /var/virt/tor-1.xml
| 6 | virsh start tor
| 7 | virsh console tor
|
Das hat erstmal funktioniert. Nun steht aber hier[1], das der root User
im Container genauso mächtig ist wie der des Host und auch auf diselben
Kernelfunktionen Zugriff hat. Es steht aber auch, das man die Lage mit
dem id Mapping entschärfen kann. Also habe ich (nach langem googlen) die
Config angepasst (Der block <idmap> ist dazugekommen), damit ab uid 0
und gid 0 die nächsten 1000 ids im Container auf die ids ab uid 2000 und
gid 2000 gemapt werden. Ich habe mir ein Shellscript geschrieben (ist im
Anhang), welches mir die UIDs der Dateien meines Containers entsprechend
abändert.
Dann habe ich den Container neu erstellt und gestartet. 1 | moveperm.sh /vm/tor/ 2000 2000
| 2 | virsh destroy tor
| 3 | virsh undefine tor
| 4 | virsh define /var/virt/tor-2.xml
| 5 | virsh start tor
| 6 | virsh console tor
|
Aber nun startet der Container nichtmehr, in der Console wird folgendes
Angezeigt: 1 | Connected to domain tor
| 2 | Escape character is ^]
| 3 | systemd 229 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN)
| 4 | Detected virtualization lxc-libvirt.
| 5 | Detected architecture x86-64.
| 6 |
| 7 | Welcome to Debian GNU/Linux stretch/sid!
| 8 |
| 9 | Set hostname to <panther>.
| 10 | Failed to read AF_UNIX datagram queue length, ignoring: No such file or directory
| 11 | Failed to install release agent, ignoring: No such file or directory
| 12 | Failed to create /system.slice/libvirtd.service/init.scope control group: Permission denied
| 13 | Failed to allocate manager object: Permission denied
| 14 | [!!!!!!] Failed to allocate manager object, freezing.
| 15 | Freezing execution.
|
Also habe ich das zu startende Programm von /bin/systemd nach /bin/bash
geändert und nachgesehen, was passiert ist: (Der Container hat den
selben Hostnamen wie der Host bekommen, davon nicht verwirren lassen.
Die folgenden Kommandos wurden im Container eingegeben.)
1 | root@panther:/# ls -la /sys/fs/cgroup/systemd/system.slice/libvirtd.service/init.scope
| 2 | total 0
| 3 | drwxr-xr-x 2 nobody nogroup 0 Mar 6 16:58 .
| 4 | drwxr-xr-x 4 nobody nogroup 0 Mar 6 16:58 ..
| 5 | -rw-r--r-- 1 nobody nogroup 0 Mar 6 16:58 cgroup.clone_children
| 6 | -rw-r--r-- 1 nobody nogroup 0 Mar 6 16:58 cgroup.procs
| 7 | -rw-r--r-- 1 nobody nogroup 0 Mar 6 16:58 notify_on_release
| 8 | -rw-r--r-- 1 nobody nogroup 0 Mar 6 16:58 tasks
| 9 |
| 10 | root@panther:/# ls -la
| 11 | total 80
| 12 | drwxr-xr-x 22 root root 4096 Mar 6 16:33 .
| 13 | drwxr-xr-x 22 root root 4096 Mar 6 16:33 ..
| 14 | -rw------- 1 root root 1493 Mar 6 19:28 .bash_history
| 15 | drwxr-xr-x 2 root root 4096 Mar 5 22:54 .oldroot
| 16 | drwxr-xr-x 2 root root 4096 Mar 5 21:09 bin
| 17 | drwxr-xr-x 2 root root 4096 Oct 28 22:29 boot
| 18 | drwxr-xr-x 3 root root 320 Mar 6 19:29 dev
| 19 | drwxr-xr-x 40 root root 4096 Mar 5 22:54 etc
| 20 | drwxr-xr-x 2 root root 4096 Oct 28 22:29 home
| 21 | drwxr-xr-x 9 root root 4096 Nov 27 2014 lib
| 22 | drwxr-xr-x 2 root root 4096 Mar 5 21:08 lib64
| 23 | drwxr-xr-x 2 root root 4096 Mar 5 21:07 media
| 24 | drwxr-xr-x 2 root root 4096 Mar 5 21:07 mnt
| 25 | drwxr-xr-x 2 root root 4096 Mar 5 21:07 opt
| 26 | dr-xr-xr-x 128 nobody nogroup 0 Mar 6 19:29 proc
| 27 | drwx------ 2 root root 4096 Mar 5 21:29 root
| 28 | drwxr-xr-x 4 root root 4096 Mar 5 21:07 run
| 29 | drwxr-xr-x 2 root root 4096 Mar 5 21:10 sbin
| 30 | drwxr-xr-x 2 root root 4096 Mar 5 21:07 srv
| 31 | dr-xr-xr-x 13 nobody nogroup 0 Mar 6 17:06 sys
| 32 | drwxrwxrwt 7 root root 4096 Mar 6 18:32 tmp
| 33 | drwxr-xr-x 10 root root 4096 Mar 5 21:07 usr
| 34 | drwxr-xr-x 11 root root 4096 Mar 5 21:07 var
| 35 |
| 36 |
| 37 | root@panther:/# mount
| 38 | /dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
| 39 | proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
| 40 | proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
| 41 | proc on /proc/sys/net/ipv4 type proc (rw,nosuid,nodev,noexec,relatime)
| 42 | proc on /proc/sys/net/ipv6 type proc (rw,nosuid,nodev,noexec,relatime)
| 43 | sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
| 44 | libvirt on /proc/meminfo type fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
| 45 | tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,size=64k,mode=755,uid=2000,gid=2000)
| 46 | cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
| 47 | cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
| 48 | cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
| 49 | cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
| 50 | cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
| 51 | cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
| 52 | cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
| 53 | cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
| 54 | cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
| 55 | devfs on /dev type tmpfs (rw,nosuid,relatime,size=64k,mode=755)
| 56 | devpts on /dev/pts type devpts (rw,nosuid,relatime,gid=2005,mode=620,ptmxmode=666)
| 57 | devpts on /dev/ptmx type devpts (rw,nosuid,relatime,gid=2005,mode=620,ptmxmode=666)
| 58 | devpts on /dev/tty1 type devpts (rw,nosuid,relatime,gid=2005,mode=620,ptmxmode=666)
| 59 | devpts on /dev/console type devpts (rw,nosuid,relatime,gid=2005,mode=620,ptmxmode=666)
|
Ich interpretiere dass so, das systemd innerhalb von
/sys/fs/cgroup/systemd/system.slice/libvirtd.service/init.scope
schreibberechtigungen benötigt, aber nicht hat. Interessant finde ich
die Zeile: 1 | tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,size=64k,mode=755,uid=2000,gid=2000)
|
Dieser mount wird von libvirt durchgeführt und existiert nur im
Container. /vm/tor/sys beim Host ist leer. Anscheinend versucht libvirt
das cgroup ns Subsystem für den korrekten User zu mounten, aber dabei
geht wohl etwas schief?
Hier komme ich nichtmehr weiter; Habe ich etwas vergessen einzustellen,
oder ist das ein Bug in libvirt? Wie soll ich nun weiter Vorgehen?
PS: Gibt es zu dem ID mapping in libvirt irgendwo eine Doku? Zu diesem
Thema finde ich nur sehr wenig bei Google oder in Foren, das meiste
musste ich mir aus Mailinglisten zusammensuchen.
----------
1) https://libvirt.org/drvlxc.html#secureusers
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|