SElinux:允许httpd连接到特定的端口

我的系统使用apache2.2.15运行CentOS 6.4。 SElinux正在执行,我试图通过我的python / wsgi应用程序连接到redis的本地实例。 我得到错误13,权限被拒绝。 我可以通过命令解决这个问题:

setsebool -P httpd_can_network_connect

但是,我不完全想要httpd能够连接到所有的TCP端口。 我如何指定允许哪些端口/networking连接到httpd? 如果我可以让一个模块允许httpd连接到端口6379(redis)或127.0.0.1上的任何TCP,那将是更可取的。 不知道为什么我的偏执狂是如此强大,但嘿…

有人知道吗?

默认情况下,SELinux策略将只允许服务访问与这些服务相关的识别端口:

 # 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端口(6379)添加到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. 

您还可以安装setroubleshoot-server RPM并运行: sealert -a /var/log/audit/audit.log – 它会给你一个很好的报告,提供有用的build议(包括上面的命令)。

PHP脚本来testing连接:

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

您可能需要使用

 semanage port -m -t http_port_t -p tcp 6379 

如果缺lesssemanage,则添加包policycoreutils-python

 yum install policycoreutils-python 

你可以临时把selinux放在宽松模式,让httpd连接到redis,然后使用audit2allow生成和构build一个自定义策略模块