SELinux 文件路径上下文不适用于正则表达式

SELinux 文件路径上下文不适用于正则表达式

根据评论中的建议,我重新格式化以提高可读性。

我有一个使用 google authenticator 的 RADIUS 服务器,SELinux 阻止 RADIUS 访问用户主目录中的 .google_authenticator 文件(这些也是 winbind 用户,主目录位于 中/home/API)。我尝试通过构建以下策略文件授予它访问权限:

$ cat ./google-authenticator.fc 
/home/API(/.*)?/\.google_authenticator      gen_context(system_u:object_r:radiusd_google_authenticator_t,s0)
$ cat ./google-authenticator.te
policy_module(radiusd_google_authenticator, 0.0.10)

require {
  type radiusd_t;
  type user_home_dir_t;
  type admin_home_t;
}

type radiusd_google_authenticator_t;

role object_r types radiusd_google_authenticator_t;

allow radiusd_t radiusd_google_authenticator_t:file { rename create unlink rw_file_perms };

files_type(radiusd_google_authenticator_t)
filetrans_pattern(radiusd_t, user_home_dir_t, radiusd_google_authenticator_t, file, ".google_authenticator")
filetrans_pattern(radiusd_t, admin_home_t, radiusd_google_authenticator_t, file, ".google_authenticator")

安装这些会显示路径semanage fcontext -l,但是它不起作用:

 $ sudo semanage fcontext -l | grep google_authenticator
 /home/API(/.*)?/\.google_authenticator             all files          system_u:object_r:radiusd_google_authenticator_t:s0 
 $ matchpathcon /home/API/tcr/.google_authenticator
 /home/API/tcr/.google_authenticator    unconfined_u:object_r:user_home_t:s0

奇怪的是,当我将其更改为路径完全匹配(即使带有转义的句点)时,它也能起作用:

$ sudo semanage fcontext -l | grep google_authenticator
/home/API/tcr/\.google_authenticator               all files          system_u:object_r:radiusd_google_authenticator_t:s0 
$ matchpathcon /home/API/tcr/.google_authenticator
/home/API/tcr/.google_authenticator system_u:object_r:radiusd_google_authenticator_t:s0

更奇怪的是,正如 Iain 的回答中所建议的那样,当我直接使用 semanage 添加路径而不是策略文件(首先删除策略路径以避免冲突)时,正则表达式有效:

$ sudo semanage fcontext -l | grep google_authenticator
$ matchpathcon /home/API/tcr/.google_authenticator
/home/API/tcr/.google_authenticator unconfined_u:object_r:user_home_t:s0
$ sudo semanage fcontext -a -t radiusd_google_authenticator_t '/home/API(/.*)?/\.google_authenticator'
$ sudo semanage fcontext -l | grep google_authenticator
/home/API(/.*)?/\.google_authenticator             all files          system_u:object_r:radiusd_google_authenticator_t:s0 
$ matchpathcon /home/API/tcr/.google_authenticator
/home/API/tcr/.google_authenticator system_u:object_r:radiusd_google_authenticator_t:s0

我也尝试过使用 HOME_DIR 进行各种设置,但也没有成功。

答案1

尝试使用

HOME_DIR/\.google_authenticator -- gen_context(system_u:object_r:radiusd_google_authenticator_t,s0)

相反。主目录不一定在 /home 中,当您重建策略时,它充当宏。

编辑

因此我检查了源代码,它提供了以下文本,可能表明了这里发生了什么。

label_file.c
680     /*
681      * Check for matching specifications in reverse order, so that
682      * the last matching specification is used.
683      */

最后匹配的正则表达式获胜。SELinux 库使用以下文件查找顺序进行匹配:

/etc/selinux/targeted/contexts/files/file_contexts.subs_dist
/etc/selinux/targeted/contexts/files/file_contexts.subs
/etc/selinux/targeted/contexts/files/file_contexts
/etc/selinux/targeted/contexts/files/file_contexts.homedirs
/etc/selinux/targeted/contexts/files/file_contexts.local

在您的情况下获胜的匹配正则表达式是这样的:

grep user_home_t /etc/selinux/targeted/contexts/files/file_contexts.homedirs
/home/[^/]+/.+  user_u:object_r:user_home_t:s0

通过将条目添加为本地上下文,将从此文件中提取:/etc/selinux/targeted/contexts/files/file_contexts.local显示当前匹配的文件。

因此,为了解决这个问题(这基本上有点像黑客攻击),您可以将该条目添加为本地覆盖。

或者,我尝试将其添加为 HOME_DIR 覆盖(就像我最初建议的那样,但使​​用 audio_home_t 来测试主体)执行以下操作:

HOME_DIR/(tcr)?/\.google_authenticator          --      gen_context(system_u:object_r:audio_home_t)

这对我有用,因为它将条目添加到了后面的文件中,并且当我这样做时“最后的正则表达式获胜”。

它实际上在文件中将正则表达式更改为:

grep tcr /etc/selinux/targeted/contexts/files/*
/etc/selinux/targeted/contexts/files/file_contexts.homedirs:/home/[^/]+/(tcr)?/\.google_authenticator   --  user_u:object_r:audio_home_t:s0

我建议首先尝试 HOME_DIR 选项(这是您应该在策略中实施的实际方式)或者使用本地覆盖。

答案2

我不完全确定你想做什么,但如果要*在 API 后面加一个通配符,例如

/home/API/one/.google_authenticator
/home/API/two/.google_authenticator
...

都有类型radiusd_google_authenticator_t,那么这似乎有效

sudo semanage fcontext -a -t mysqld_db_t  "/home/API(/.*)?/.google_authenticator"

注意我使用了 mysqld_db_t,因为我没有 radiusd_google_authenticator_t

matchpathcon /home/API/one/.google_authenticator
/home/API/one/.google_authenticator     system_u:object_r:mysqld_db_t:s0
matchpathcon /home/API/two/.google_authenticator
/home/API/two/.google_authenticator     system_u:object_r:mysqld_db_t:s0

相关内容