SELinux:限制httpd出站连接的地址和端口?

我们有一个多主机环境,在一台主机上使用httpd,在另一台主机上使用一台应用程序服务器。 我们想在httpd主机上使用SELinux,默认的目标策略导致很less的问题。 但它确实阻止了httpd将出站networking连接到应用服务器主机。

有一个SELinux布尔httpd_can_network_connect ,如果设置将允许无限的出站连接,但我想find一个更狭窄的解决scheme。 我想我可以通过定义一个新的端口types列表来控制目标端口:

semanage port -a -t ajp_port_t -p tcp 9010

然后用以下方法创build一个本地策略:

允许httpd_t ajp_port_t:tcp_socket {name_connect};

我怎样才能控制目的地址?

以下SELinux政策将需要设置。 注:我在这里假设ajp_port_ttypes实际上并不存在于系统上。

 policy_module(myhttpd, 1.0.0) gen_require(` type httpd_t; ') type ajp_packet_t; corenet_packet(ajp_packet_t) type ajp_port_t; corenet_port(ajp_port_t) allow httpd_t ajp_port_t:tcp_socket { client_stream_socket_perms name_connect }; allow httpd_t ajp_port_t:packet { flow_in flow_out forward_in forward_out recv send }; 

按照这个命令

 semanage port -a -t ajp_port_t -p tcp 9010 

要pipe理地址,那有点复杂。 而你的责任可能会导致该框停止响应通过networking! 所以要警告。

为此,您将需要此策略模块,它允许所有域发送/ recv未标记的数据包。 如果你这样做,你可能会失去networking,因为默认情况下几乎所有的域名都没有权限发送/ recv未标记的数据包!

 policy_module(unconfined_packets, 1.0.0) require { attribute domain; type unlabeled_t; } gen_tunable(allow_unlabeled_packets, `true'); tunable_policy(allow_unlabeled_packets, ` allow domain unlabeled_t:packet { flow_in flow_out forward_in forward_out recv send }; ') 

然后,您必须使用iptables标记来自该主机的入站和出站数据包。

 iptables -I INPUT -p tcp --sport 9010 -s <src_addr> -j SECMARK --selctx system_u:object_r:ajp_packet_t iptables -I OUTPUT -p tcp --dport 9010 -d <dst_addr> -j SECMARK --selctx system_u:object_r:ajp_packet_t iptables -A INPUT -j CONNSECMARK --restore iptables -A OUTPUT -j CONNSECMARK --save