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

Eri*_*ath 7 selinux rhel6

在 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 using 下的端口列表semanage port -l | grep http_port_t,但我不知道这个列表存储在哪里,也不知道下yum update一个新策略是否会覆盖该列表。

连接的替代方法是使用以下命令创建新的端口列表:

semanage port -a -t ajp_port_t -p tcp 9010

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

允许 httpd_t ajp_port_t:tcp_socket { name_connect };

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

Ign*_*ams 4

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

  • 谢谢!我进一步研究了这一点,发现“semanage port”命令导致了“/etc/selinux/(policy-name)/modules/active/ports.local”的创建或修改。我还能够在本地策略中定义新的端口列表(例如 ajp_port_t),激活该策略,然后使用 semanage 填充 ajp_port_t。 (2认同)