允许root拥有/运行脚本访问selinux下/root中的文件的最明智/最安全的方法

允许root拥有/运行脚本访问selinux下/root中的文件的最明智/最安全的方法

我编写了一个基于 autofs 程序的映射,它会自动挂载 CIFS 共享,从位于~/.smb任何给定用户的文件夹内的文件中获取凭据。可以有多个凭证文件,其中每个文件名与目标 CIFS 服务器的域名匹配。

Autofs 挂载由 运行automounter(8),它在我的 Centos 7 版本中被定义为 systemd 服务。 Automounter 以 root 身份运行,autofs 映射脚本由 root 拥有并设置为 0700 权限,并且有一个具有/root/.smb0600 权限的凭证文件。按理说,我认为自动安装程序应该能够读取凭据文件。

也就是说,直到 SELinux 出现为止;随后它会记录在audit.log中(为了可读性添加了换行符):

type=AVC msg=audit(1508458225.901:143): avc:  
    denied  { read } for  
    pid=4786 
    comm="auto.smb-user" 
    name="mydomain.credentials" 
    dev="sda1" 
    ino=10180973 
    scontext=system_u:system_r:automount_t:s0
    tcontext=unconfined_u:object_r:admin_home_t:s0 
    tclass=file

当然,自动挂载进程运行得很好setenforce 0,但我宁愿习惯 SELinux 而不是一直禁用它

我猜审计记录意味着我的脚本auto.smb-user无法访问mydomain.credentials,因为文件被标记admin_home_t,并且标记的进程automount_t无法访问这些文件?

首先,我读得对吗?如果不是,如何更好地解释?

其次,如何明智地添加一个最小的 SELinux“例外”,以便该脚本可以访问 下的任何凭据文件~/.smb,对于包括 root 在内的任何用户(最好仅在通过自动挂载运行时);重启后仍然存在,yum update等等?

答案1

是的 - 您正在正确读取输出。

源上下文是automount_t,目标上下文是admin_home_t,并且由于automount_t没有 的读取权限而被拒绝admin_home_t

要验证这一点,您可以使用以下命令:

sesearch -d -A -s autmount_t -t admin_home_t

您会注意到它确实返回一个空行 - 这意味着automount_t没有admin_home_t.

现在你有两个选择:

  • 将文件的文件上下文更改为automount_var_run_t,这是一种更简单、更明智的解决方案,它使 SELinux 认为该文件由自动挂载拥有,因此它将允许它进行几乎所有操作,包括读取和写入(但是,请记住,有效结果仍然可以被普通文件权限或 ACL 覆盖!)
  • 添加策略包,这是一个更全面、更疯狂的解决方案,因为它将提供automount_t对...的读取访问权限admin_home_t,但它只会提供对其的读取访问权限,而不是“所有者”访问权限。
  • (还有第三个选项,将前两个选项结合起来,并使它们变得更加复杂 - 创建您自己的上下文类型,将其应用到这些文件,然后创建一个允许 automount_t 访问该类型的策略模块。我不会'不详细讨论这一点。)

将文件上下文更改为 automount_var_run_t

这是更简单的选项,只需将文件的文件上下文更改/root/.smbautomount_var_run_t- 因此任何使用该类型运行的进程automount_t都将能够访问它。然而,在这种情况下,它还将具有其他权限。检查sesearch -d -A -s autmount_t -c file会告诉您哪些:

allow automount_t automount_var_run_t : file { ioctl read write getattr lock add_name remove_name search open } ;

如果您同意自动挂载对这些文件具有这些权限,您可以继续将文件的上下文实际更改为 automount_var_run_t,您可以执行以下操作:

semanage fcontext -a -t automount_var_run_t "/root/.smb"
restorecon /root/.smb

这应该能够自动挂载以访问 root 的文件。现在要为所有其他用户添加访问权限(假设他们具有默认的家庭位置,...),请执行以下操作:

semanage fcontext -a -t autmount_var_run_t "/home/(.*)+/.smb"
restorecon -R /home

这应该使 automount 能够按照您所描述的方式工作。

授予 automount_t 读取 admin_home_t 的权限

这将为 automount_t 授予读取权限全部具有上下文 admin_home_t 的文件。可能不是你真正想要的 - 但为了完整性

获取相关的audit.log行并将它们放入一个文件中,例如automount-audit.log。然后运行以下命令:

audit2allow -i automount-audit.log -m automount > automount-audit.te

这将从审核日志行生成一个类型强制文件,它看起来像这样:

module automount-smb 1.0;

require {
    type admin_home_t;
    type automount_t;
    class file read;
}

#============== autmount_t ==============
allow automount_t admin_home_t:file read;

如果您还希望它允许访问 user_home_t(对于普通的非 root 用户),您可以将以下行添加到末尾:

allow automount_t user_home_t:file read;

然后您需要使用以下命令编译模块:

checkmodule -M -m -o automount-smb.mod automount-smb.te

从模块中制作策略包:

semodule_package -o automount-smb.pp -m automount-smb.mod

最后(哇!)将策略包插入内核:

semodule -i automount-smb.pp

现在应该允许带有标签的进程automount_t读取访问带有admin_home_tuser_home_t上下文的所有文件。

相关内容