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

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

我的系统运行的是 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-serverRPM 并运行: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

相关内容