Fedora

SELinux 不允許讀取 ~/.cert 上的文件

  • April 16, 2019

我是 Fedora 23 和 SELinux 的新手。我通過 NetworkManager 使用 OpenVPN 客戶端。我在裡面儲存了我需要 OpenVPN 訪問的所有文件(證書、CA 和私鑰)~/.cert並執行updatecon -R -v ~/.cert. 但是,我仍然收到來自 SELinux 的 AVC 錯誤,他們不允許 OpenVPN 訪問此類文件。這是輸出的相關部分grep AVC /var/log/audit/audit.log | less

type=AVC msg=audit(1457179403.296:364): avc:  denied  { open } for  pid=2608 comm="nm-openvpn-serv" path="/home/ggoncalves/.cert/ggoncalves.key" dev="dm-2" ino=2888752 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.296:365): avc:  denied  { open } for  pid=2608 comm="nm-openvpn-serv" path="/home/ggoncalves/.cert/ggoncalves.key" dev="dm-2" ino=2888752 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.330:366): avc:  denied  { read } for  pid=2611 comm="openvpn" name="lastline-ca.crt" dev="dm-2" ino=2888749 scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.332:367): avc:  denied  { read } for  pid=2611 comm="openvpn" name="ggoncalves.crt" dev="dm-2" ino=2888751 scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0
type=AVC msg=audit(1457179403.332:368): avc:  denied  { read } for  pid=2611 comm="openvpn" name="ggoncalves.key" dev="dm-2" ino=2888752 scontext=system_u:system_r:openvpn_t:s0 tcontext=system_u:object_r:svirt_sandbox_file_t:s0:c50,c545 tclass=file permissive=0

由於我只使用 SELinux 幾天,我不知道從哪裡開始尋找它。有什麼提示嗎?

**編輯:**在我看來,問題出在svirt_sandbox_file_t標籤上。我相信這些文件應該被標記為home_cert_t.

**編輯 2:**事實上,svirt_sandbox_file_t由於某種原因,我的整個主目錄都被標記了。這是 Docker 策略的功能還是錯誤?

更新

好吧,這需要一段時間。讓我進一步描述這個問題,以防有人最終遇到同樣的問題。事實證明,svirt_sandbox_file_t當我將主目錄掛載為帶有:Z標誌的捲時,Docker 已將其歸因於(如此所述)。然後 Docker 將該標籤遞歸地應用於我的整個主目錄,並且不知何故重新配置 FS 標籤或應用都restorecon不起作用。

為了將我的家恢復到原始權限,我rsync將它放到一個臨時文件夾中,刪除了其中rsync的所有內容並返回。不是最聰明的主意,但它奏效了。

文件的目標上下文類型仍然錯誤:

svirt_sandbox_file_t

中的文件~/.cert應標記為home_cert_t. 再試一次

restorecon -Rf ~/.cert

或嘗試強制類型:

chcon -t home_cert_t ~/.cert/*

selinux-policy 或 docker selinux 策略中可能存在一些錯誤,導致錯誤的預設標籤。

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