SElinux: zezwól httpd na połączenie z określonym portem

41

W moim systemie działa CentOS 6.4 z apache2.2.15. SElinux wymusza i próbuję połączyć się z lokalną instancją redis poprzez moją aplikację python / wsgi. Otrzymuję błąd 13, odmowa dostępu. Mogę to naprawić za pomocą polecenia:

setsebool -P httpd_can_network_connect

Jednak nie chcę, aby httpd mógł łączyć się ze wszystkimi portami TCP. Jak mogę określić, z którymi portami / sieciami httpd może się łączyć? Gdybym mógł stworzyć moduł pozwalający httpd na połączenie z portem 6379 (redis) lub dowolnym tcp na 127.0.0.1, byłoby to preferowane. Nie jestem pewien, dlaczego moja paranoja jest w tym tak silna, ale hej ...

Ktoś wie?

savagecitizen
źródło
Czy nie byłoby lepiej zmusić go do przejścia przez serwer proxy? W ten sposób możesz a) mieć lepszą kontrolę nad tym, co jest dostępne, b) mieć lepszą kontrolę tego, co się wydarzyło i kiedy.
Cameron Kerr

Odpowiedzi:

51

Domyślnie polityka SELinux zezwala usługom na dostęp tylko do rozpoznanych portów powiązanych z tymi usługami:

# 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.

- dodaj port Redis (6379) do polityki 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.

Możesz także zainstalować setroubleshoot-serverRPM i uruchomić: sealert -a /var/log/audit/audit.log- da ci ładny raport z przydatnymi sugestiami (w tym powyższą komendą).

Skrypt PHP do testowania połączenia:

# 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
źródło
3
Miałem problem z Fedorą 23 do wysyłania wiadomości e-mail (poprzez połączenie z 127.0.0.1 na porcie 25) ze skryptu perl (używając Net :: SMTP) uruchomionego z httpd. „Zezwolenie httpd na połączenie z portem 25” nie jest tym, czego się szuka. Rzeczywiście dodanie portu 25 do typu SELinux http_port_tpowiodło się, ponieważ port 25 jest już używany (dla innego typu SELinux) ValueError: Port tcp/25 already defined. Prawidłowym sposobem na zezwolenie httpd na połączenie z portem 25 jest ustawienie odpowiedniej wartości logicznej polityki SELinux na: setsebool -P httpd_can_sendmail on(patrz getseebool -a). (ciąg dalszy w części 2)
David Tonhofer
1
(ciąg dalszy od strony 1), ale jeśli chcesz wysłać ze skryptu Perl, trzeba jawnie utworzyć moduł SELinux, które pozwala, że: sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. To działa!
David Tonhofer
@DavidTonhofer Drobne literówki w getsebool -apoleceniu (jeden mniej e).
davidjb
1
@DavidTonhofer nie musisz tworzyć nowej polityki dla istniejącego portu, możesz ją zamiast tego zmodyfikować: semanage port -m -t http_port_t -p tcp 25patrzsemanage port --help
HTF
W przypadku zabbix istnieje już specyficzna wartość logiczna w CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer
17

Może być konieczne użycie

semanage port -m -t http_port_t -p tcp 6379

Jeśli brakuje semanage, dodaj pakiet policycoreutils-python

yum install policycoreutils-python
Tom Hallam
źródło
semanagemoże być policycoreutils-python-utilsteraz (przynajmniej na Fedorze 23)
David Tonhofer
1
CentOS 7 nadal zawiera semanagew policycoreutils-python.
jxmallett
dziękuję za udzielenie odpowiedzi na pytanie zamiast czegoś innego.
Florian Heigl
3

Możesz tymczasowo wprowadzić selinux w tryb zezwolenia i pozwolić httpd połączyć się z redis, a następnie wygenerować i zbudować niestandardowy moduł zasad za pomocą audit2allow

JESTEM
źródło