总结

总结

总结

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。

我不能做什么

最终结果

我最终做的是启用布尔值 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

相关内容