Re: R/O protection for lower level dirs

Vitaly Chikunov <[email protected]> Wed, 3 Apr 2024 18:20:43 +0300
Newsgroups dev.linux.lists.landlock
Message-ID <[email protected]>
Mickaël,

On Tue, Apr 02, 2024 at 11:11:39AM +0200, Mickaël Salaün wrote:
> On Mon, Apr 01, 2024 at 07:06:14PM +0300, Vitaly Chikunov wrote:
> > 
> > I want to ensure that some deeper directory is write protected (as a non
> > security measure but so that some post-install processing do not
> > accidentally touch installed files).  Is there a way to achieve this
> > with Landlock?
> 
> Landlock follows a deny-by-default policy, which is a good practice for
> access control.  In your example, you'll need to identify the set of
> file hierarchies that should be legitimately allowed, and set the
> appropriate access rights on them, not the other way around.
> 
> > 
> > For example, if we do R/W access to / (root tree is already protected
> > enough with DAC) and then R/O access to /home we still get full R/W access
> > everywhere and /home seems not restricted. Also, Landlock does not warn for
> > such configuration, silently accepting it as valid.
> > 
> > Practical example:
> > 
> >   ~$ LL_FS_RW=/ LL_FS_RO=/home sandboxer touch a
> >   Executing the sandboxed command...
> >   ~$ ls -l a
> >   -rw-r--r-- 1 vt vt 0 Apr  1 15:53 a
> 
> Because there may have several ways to reach a file (e.g. hard links,
> bind mounts), it would be difficult to get, remember, and track all the
> related parent file hierarchies.
> 
> Landlock ties (ephemeral) permissions to inodes, which means that one
> inode with enough rights in the file hierarchy is enough to grant access
> for such rights to the files beneath it.  This is checked when accessing
> a file, which makes security policies light and flexible (e.g. handles
> file renaming, linking, and bind mounting).
> 
> In your example, / grants read-write access to all files beneath it, and
> /home grants read access to all files beneath it.  When user space
> request to write to /home/foo, / grants write permission.
> 
> This configuration is then valid, and it makes sure that the security
> policy doesn't break user space because of unknown directories nesting
> (e.g. setting different access rights on $HOME and $TMPDIR, for which
> developers don't have a way to know which one is beneath the other).
> 
> For your use case, you'd need to have different file hierarchies and tie
> them with specific permissions.  For instance, you could have /usr,
> /var/tmp/pkg/postinst, /tmp, /etc .  Keep in mind that you can also
> create nested sandboxes or run different stages of the package
> installation in dedicated sandboxes (e.g. one for the install step with
> access to /usr in read-write, another for the post installation with
> access to /var/tmp/pkg/postinst in read-write and /usr in read).
> 
> Nicolas is working on a complementary way that would ease sandboxing for
> some use cases: https://github.com/landlock-lsm/linux/issues/28
> This will help users to quickly sandbox their application instances but
> application developers should already be able to implement a more secure
> deny-by-default policy without this feature.

Thanks for the answer.

Looks like it's currently impossible to create more restricted hierarchy
inside of less restricted. I think this isn't consequence of 'deny by
default' approach but sort of additivity of allowed permissions.
Positive permissions of wider hierarchy will be added to more
restrictive sub-hierarchy and supersede them.

To add more detail, what I tried to achieve: rpmbuild installs into so
called 'buildroot', which is (for ALT) '/usr/src/tmp/name-buildroot'
directory inside of '/usr/src/tmp' TMPDIR (and '/usr/src' is a HONE). When
%check section is performed some scripts may inadvertently modify
buildroot content which I thought to block. But because TMPDIR should be
unrestricted (and / and HOME are not need to be restricted) it is not
possible by any means to restrict buildroot.

It is not possible, for example, to permit R/W to all existing entities
of TMPDIR excluding 'name-buildroot', because in that case TMPDIR itself
should have R/O permissions (it's needed to not supersede
name-buildroot) and this will defy TMPDIR purpose.

That work of Nicolas looks promising for the goal I wanted to achieve
and overall Landlock flexibility.

Thanks,


> 
> > 
> > Thanks,
> >