我有许多基于 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
。