![在 SELinux 中管理自定义端口的最佳方法](https://linux22.com/image/576569/%E5%9C%A8%20SELinux%20%E4%B8%AD%E7%AE%A1%E7%90%86%E8%87%AA%E5%AE%9A%E4%B9%89%E7%AB%AF%E5%8F%A3%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95.png)
在 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
创建不受策略包控制的新模块。策略包升级时,这些模块将保留,并在加载新策略时应用于新策略。