semanage
cria novos módulos que não estão sob o controle do pacote de políticas. Quando o pacote de políticas é atualizado, esses módulos permanecerão e serão aplicados à nova política quando ela for carregada.
No RHEL 6.2, estamos usando o httpd em um host como um proxy front-end para o Tomcat em outro host, e também temos o mod_status configurado para escutar em uma porta não padrão para fornecer informações de status a uma ferramenta de monitoramento. Portanto, precisamos do httpd para 1) estabelecer conexões de rede e 2) ouvir em uma porta não padrão.
A política de segmentação padrão (atualmente no modo permissivo) apenas permite que o httpd escute em uma lista definida de portas ( semanage port -l | grep http_port_t
) e não permitirá que o httpd faça conexões de rede de saída. aureport -a
mostra as negações do AVC quando o httpd tenta ligar-se à porta de status personalizada e quando tenta se conectar às portas AJP no outro host.
Eu encontrei duas soluções, mas uma parece permissiva demais, e a outra muito frágil (isto é, é provável que apresente uma política de atualização).
Eu usei audit2allow
para gerar uma fonte de política local e, em seguida, checkmodule
para compilá-la, semodule_package
para gerar um pacote de política e semanage
para começar a aplicá-la. Eu reiniciei o httpd e confirmei que nenhuma negação de AVC foi gerada. A política local gerada pelo audit2allow usou a seguinte concessão:
allow httpd_t port_t:tcp_socket { name_bind name_connect };
que permite ao httpd ligar-se a qualquer porta (não apenas às listadas em http_port_t) e a conectar-se a qualquer porta. A vantagem dessa abordagem é que ela está contida em uma política local e não será substituída no próximo yum update
. O con é que concede uma permissão mais ampla do que o necessário; O httpd pode ligar e conectar-se a qualquer porta.
A alternativa para ligação é usar o seguinte comando para adicionar nossa porta personalizada à lista http_port_t:
semanage port -a -t http_port_t -p tcp (custom-port-number)
Eu sei que posso ver a lista de portas em http_port_t usando semanage port -l | grep http_port_t
, mas não sei onde essa lista está armazenada e não sei se o próximo yum update
com uma nova diretiva substituirá a lista .
A alternativa para conexão é usar o seguinte comando para criar uma nova lista 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 };
Assim como a lista http_port_t aumentada, não sei se minha nova lista ajp_port_t
sobreviverá à instalação de uma nova versão de política segmentada.