SElinux: permet à httpd de se connecter à un port spécifique


41

Mon système exécute CentOS 6.4 avec apache2.2.15. SElinux est en vigueur et j'essaie de me connecter à une instance locale de redis via mon application python / wsgi. Je reçois l'erreur 13, permission refusée. Je pourrais résoudre ce problème via la commande:

setsebool -P httpd_can_network_connect

Cependant, je ne veux pas exactement que httpd puisse se connecter à tous les ports TCP. Comment puis-je spécifier les ports / réseaux auxquels httpd est autorisé à se connecter? Si je pouvais créer un module permettant à httpd de se connecter au port 6379 (Redis) ou à n’importe quel autre TCP sur 127.0.0.1, ce serait préférable. Je ne sais pas pourquoi ma paranoïa est si forte à ce sujet, mais bon…

Quelqu'un sait?


Ne serait-il pas préférable de le forcer à utiliser un proxy? De cette façon, vous pouvez a) mieux contrôler ce qui peut être consulté b) mieux auditer ce qui s'est passé et quand.
Cameron Kerr

Réponses:


51

Par défaut, la stratégie SELinux n'autorisera l'accès aux services qu'aux ports reconnus associés à ces services:

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

- ajout du port Redis (6379) à la politique 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.

Vous pouvez également installer setroubleshoot-serverRPM et exécuter: sealert -a /var/log/audit/audit.log- il vous donnera un bon rapport avec des suggestions utiles (y compris la commande ci-dessus).

Script PHP pour tester la connexion:

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

?>

3
J'ai eu le problème sur Fedora 23 d'envoyer un e-mail (en se connectant à 127.0.0.1 sur le port 25) à partir d'un script Perl (avec Net :: SMTP) démarré à partir de httpd. "L'autorisation pour httpd de se connecter au port 25" n'est pas ce que l'on recherche dans ce cas. En effet , le port en ajoutant 25 type SELinux http_port_téchoue parce que le port 25 est déjà utilisé (pour un autre type de SELinux): ValueError: Port tcp/25 already defined. Pour autoriser httpd à se connecter au port 25, la méthode correcte consiste à définir la stratégie booléenne SELinux correspondante sur: setsebool -P httpd_can_sendmail on(voir getseebool -a). (suite de la deuxième partie)
David Tonhofer, le

1
(suite de la partie 1) Mais si vous voulez envoyer à partir d' un script Perl, vous devez créer explicitement un module SELinux qui permet 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. Alors ça marche!
David Tonhofer

@DavidTonhofer Typo mineur dans la getsebool -acommande (un de moins e).
davidjb

1
@ DavidTonhofer vous n'avez pas besoin de créer une nouvelle politique pour le port existant, vous pouvez le modifier à la place semanage port -m -t http_port_t -p tcp 25semanage port --help
:,

Pour zabbix, il existe déjà un booléen spécifique sur CentOS 7.5:setsebool -P httpd_can_connect_zabbix true
David Tonhofer le

17

Vous devrez peut-être utiliser

semanage port -m -t http_port_t -p tcp 6379

Si semanage est manquant, ajoutez le paquet policycoreutils-python

yum install policycoreutils-python

semanagepeut être dans policycoreutils-python-utilsmaintenant (au moins sur Fedora 23)
David Tonhofer

1
CentOS 7 inclut toujours semanagedans policycoreutils-python.
Jxmallett

merci de donner une réponse à la question au lieu d’autre chose.
Florian Heigl le

3

Vous pouvez mettre temporairement selinux en mode permissif et laisser httpd se connecter à redis, puis générer et construire un module de stratégie personnalisé à l'aide de audit2allow.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.