在 SELinux 中管理自定义端口的最佳方法

在 SELinux 中管理自定义端口的最佳方法

在 RHEL 6.2 上,我们在一台主机上使用 httpd 作为另一台主机上 Tomcat 的前端代理,并且我们还配置了 mod_status 来监听非标准端口,以便向监控工具提供状态信息。因此,我们需要 httpd 1) 建立网络连接,2) 监听非标准端口。

默认目标策略(当前处于宽容模式)仅允许 httpd 在定义的端口列表上侦听(semanage port -l | grep http_port_t),并且不允许 httpd 建立出站网络连接。 aureport -a显示当 httpd 尝试绑定到自定义状态端口时以及尝试连接到另一台主机上的 AJP 端口时发生的 AVC 拒绝。

我找到了两种解决方案,但一种似乎太宽松,另一种太脆弱(即在策略升级时可能崩溃)。

“广泛”的解决方案

我过去常常audit2allow生成本地策略源,然后checkmodule对其进行编译,semodule_package生成策略包并semanage开始执行。然后我重新启动 httpd,并确认没有生成 AVC 拒绝。audit2allow 生成的本地策略使用了以下授权:

允许httpd_t port_t:tcp_socket {name_bind name_connect};

它允许 httpd 绑定到任何端口(不仅仅是 http_port_t 中列出的端口),并连接到任何端口。这种方法的优点是它包含在本地策略中,并且不会在下一个策略中被覆盖yum update。缺点是它授予了比必要更多的权限;httpd 可以绑定和连接到任何端口。

“狭隘”的解决方案

绑定的另一种方法是使用以下命令将我们的自定义端口添加到 http_port_t 列表中:

semanage port -a -t http_port_t -p tcp (自定义端口号)

我知道使用可以看到http_port_t下的端口列表semanage port -l | grep http_port_t,但是我不知道这个列表存储在哪里,也不知道下一个yum update采用新策略的策略是否会覆盖该列表。

连接的另一种方法是使用以下命令来创建新的端口列表:

semanage 端口 -a -t ajp_port_t -p tcp 9010

然后创建以下内容的本地策略:

允许httpd_t ajp_port_t:tcp_socket {name_connect};

就像增强的 http_port_t 列表一样,我不知道我的新ajp_port_t列表是否能够在新的目标策略版本安装后继续存在。

答案1

semanage创建不受策略包控制的新模块。策略包升级时,这些模块将保留,并在加载新策略时应用于新策略。

相关内容