我的系统运行的是 CentOS 6.4,带有 apache2.2.15。SElinux 正在强制执行,我正尝试通过我的 python/wsgi 应用程序连接到 redis 的本地实例。我收到错误 13,权限被拒绝。我可以通过以下命令修复此问题:
setsebool -P httpd_can_network_connect
但是,我并不希望 httpd 能够连接到所有 tcp 端口。我如何指定允许 httpd 连接到哪些端口/网络?如果我可以制作一个模块,允许 httpd 连接到端口 6379 ( redis ) 或 127.0.0.1 上的任何 tcp,那就更好了。不知道为什么我对此如此偏执,但是嘿...
有人知道吗?
答案1
默认情况下,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
- 它将为您提供一份包含有用建议的良好报告(包括上面的命令)。
测试连接的 PHP 脚本:
# 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";
?>
答案2
您可能需要使用
semanage port -m -t http_port_t -p tcp 6379
如果缺少 semanage,则添加包 policycoreutils-python
yum install policycoreutils-python
答案3
您可以暂时将 selinux 置于宽容模式并让 httpd 连接到 redis,然后使用生成并构建自定义策略模块audit2allow