Frage SElinux: Erlaube dem httpd, sich mit einem bestimmten Port zu verbinden


Mein System läuft CentOS 6.4 mit apache2.2.15. SElinux erzwingt und ich versuche, eine Verbindung zu einer lokalen Instanz von redis über meine Python / wsgi App herzustellen. Ich bekomme Fehler 13, Berechtigung verweigert. Ich könnte das über den 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, mit welchen Ports / Netzwerken sich httpd verbinden darf? Wenn ich ein Modul machen könnte, um es httpd zu ermöglichen, sich mit Port 6379 (redisis) oder irgendeinem TCP unter 127.0.0.1 zu verbinden, wäre das vorzuziehen. Nicht sicher warum meine Paranoia so stark ist, aber hey ...

Weiß jemand?


30
2017-12-28 05:51


Ursprung


Wäre es nicht besser, es durch einen Proxy zu erzwingen? Auf diese Weise können Sie a) eine bessere Kontrolle darüber haben, auf was zugegriffen werden kann, b) über das, was wann passiert ist, besser auditieren. - Cameron Kerr


Antworten:


Standardmäßig ermöglicht die SELinux-Richtlinie nur den Zugriff auf Dienste für die erkannten Ports, die diesen Diensten zugeordnet 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 installieren setroubleshoot-server RPM und Lauf: sealert -a /var/log/audit/audit.log - Sie erhalten einen schönen Bericht mit nützlichen Vorschlägen (einschließlich Befehl oben).

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

?>

38
2017-12-28 09:02



Ich hatte das Problem auf Fedora 23, eine E-Mail (durch Verbindung zu 127.0.0.1 auf Port 25) von einem Perl-Skript (unter Verwendung von Net :: SMTP) zu senden, das von httpd gestartet wurde. "Erlaubnis für httpd, um Anschluss 25 zu verbinden" ist nicht, was man in diesem Fall sucht. Tatsächlich fügt Port 25 dem SELinux-Typ hinzu http_port_t schlägt fehl, weil Port 25 bereits verwendet wird (für einen anderen SELinux-Typ): ValueError: Port tcp/25 already defined. Der korrekte Weg, um es httpd zu ermöglichen, sich mit Port 25 zu verbinden, besteht darin, den entsprechenden SELinux-Policy-Booleschen Wert auf zu setzen: setsebool -P httpd_can_sendmail on (sehen getseebool -a). (Fortsetzung in Teil 2) - David Tonhofer
(Fortsetzung von Teil 1) Wenn Sie jedoch ein Perl-Skript senden möchten, müssen Sie explizit ein SELinux-Modul erstellen, das Folgendes zulässt: sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. Dann klappt es! - David Tonhofer
@DavidTonhofer Kleiner Tippfehler in der getsebool -a Befehl (eine weniger e). - davidjb
@DavidTonhofer Sie müssen keine neue Richtlinie für den vorhandenen Port erstellen, Sie können sie stattdessen ändern: semanage port -m -t http_port_t -p tcp 25, sehen semanage port --help - HTF


Sie müssen möglicherweise verwenden

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

12
2018-05-13 07:30



semanage vielleicht in policycoreutils-python-utils jetzt (zumindest auf Fedora 23) - David Tonhofer
CentOS 7 enthält noch semanage im policycoreutils-python. - jxmallett


Sie könnten selinux temporär in den permissiven Modus setzen und httpd connect zu redis lassen, dann ein benutzerdefiniertes Richtlinienmodul generieren und erstellen audit2allow


3
2017-12-28 07:50