我在 Fedora 31(Linux 内核 5.4.13、Nginx 1.16.1、fcgiwrap 1.1.0)下以强制模式运行 SELinux(策略:目标 3.14.4-44.fc31)。
我的机器托管一个由 Nginx 驱动的服务器。它的一部分依赖于 Perl 脚本。Nginx 已配置为通过 FastCGI 和 fcgiwrap 移交 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 只与不受限制的服务进行交互 - 虽然不太安全 - 但要容易得多。