[systemd-devel] nspawn remounts /selinux readonly, thus breaking logins

Lennart Poettering lennart at poettering.net
Fri Jul 8 05:39:50 PDT 2011


On Fri, 08.07.11 08:21, Daniel J Walsh (dwalsh at redhat.com) wrote:

> >>>>>>> Newer versions of libselinux detect if /selinux is read-only and consider
> >>>>>>> selinux disabled if it is.
> >>>> But why is it disabled _outside_ of the container? This would mean that running
> >>>> nspawn disables selinux.
> >>
> >>> Hmm?
> >>
> >>> No, it's read-only only inside the container. We do that to make sure
> >>> the container cannot modify the selinux policy, since policies cannot be
> >>> virtualized really.
> > 
> > Nope, it becomes read-only outside. Some bug?
> > Repeating the commands from the original mail:
> > 
> > [zbyszek at fedora-15 ~]$ mount|grep selinux
> > selinuxfs on /selinux type selinuxfs (rw,relatime)      <----------------- RW here
> > [zbyszek at fedora-15 ~]$ sudo systemd-nspawn -D debian-tree/ /bin/true
> > Spawning namespace container on /home/zbyszek/debian-tree (console is /dev/pts/2).
> > [zbyszek at fedora-15 ~]$ mount|grep selinux
> > selinuxfs on /selinux type selinuxfs (ro,relatime)      <----------------- RO now
> > 
> >> I have no idea what nspawn does, but if you are turning the /selinux to
> >> readonly to prevent a root process from mucking with SELinux you are not
> >> going to be successful.  Since you can mount selinufs somewhere else and
> >> muck around with it. 
> > As I understand, absolute security is not on of the goals of nspawn. It is
> > only intended to prevent accidental breakage.
> > 
> >> If you want to run all of the processes within the
> >> nspawn environment under a single label, Like we do with Mock, then
> >> changing /selinux to read/only with the libselinux in Rawhide will give
> >> you want you want.  IE All processes within the container think SELinux
> >> is disabled, while SELinux is actually running all of the processes
> >> under confinement.
> > 
> > Zbyszek
> Lennart, I think to make this work correctly you need to bind mount
> /selinux on /selinux, then make the mount point private, then finally
> mount selinuxfs on /selinux read/only.  Otherwise since / is shared, the
> mounting within the namespace will show up on all namespaces.

What we currently do is mount a "fresh" selinuxfs into the container,
and not just a bind mount. Apparently that instance isn't so fresh after
all... So we probably should use explicit bind mounts after all, and
then make them read-only.

Most likely a similar problem exists with /proc and nspawn too, but is
not visible really.

Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list