SElinux: Ermöglicht httpd, eine Verbindung zu einem bestimmten Port herzustellen

41

Auf meinem System läuft CentOS 6.4 mit Apache 2.2.15. SElinux erzwingt dies und ich versuche, über meine Python / wsgi-App eine Verbindung zu einer lokalen Instanz von Redis herzustellen. Ich erhalte den Fehler 13, Erlaubnis verweigert. Ich könnte dies über den Befehl beheben:

setsebool -P httpd_can_network_connect

Ich möchte jedoch nicht, dass httpd eine Verbindung zu allen TCP-Ports herstellen kann. Wie kann ich festlegen, zu welchen Ports / Netzwerken httpd eine Verbindung herstellen darf? Wenn ich ein Modul erstellen könnte, mit dem httpd eine Verbindung zu Port 6379 (redis) oder einem beliebigen TCP auf 127.0.0.1 herstellen kann, wäre dies vorzuziehen. Ich bin mir nicht sicher, warum meine Paranoia so groß ist, aber hey ...

Weiß jemand?

wilder Bürger
quelle
Wäre es nicht besser, ihn zu zwingen, über einen Proxy hinauszugehen? Auf diese Weise haben Sie a) eine bessere Kontrolle darüber, auf was zugegriffen werden kann, b) eine bessere Kontrolle darüber, was wann passiert ist.
Cameron Kerr

Antworten:

51

Standardmäßig erlaubt die SELinux-Richtlinie nur den Zugriff von Diensten auf erkannte 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.

- Fügen Sie den Redis-Port (6379) zur SELinux-Richtlinie hinzu

# 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 setroubleshoot-serverRPM auch 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";

?>
HTF
quelle
3
Ich hatte auf Fedora 23 das Problem, E-Mails (durch Herstellen einer Verbindung zu 127.0.0.1 auf Port 25) von einem Perl-Skript aus (mit Net :: SMTP) zu senden, das von httpd gestartet wurde. "Erlaubnis für httpd, sich mit Port 25 zu verbinden" ist in diesem Fall nicht das, wonach man sucht. Tatsächlich Zugabe von Port 25 zu SELinux Typ http_port_tschlägt fehl , da Port 25 bereits (für einen anderen SELinux - Typ) verwendet wird: ValueError: Port tcp/25 already defined. Die richtige Möglichkeit, httpd eine Verbindung zu Port 25 zu ermöglichen, besteht darin, den entsprechenden SELinux-Richtlinien-Booleschen Wert auf setsebool -P httpd_can_sendmail on(siehe getseebool -a) zu setzen. (Fortsetzung in Teil 2)
David Tonhofer
1
(Fortsetzung von Teil 1) Aber wenn man von einem Perl - Skript senden möchten, müssen Sie explizit eine SELinux - Modul erstellen, das erlaubt: 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 im getsebool -aBefehl (einer weniger e).
Davidjb
1
@ DavidTonhofer Sie müssen keine neue Richtlinie für den vorhandenen Port erstellen, sondern können diese ändern: semanage port -m -t http_port_t -p tcp 25siehesemanage port --help
HTF
Für zabbix gibt es unter CentOS 7.5 bereits einen speziellen Boolean:setsebool -P httpd_can_connect_zabbix true
David Tonhofer
17

Möglicherweise müssen Sie 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
Tom Hallam
quelle
semanageist möglicherweise in policycoreutils-python-utils(zumindest auf Fedora 23)
David Tonhofer
1
CentOS 7 enthält noch semanagein policycoreutils-python.
JXMALLETT
Vielen Dank für die Beantwortung der Frage anstelle von etwas anderem.
Florian Heigl
3

Sie könnten selinux vorübergehend in den zulässigen Modus versetzen und httpd eine Verbindung zu redis herstellen lassen und dann mit audit2allow ein benutzerdefiniertes Richtlinienmodul generieren und erstellen

AM
quelle