Linux

無法將 SELinux 文件上下文應用於帶有符號連結的路徑

  • February 18, 2016

我有一個正在企業環境中安裝的解決方案。該解決方案及其部署指南旨在安裝在啟用 SELinux 的 RHEL7/CentOS7 伺服器上,並根據文件系統層次結構標準將組件安裝到位置。

然而,其中一位客戶令我們驚訝的是,所有 3rd 方解決方案都必須安裝到一個/apps目錄中,因為他們根據策略對此進行了備份。

為了避免這個特定客戶端的偏差,因為它需要對解決方案進行重大修改,我們決定最好的方法是在目錄中創建一個新目錄/apps/opt並從 true 預先創建符號連結,/opt並對其應用相同的 SELinux 內容(usr_t) 例如:

ls -laZ /appl/opt
drwxr-xr-x. root     root     unconfined_u:object_r:usr_t:s0   .
drwxr-xr-x. root     root     unconfined_u:object_r:default_t:s0 ..
drwxr-xr-x. product product unconfined_u:object_r:usr_t:s0   product

la -laZ /opt
drwxr-xr-x. root root system_u:object_r:usr_t:s0       .
dr-xr-xr-x. root root system_u:object_r:root_t:s0      ..
lrwxrwxrwx. root root unconfined_u:object_r:usr_t:s0   product -> /apps/opt/product/

產品的某些組件是通過 Apache HTTPD 訪問的,並且需要將httpd_sys_content_t上下文應用於它們。

這些文件位於/opt/product/wwwstatic/(實際上是/apps/opt/product/wwwstatic/)。

部署指南指定了以下要執行的命令:

semanage fcontext -a -t httpd_sys_content_t "/opt/product/wwwstatic/*"
restorecon -Rv /opt/product/wwwstatic

它恢復了標準安裝上的上下文,但在這個環境中,由於符號連結,它失敗了。

如果您修改命令以包含/apps它可以工作但偏離通用方法的目錄。

的內容/etc/selinux/targeted/contexts/files/file_contexts.local是:

# This file is auto-generated by libsemanage
# Do not edit directly.

/appl/opt/.*    system_u:object_r:usr_t:s0
/appl/srv/.*    system_u:object_r:var_t:s0
/opt/product/wwwstatic/*    system_u:object_r:httpd_sys_content_t:s0

是否有修改參數semanagerestorecon命令的方法,以便這適用於符號連結(以及正常情況),或者我對 SELinux 如何應用文件上下文有根本的誤解?

我相信這個問題不同於How do I assign an SELinux label to a symlink with semanage 所以它在重新標記後仍然存在?因為它是關於將上下文應用於符號連結目錄的子目錄中的文件,而不是將上下文應用於符號連結文件本身。

您可以使用realpath部署指南中的命令來確保說明是通用的,但將上下文應用於可能實際存在的真實文件系統位置。

`realpath "/opt/product/wwwstatic"`

SELinux 文件上下文根據實際文件系統路徑進行匹配。沒有“跟隨符號連結”。因此,您的自定義上下文需要引用磁碟上的實際位置。

第三方應用程序的標準位置 /opt,所以你在這裡是正確的。如果您的客戶想要做一些非標準的事情,那麼您應該向他們說明他們做錯了,以及這樣做的額外成本(時間和金錢)是多少。

引用自:https://serverfault.com/questions/739472