我编写了一个基于 autofs 程序的映射,它会自动挂载 CIFS 共享,从位于~/.smb
任何给定用户的文件夹内的文件中获取凭据。可以有多个凭证文件,其中每个文件名与目标 CIFS 服务器的域名匹配。
Autofs 挂载由 运行automounter(8)
,它在我的 Centos 7 版本中被定义为 systemd 服务。 Automounter 以 root 身份运行,autofs 映射脚本由 root 拥有并设置为 0700 权限,并且有一个具有/root/.smb
0600 权限的凭证文件。按理说,我认为自动安装程序应该能够读取凭据文件。
也就是说,直到 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/.smb
为automount_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_t
或user_home_t
上下文的所有文件。