SElinux: httpd erlauben, eine Verbindung zu einem bestimmten Port herzustellen

SElinux: httpd erlauben, eine Verbindung zu einem bestimmten Port herzustellen

Auf meinem System läuft CentOS 6.4 mit Apache2.2.15. SElinux wird erzwungen und ich versuche, über meine Python/WSGI-App eine Verbindung zu einer lokalen Instanz von Redis herzustellen. Ich erhalte Fehler 13, Zugriff verweigert. Ich könnte dies mit dem folgenden Befehl beheben:

setsebool -P httpd_can_network_connect

Ich möchte jedoch nicht unbedingt, dass httpd eine Verbindung zu allen TCP-Ports herstellen kann. Wie kann ich angeben, zu welchen Ports/Netzwerken httpd eine Verbindung herstellen darf? Wenn ich ein Modul erstellen könnte, das es httpd ermöglicht, eine Verbindung zu Port 6379 (Redis) oder jedem TCP auf 127.0.0.1 herzustellen, wäre das wünschenswert. Ich weiß nicht genau, warum meine Paranoia diesbezüglich so stark ist, aber hey ...

Weiß jemand?

Antwort1

Standardmäßig erlaubt die SELinux-Richtlinie Diensten nur den Zugriff auf erkannte Ports, die mit diesen Diensten verknüpft sind:

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

- Redis-Port (6379) zur SELinux-Richtlinie hinzufügen

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

Sie können auch setroubleshoot-serverRPM installieren und ausführen: sealert -a /var/log/audit/audit.log– Sie erhalten einen schönen Bericht mit nützlichen Vorschlägen (einschließlich des obigen Befehls).

PHP-Skript zum Testen der Verbindung:

# 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";

?>

Antwort2

Möglicherweise müssen Sie

semanage port -m -t http_port_t -p tcp 6379

Wenn semanage fehlt, fügen Sie das Paket policycoreutils-python hinzu

yum install policycoreutils-python

Antwort3

Sie können Selinux vorübergehend in den permissiven Modus versetzen und httpd eine Verbindung zu Redis herstellen lassen. Anschließend können Sie ein benutzerdefiniertes Richtlinienmodul generieren und erstellen mitaudit2zulassen

verwandte Informationen