强制执行 selinux 策略的 rsync 守护进程 rsync_export_all_ro 仍然阻止访问 /var/spool/postfix/private/ 下的文件

强制执行 selinux 策略的 rsync 守护进程 rsync_export_all_ro 仍然阻止访问 /var/spool/postfix/private/ 下的文件

我有许多基于 Debian 的系统,它们定期使用rsync.由于多种原因,我不得不部署一台小型 CentOS 7 服务器,并且我想将其添加到我的备份计划中。无法通过 ssh 使用 rsync 进行备份;相反,我需要使用 rsync 守护进程。

CentOS 在强制模式下启用了 SELinux,因此它让我走上了陡峭的学习曲线。

配置rsyncd部分(简化)

[root]
    comment = Filesystem
    path = /
    exclude = /proc/*** /run/*** /sys/*** [...]
    read only = yes
    list = yes
    uid = root
    secrets file = [...]
    ignore errors = no
    ignore nonreadable = no
    refuse options = delete

我相信该过程的标签是正确的:

ps -eZ | grep rsync
system_u:system_r:rsync_t:s0    26020 ?        00:00:00 rsync

最初,通过守护进程进行备份的尝试rsync因各种权限错误而失败,我将其归因于 SELinux 标签。进一步挖掘我找到了参考rsync允许守护进程以只读方式导出所有文件的SELinux 策略:

setsebool -P rsync_export_all_ro 1

这导致了这个集合

getsebool -a | grep '^rsync'
rsync_anon_write --> off
rsync_client --> off
rsync_export_all_ro --> on
rsync_full_access --> off

不幸的是,这仍然无法让我访问系统上的所有文件。具体来说,我下面有一些文件/var/spool/postfix/private不可读:

rsync: readlink_stat("/var/spool/postfix/private/defer" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/trace" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/verify" (in root)) failed: Permission denied (13)
rsync: readlink_stat("/var/spool/postfix/private/proxymap" (in root)) failed: Permission denied (13)
...

/var/spool/postfix/private与from相关的一个示例条目audit2why -a如下。请注意,没有任何条目引用rsync_export_all_ro

type=AVC msg=audit(1565118203.332:21775): avc:  denied  { getattr } for  pid=26597 comm="rsync" path="/var/spool/postfix/private/scache" dev="dm-0" ino=9148374 scontext=system_u:system_r:rsync_t:s0 tcontext=system_u:object_r:postfix_private_t:s0 tclass=sock_file permissive=0
        Was caused by:
        The boolean rsync_full_access was set incorrectly.
        Description:
        Allow rsync to full access

        Allow access by executing:
        # setsebool -P rsync_full_access 1

我不明白为什么有对rsync_full_access(我不想设置,也不应该触发)的引用,但没有对rsync_export_all_ro.

为了获得完整的备份,如何将此目录树添加到守护程序可以导出的文件集中rsync? (并且此更改在重新启动后保持不变。)

答案1

您不想为rsync_t域禁用 SELinux 是对的。不幸的是,尽管可配置性rsync 的 SELinux 实现相当广泛,但在某些边缘情况下,设置rsync_export_all_ro布尔值仍然会不是允许 rsync 守护进程访问某些文件。有一个 Bugzilla 条目这与你的麻烦非常相似。给出的建议是使用rsync_full_access来克服问题,尽管会损害安全性(它仍然比semanage permissive -a rsync_t尽管好)。

创建自定义策略模块

因此,回答你的问题,如果你想使用更安全的选项rsync_export_all_ro 为了能够让 rsync 守护进程访问“边缘情况”文件/目录,您需要创建自己的策略模块。

这是通过让 rsync 守护进程在宽容模式下工作、捕获 AVC 拒绝、然后将 AVC 拒绝转换为策略来完成的,如下所示:

# put SELinux in permissive mode
setenforce 0

# --- do your rsync stuff ---

# get related AVC denials
# I'm using 'recent' here, depending on the rsync run time please adjust accordingly
ausearch -m avc -ts recent --subject rsync_t

# go through the output. If you're satisfied, create the module
ausearch -m avc -ts recent --subject rsync_t | audit2allow -m roaima-rsync-custom-1 > roaima-rsync-custom-1.te
checkmodule -M -m -o roaima-rsync-custom-1.mod roaima-rsync-custom-1.te
semodule_package -o roaima-rsync-custom-1.pp -m roaima-rsync-custom-1.mod

# load the policy module
semodule -i roaima-rsync-custom-1.pp

# disable permissive mode
setenforce 1

# --- do your rsync stuff again --

捕获未经审核的 AVC 拒绝(“dontaudit”)

如果由于某种原因,“边缘情况”文件仍然无法访问并且该ausearch命令没有产生结果,则您可能会遇到“dontaudit”规则。

要重建 SELinux 策略并忽略所有“dontaudit”规则,请运行semodule -DB.该-D选项禁用“dontaudit”规则;该-B选项重建策略。

然后尝试是否可以触发审核日志事件。如果是这样,请像上面所示捕获它们,创建 SELinux 模块,然后通过运行以下命令重新启用“dontaudit”规则semodule -B

要获取“dontaudit”规则的完整列表,请运行sesearch --dontaudit命令。使用-s域选项和命令缩小搜索范围grep。例如:sesearch --dontaudit -s rsync_t

相关内容