总结
SELinux 阻止 samba 读取 /var/log 和所有内容
问题
禁用 SELinux 后,我的 samba 用户(已加入 AD 2008 R2 的 sssd/kerberos)可以浏览我的共享目录 /var/log。启用 SELinux 后,它不起作用。
我的 /var/log/messages 片段
Aug 29 13:28:38 servername kernel: [11625.509586] type=1400 audit(1472491718.859:35): avc: denied { read } for pid=7492 comm="smbd" name="spamfilter-all.log" dev="dm-3" ino=26 scontext=system_u:system_r:smbd_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=lnk_file
Aug 29 13:28:38 servername kernel: [11625.626225] type=1400 audit(1472491718.975:36): avc: denied { getattr } for pid=7492 comm="smbd" path="/var/log/remote/192.168.11.1" dev="dm-3" ino=1966096 scontext=system_u:system_r:smbd_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=lnk_file
正在播放的audit2allow < ~/logsnippet
节目
#============= smbd_t ==============
#!!!! This avc can be allowed using one of the these booleans:
# samba_export_all_ro, samba_export_all_rw
allow smbd_t var_log_t:lnk_file { read getattr };
我已经尝试过的方法
从https://wiki.centos.org/HowTos/SELinux,我尝试使用 audit2allow 创建一个模块然后加载它:
audit2allow < ~/logsnippet -M allow_samba_var_log
semodule -i allow_samba_var_log.pp
该模块已安装,因为我看到它semodule -l | grep allow
但我仍然无法通过 samba 访问 /var/log。
我不能做什么
- 禁用 SELinux
- https://lists.samba.org/archive/samba/2006-May/120632.html建议修改源代码,但我不确定是否要尝试修改 selinux 包的源代码(此链接中提到了 selinux-policy-targeted-sources)。如果有必要,有人可能会说服我这样做。
最终结果
我最终做的是启用布尔值 samba_export_all_ro。
答案1
当 SELinux 处于强制模式时,只会记录第一次拒绝,因为该拒绝会导致调用失败。
您应该暂时以宽容模式 ( ) 运行系统setenforce 0
。这将导致全部记录拒绝,而不仅仅是第一次。全面测试系统后,您应该对记录的消息使用 audit2why 和 audit2allow 来了解正在发生的事情并创建自定义模块。
如果您对审计结果满意,您可以安装自定义模块。
监控您的审计日志以查找更多拒绝情况并采取适当的措施。
当您满意时设置强制模式(setenforce 1
)
注意:您可以
kill -USR1 <PIDofAuditd>
让 auditd 刷新其日志并启动另一个日志,以便轻松检查是否已清除所有相关的拒绝。
答案2
我的解决方案
最初的问题表明我不会使用samba_export_all_ro
布尔值。不幸的是,这是我找到的唯一解决方案。
因此,为了解决问题,我运行了
setsebool samba_export_all_ro 1
答案3
在使用自定义模块之前,您应该首先确保已经正确设置了上下文。
看一下 ls -Z,守护进程必须先设置 samba_share_t 上下文,守护进程才能访问目录。
如果不是,请设置然后重试:
chcon -t samba_share_t /var/log