SELinux、Nginx 和 fcgiWrap:如何允許存取 fcgiWrap 套接字?

SELinux、Nginx 和 fcgiWrap:如何允許存取 fcgiWrap 套接字?

我在 Fedora 31(linux 核心 5.4.13、Nginx 1.16.1、fcgiwrap 1.1.0)下使用 SELinux 在強制模式下運行(策略:針對 3.14.4-44.fc31)。

我的盒子託管著一個由 Nginx 驅動的伺服器。部分依賴 Perl 腳本。 Nginx 已配置為使用 fcgiwrap 透過 FastCGI 移交 CGI 執行槽(透過 Unix 套接字 /var/run/fcgiwrap/ 連接)[電子郵件受保護])。

一切都在「寬容」模式下進行了測試。然後切換到“強制”模式。我收到了一堆 AVC,可以按照審計意見的建議來處理更改布林值或建立自訂策略。

然而,無法對一個 AVC 進行尋址。雜誌講述:

 type=AVC msg=audit(1580046727.459:548): avc:  denied  { connectto } for  pid=4619 comm="nginx" path="/run/fcgiwrap/fcgiwrap-0.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0

自訂策略包含以下內容:

module nginx 1.0;

require {
    type httpd_t;
    type soundd_port_t;
    type http_port_t;
    type tor_port_t;
    type unconfined_service_t;
    type httpd_user_content_t;
    class tcp_socket { name_bind name_connect };
    class file { getattr read };
    class unix_stream_socket connectto;
}

#============= httpd_t ==============

#!!!! This avc is allowed in the current policy
allow httpd_t http_port_t:tcp_socket name_connect;

#!!!! This avc is allowed in the current policy
allow httpd_t httpd_user_content_t:file { getattr read };
allow httpd_t soundd_port_t:tcp_socket name_bind;

#!!!! This avc is allowed in the current policy
allow httpd_t tor_port_t:tcp_socket name_connect;
allow httpd_t unconfined_service_t:unix_stream_socket connectto;

從自動產生的註釋中可以看出,該自訂策略沒有任何作用,因為它已經包含在全域策略中。

添加此模組後,沒有任何變化。我仍然收到 AVC 警報,建議進行相同的修復。

如果我恢復為“寬容”或設定網域httpd在寬容模式下,CGI 腳本將被執行並且我會收到預期的輸出。

ls -Z /var/run/fcgiwrap/fcgiwrap-0.sock返回:

system_u:object_r:httpd_var_run_t:s0 /var/run/fcgiwrap/fcgiwrap-0.sock

我無法找到標籤的httpd_var_run_t使用位置以及布林值是否控制對此文件類型的存取(我在 SELinux 配置方面是個新手)。

如何在「強制」模式下授予對套接字的存取權限?

編輯 2020-01-27

看起來模組中已經有轉換規則阿帕契為了:

allow httpd_t unconfined_service_t:unix_stream_socket connectto;

但它無效或另一個模組(哪個?)正在阻止它。臨時解決方法是將域httpd在寬容模式下,但我不喜歡它,因為現在任何網頁伺服器都可以做任何事情。

知道為什麼過渡被拒絕嗎?

答案1

我還沒有充分檢查或測試這一點——事實上,我很確定僅靠這一點是行不通的。

我假設路徑的建立/var/run/fcgiwrap具有目錄類型unconfined_service_t,但我不確定是否確實如此。

然而,這應該能讓你開始。

policy_module(nginx_local, 31.0.0)

require {
  type httpd_t;
  type unconfined_service_t;
}

stream_connect_pattern(httpd_t, unconfined_service_t, unconfined_service_t, unconfined_service_t)

至於網路問題,您可能只想打開布林值httpd_can_network_connect,這應該已經消除了其中的一些問題。除非你想具體說明這一點。

在最好和理想的情況下,最好為您的fcgi 進程製定特定的策略,但這是一項更困難的任務,因此讓nginx 與不受限制的服務互動(雖然安全性較低)要容易得多。

相關內容