執行 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 標籤的各種權限錯誤。進一步探勘,我發現了對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 拒絕轉換為策略來完成的,如下所示:
# 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
。