51 votes

SElinux : autoriser httpd à se connecter à un port spécifique

Mon système tourne sous CentOS 6.4 avec apache2.2.15. SElinux est en vigueur et j'essaie de me connecter à une instance locale de redis à travers mon application Python/wsgi. J'obtiens l'erreur 13, Permission denied. J'ai pu résoudre ce problème via la commande :

setsebool -P httpd_can_network_connect

Cependant, je ne veux pas vraiment 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 faire un module pour permettre à httpd de se connecter au port 6379 (redis) ou à n'importe quel tcp sur 127.0.0.1, ce serait préférable. Je ne sais pas trop pourquoi ma paranoïa est si forte à ce sujet, mais bon...

Quelqu'un sait-il ?

63voto

Cameron Points 1075

Par défaut, la politique SELinux n'autorise les services qu'à accéder 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.

- ajouter le 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-server RPM et courir : sealert -a /var/log/audit/audit.log - il vous donnera un rapport agréable avec des suggestions utiles (y compris la commande ci-dessus).

Script PHP script 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";

?>

23voto

Tom Hallam Points 385

Il se peut que vous deviez utiliser

semanage port -m -t http_port_t -p tcp 6379

Si semanage est manquant, ajoutez le paquet policycoreutils-Python.

yum install policycoreutils-python

3voto

A. M. Points 39

Vous pouvez temporairement mettre selinux en mode permissif et laisser httpd se connecter à redis, puis générer et construire un module de politique personnalisé en utilisant audit2allow

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X