我有许多基于 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 标签的各种权限错误。进一步挖掘,我发现了对SELinux 策略的引用,该策略允许rsync
守护程序以只读方式导出所有文件:
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
守护程序导出的文件集中?(并且此更改在重新启动后保持不变。)
您不想为
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 拒绝转换为策略来完成的,如下所示:
捕获未经审计的 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
。