Re: [PATCH] Allow systemd to getattr configfile

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/5/19 8:19 AM, Sugar, David wrote:


On 12/5/19 2:46 AM, Dominick Grift wrote:
On Wed, Dec 04, 2019 at 06:43:43PM +0100, Dominick Grift wrote:
On Wed, Dec 04, 2019 at 05:22:55PM +0000, Sugar, David wrote:


On 12/4/19 11:56 AM, Dominick Grift wrote:
On Wed, Dec 04, 2019 at 04:33:20PM +0000, Sugar, David wrote:
Systemd has ConditionalPathExists which is used to check if a path exists to control starting a service.  But this requires getattr permissions on the file.  This is generally for configuration files.  We are mostly seeing this is in our own policy.  But this lvm denial also fits the example.

type=AVC msg=audit(1575427946.229:1624): avc:  denied  { getattr } for  pid=1 comm="systemd" path="/etc/lvm/lvm.conf" dev="dm-0" ino=51799 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:lvm_etc_t:s0 tclass=file permissive=0

This second example is from chronyd, but it is happening becuase I added the conditional in a drop-in file. Note that chronyd_conf_t is already a 'configfile'.

type=AVC msg=audit(1575427959.882:1901): avc:  denied  { getattr } for  pid=1 comm="systemd" path="/etc/chrony.conf" dev="dm-0" ino=53824 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:chronyd_conf_t:s0 tclass=file permissive=1

how about something a little more general?

systemd_ConditionPath(`,'
	allow init_t $1:dir search_dir_perms;
	allow init_t $1:lnk_file read_lnk_file_perms;
	allow init_t $1:fifo_file getattr_fifo_file_perms;
	allow init_t $1:sock_file getattr_sock_file_perms;
	allow init_t $1:file getattr_file_perms;
	allow init_t $1:blk_file getattr_blk_file_perms;
	allow init_t $1:chr_file getattr_chr_file_perms;
')

I think you are suggesting an interface 'systemd_conditionpath' that
would exist in init.if and then need to be used by any module that wants
to grant access to a particular type to getattr?

So, for this case, I would need to modify chronyd.te and lvm.te to use
this interface?

I think you are also suggesting that ConditionPathExists usage in a unit
file could be trying to check for the existence of something other than
a configuration file.

Taking it to the extreme, a unit file could be checking for the
existence of a file that is in a different SELinux domain.  Does it
instead make sense to use the 'files_getattr_all_files',
'files_getattr_all_sockets', 'files_getattr_all_pipes', etc... in init.te?


$ man systemd.directives | grep -i conditionpath
         ConditionPathExists=
         ConditionPathExistsGlob=
         ConditionPathIsDirectory=
         ConditionPathIsMountPoint=
         ConditionPathIsReadWrite=
         ConditionPathIsSymbolicLink=

Don't get me wrong though. In DSSP2 standard I allow systemd to read all config, which is also a less-than-optimal compromise.
I basically do this because systemd often needs to be able to read environment config files in /etc/sysconfig (EnvironmentFile=)
Ideally I would also narrow this down and maybe one day i will (or maybe not)

The point i am trying to make wrt to this patch though, is that ConditionPath* is not limited to config files


I agree with you, and I'm very much in favor of a more generic solution
that will cover as much of this type of stuff as possible.  I just don't
have any other ideas yet.

Looking at current refpolicy, it looks like most (but not all) of the
files in /etc/sysconfig are labeled etc_t (at least on my system) and
init_t can read etc_t files already.

Maybe we need a mix of solutions here.  Something added to init.te to
grant most of the obvious access needed to deal with many of these cases
and then an interface in init.if to give an ability to grant additional
access when the generic case isn't enough for some reason.  Maybe grant
getattr access to all 'non_security_file_type'.

Then an interface like the following (which is just an idea) where $1 is
the type that init_t needs to getattr for a Conditional* and $2 is one
(or more) object classes.

interface(`init_systemd_conditional','
	gen_require(`
		type init_t;
	')

	allow init_t $1:dir list_dir_perms;
	allow init_t $1:{ $2 } { getattr };
	read_lnk_files_pattern(init_t, $1, $1)
')

Alternatively add a new attribute in init.te called
'systemd_conditional' which init.te has getattr permission on and then
types can be added to that attribute that need to be used in a
Condition*.  Granted that is very similar to what you initial proposed
just using an attribute instead.

I'm also hoping that Chris will chime in with some opinion on this topic.

My interface preference is what Dominick is suggesting though it should be an init interface.


--
Chris PeBenito



[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux