SELinux: Limita conexões de saída do httpd por endereço e porta?

2

Temos um ambiente de vários hosts com o httpd em um host e um servidor de aplicativos em um segundo. Gostaríamos de usar o SELinux no host httpd, e a política de segmentação padrão causa poucos problemas. Mas isso impede que o httpd estabeleça a conexão de rede de saída com o host do servidor de aplicativos.

Há um SELinux booleano httpd_can_network_connect que, se definido, permitirá conexões de saída ilimitadas, mas eu gostaria de encontrar uma solução mais restrita. Acho que posso controlar as portas de destino definindo uma nova lista de tipos de portas:

semanage port -a -t ajp_port_t -p tcp 9010

e crie uma política local com o seguinte:

allow httpd_t ajp_port_t:tcp_socket { name_connect };

Como posso controlar o endereço de destino?

    
por Eric Rath 06.03.2012 / 18:26

1 resposta

6

A seguinte política do SELinux será necessária para configurá-lo. NOTA: Eu assumo aqui que o tipo ajp_port_t não existe atualmente no sistema atualmente.

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 };

Siga isto pelo comando

semanage port -a -t ajp_port_t -p tcp 9010

Para gerenciar o endereço, isso é um pouco mais complicado. E você pode possivelmente fazer com que a caixa pare de responder pela rede! Então esteja avisado.

Para isso, você precisará deste módulo de política, ele permite que todos os domínios enviem / recebam pacotes não marcados. Se você não fizer isso primeiro, poderá perder a rede, pois, por padrão, quase todos os domínios não têm permissões para enviar / receber pacotes não marcados!

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 };
')

Em seguida, você deve marcar os pacotes de entrada e saída desse host usando o 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
    
por 09.03.2012 / 01:01

Tags