我在 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 與不受限制的服務互動(雖然安全性較低)要容易得多。