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

sav*_*zen 45 redhat selinux redis apache-2.2

我的系统运行 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,那将是可取的。不知道为什么我的偏执如此强烈,但是嘿...

有人知道吗?

HTF*_*HTF 57

默认情况下,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.
Run Code Online (Sandbox Code Playgroud)

- 将 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.
Run Code Online (Sandbox Code Playgroud)

你也可以安装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";

?>
Run Code Online (Sandbox Code Playgroud)

  • 我在 Fedora 23 上遇到了从 httpd 启动的 perl 脚本(使用 Net::SMTP)发送电子邮件(通过在端口 25 上连接到 127.0.0.1)的问题。在这种情况下,“允许 httpd 连接到端口 25”并不是人们所寻求的。实际上,将端口 25 添加到 SELinux 类型 `http_port_t` 失败,因为端口 25 已被使用(对于另一种 SELinux 类型):`ValueError: Port tcp/25 already defined`。允许 httpd 连接到端口 25 的正确方法是将相应的 SELinux 策略布尔值设置为:`setsebool -P httpd_can_sendmail on`(参见 `getseebool -a`)。(续第 2 部分) (3认同)

Tom*_*lam 20

您可能需要使用

semanage port -m -t http_port_t -p tcp 6379
Run Code Online (Sandbox Code Playgroud)

如果缺少 semanage,则添加包 policycoreutils-python

yum install policycoreutils-python
Run Code Online (Sandbox Code Playgroud)


小智 3

您可以临时将 selinux 置于宽容模式并让 httpd 连接到 redis,然后使用audit2allow生成并构建自定义策略模块