SElinux: permite que o httpd se conecte a uma porta específica

41

Meu sistema está executando o CentOS 6.4 com apache2.2.15. O SElinux está em vigor e estou tentando conectar-me a uma instância local de redis através do meu aplicativo python / wsgi. Eu recebo o erro 13, permissão negada. Eu poderia corrigir isso através do comando:

setsebool -P httpd_can_network_connect

No entanto, não quero exatamente que o httpd possa se conectar a todas as portas tcp. Como posso especificar a quais portas / redes o httpd pode se conectar? Se eu pudesse criar um módulo para permitir que o httpd se conectasse à porta 6379 (redis) ou qualquer tcp no 127.0.0.1, isso seria preferível. Não sei por que minha paranóia é tão forte nisso, mas ei ...

Ninguem sabe?

savagecitizen
fonte
Não seria melhor forçá-lo a sair por meio de um proxy? Dessa forma, você pode: a) ter melhor controle sobre o que pode ser acessado; b) ter melhor auditoria sobre o que aconteceu e quando.
Cameron Kerr #

Respostas:

51

Por padrão, a política do SELinux permitirá apenas o acesso de serviços a portas reconhecidas associadas a esses serviços:

# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Cannot connect to redis server.

- adicione a porta Redis (6379) à política do SELinux

# semanage port -a -t http_port_t -p tcp 6379
# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      6379, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Connected successfully.

Você também pode instalar setroubleshoot-serverRPM e execute: sealert -a /var/log/audit/audit.log- ele vai te dar um bom relatório com sugestões úteis (incluindo comando acima).

Script PHP para testar a conexão:

# cat redis.php 
<?php

$redis=new Redis();
$connected= $redis->connect('127.0.0.1', 6379);

if(!$connected) {
        die( "Cannot connect to redis server.\n" );
}

echo "Connected successfully.\n";

?>
HTF
fonte
3
Eu tive o problema no Fedora 23 para enviar email (conectando-se ao 127.0.0.1 na porta 25) a partir de um script perl (usando Net :: SMTP) iniciado a partir do httpd. "A permissão para o httpd se conectar à porta 25" não é o que se procura nesse caso. Na verdade a adição de porta 25 com o tipo de SELinux http_port_tfalha porque a porta 25 é já utilizado (para outro tipo SELinux): ValueError: Port tcp/25 already defined. A maneira correta de permitir que o httpd se conecte à porta 25 é definir a política SELinux correspondente em: setsebool -P httpd_can_sendmail on(consulte getseebool -a). (continuação na parte 2)
David Tonhofer
11
(continuação da parte 1) Mas se você quiser enviar a partir de um script perl, você tem que criar explicitamente um módulo de SELinux que permite que: sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. Então funciona!
David Tonhofer
@DavidTonhofer Menor erro de digitação no getsebool -acomando (um a menos e).
Davidjb
11
@DavidTonhofer, você não precisa criar uma nova política para a porta existente; em vez disso semanage port -m -t http_port_t -p tcp 25, pode modificá-la: veja:semanage port --help
HTF
Para o zabbix, já existe um booleano específico no CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer
17

Você pode precisar usar

semanage port -m -t http_port_t -p tcp 6379

Se falta a semântica, adicione o pacote policycoreutils-python

yum install policycoreutils-python
Tom Hallam
fonte
semanagepode estar em policycoreutils-python-utilsagora (pelo menos no Fedora 23)
David Tonhofer
11
CentOS 7 inclui ainda semanageno policycoreutils-python.
precisa saber é o seguinte
obrigado por dar uma resposta à pergunta em vez de outra coisa.
Florian Heigl
3

Você pode colocar temporariamente o selinux no modo permissivo e permitir que o httpd se conecte ao redis, em seguida, gere e construa um módulo de política personalizado usando o audit2allow

SOU
fonte