Centos

執行 selinux 策略的 rsync 守護程序 rsync_export_all_ro 仍然阻止訪問 /var/spool/postfix/private/ 下的文件

  • January 25, 2022

我有許多基於 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

引用自:https://unix.stackexchange.com/questions/534131