我们有一个多主机环境,其中一台主机上有 httpd,另一台主机上有应用服务器。我们想在 httpd 主机上使用 SELinux,默认的定向策略几乎不会引起任何问题。但它确实会阻止 httpd 建立与应用服务器主机的出站网络连接。
有一个 SELinux 布尔值httpd_can_network_connect
,如果设置,将允许无限制的出站连接,但我想找到一个更狭窄的解决方案。我想我可以通过定义一个新的端口类型列表来控制目标端口:
semanage 端口 -a -t ajp_port_t -p tcp 9010
然后创建以下内容的本地策略:
允许httpd_t ajp_port_t:tcp_socket {name_connect};
我如何控制目标地址?
答案1
需要以下 SELinux 策略来进行设置。注意:我在这里假设 ajp_port_t 类型目前在系统中实际上并不存在。
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
要管理地址,这有点复杂。而且你可能会导致盒子停止通过网络响应!所以要小心。
为此,您需要此策略模块,它允许所有域发送/接收未标记的数据包。如果您不首先执行此操作可能会导致丢失网络,因为默认情况下几乎所有域都没有权限发送/接收未标记的数据包!
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