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

Eri*_*ath 3 selinux

我们有一个多主机环境,一台主机上有 httpd,另一台主机上有一个应用程序服务器。我们想在 httpd 主机上使用 SELinux,默认的目标策略不会引起什么问题。但它确实阻止了 httpd 与应用服务器主机建立出站网络连接。

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

semanage port -a -t ajp_port_t -p tcp 9010

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

允许 httpd_t ajp_port_t:tcp_socket { name_connect };

如何控制目标地址?

Mat*_*Ife 6

需要以下 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 };
Run Code Online (Sandbox Code Playgroud)

按照命令执行此操作

semanage port -a -t ajp_port_t -p tcp 9010
Run Code Online (Sandbox Code Playgroud)

要管理地址,那有点复杂。并且您可能会导致盒子停止通过网络响应!所以要小心。

为此,您需要这个策略模块,它允许所有域发送/接收未标记的数据包。如果您不先这样做,您可能会丢失网络,因为默认情况下几乎所有域都没有发送/接收未标记数据包的权限!

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 };
')
Run Code Online (Sandbox Code Playgroud)

然后,您必须使用 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
Run Code Online (Sandbox Code Playgroud)