Linux

CentOS 7 - 通過 VSFTPD 創建的目錄不繼承 SELinux 上下文

  • April 2, 2016

我們公司有一個 CentOS 7 的網路伺服器,我們的客戶通過 FTP (vsftpd) 管理他們的網站。SELinux 處於強制模式。

問題是通過 VSFTPD 創建/上傳的數據沒有繼承適當的 SELinux 上下文。讓我解釋。

例如,對於 WordPress 網站,伺服器開箱即用,已經有幾個可以使用 看到的規則semanage fcontext -l |grep '/var/www',它們是:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

因此,當我將 WordPress 站點從另一台伺服器複製到/var/www/html/SSH 中的目錄時,這些文件夾wp-content/wp-content/uploads/具有適當的httpd_sys_rw_content_t安全上下文。但是,當通過 FTP 創建這些文件夾時,它們獲得的上下文是httpd_sys_content_t(沒有rw)。這意味著我們的客戶上傳到伺服器的站點即使向 apache 使用者/組授予寫入權限,也無法寫入這些目錄,因此 WordPress 管理員不起作用。因此,當他們上傳網站時,他們必須請求我們的支持來解決這個問題,這對所有相關人員來說都是浪費時間。

假設客戶將他們的網站上傳到httpdocs,如果通過 SSH 我這樣做mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fr,問題就解決了,所以數據沒有問題。

我也可以restorecon -Rv httpdocs/解決問題。

所以,問題是:如何讓通過 VSFTPD 創建/上傳的目錄繼承正確的 SELinux 上下文,就像通過 SSH 創建/上傳目錄時繼承它們一樣?

在執行時發生的預設標籤與在伺服器上應用的基於正則表達式的後標籤策略之間存在差異。

您在此處注意到的內容:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

是貼標政策。

您在問題中討論的內容實際上與執行時策略有關。

當使用 SELinux 在目錄中創建條目時,管理文件或目錄最終標籤的規則不是由您引用的正則表達式決定,而是由以下規則決定(我相信這是正確的順序,但可能遺漏了一些東西) .

  1. 有一個明確的命名type_transition規則。
  2. 有一個明確的未命名type_transition規則。
  3. 繼承與父目錄相同的上下文。
  4. 應用default_context.

因此,當我通過 SSH 將 WordPress 站點從另一台伺服器複製到 /var/www/html/ 中的目錄時,文件夾 wp-content/ 和 wp-content/uploads/ 具有正確的 httpd_sys_rw_content_t 安全上下文。

所以,是的,它確實這樣做了,但不是因為你認為它這樣做的原因。當然不是因為貼標政策。

type_transition發生這種情況是因為存在提供此行為的特定命名規則。

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

這基本上是在說。

  • 如果你是unconfined_t 並且
  • 如果您在目標類型中執行操作httpd_sys_content_t 並且
  • 如果新條目的類是目錄並且
  • 如果新條目的名稱是“uploads” ,那麼
  • 新類型是httpd_sys_rw_content_t

這適用於 SSHD 的原因是,在您登錄後,您將獲得unconfined_t適用此規則的源上下文。

這不適用於 FTP 服務,因為該服務的源上下文很可能ftpd_t沒有匹配規則。

因此,您需要修改策略以改變 SELinux 的行為,以同樣遵守您在其他 FTP 條目中看到的命名文件規則。

至少在 Fedora 23 中,存在一個允許這樣做的介面,像這樣的策略模組可以做到這一點。

policy_module(local_ftpd, 7.2.0)

require {
 type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

您可以通過確保selinux-policy-devel包已安裝並正在執行來載入它make -f /usr/share/selinux/devel/Makefile load

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