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 已配置为通过 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 只与不受限制的服务进行交互 - 虽然不太安全 - 但要容易得多。

相关内容