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


41

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

setsebool -P httpd_can_network_connect

但是,我并不完全希望httpd能够连接到所有tcp端口。如何指定允许httpd连接到哪些端口/网络?如果我可以制作一个模块来允许httpd连接到端口6379(redis)或127.0.0.1上的任何tcp,那将是更好的选择。不知道为什么我的妄想症在这方面如此强烈,但是嘿...

有人知道吗


强迫它通过代理出去不是更好吗?这样,您可以a)更好地控制可以访问的内容b)更好地审核发生的事件和时间。
卡梅隆·克尔

Answers:


51

默认情况下,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";

?>

3
我在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部分)
David Tonhofer,2016年

1
(第1部分中续)但是,如果你想从一个Perl脚本送,你必须明确地创建一个SELinux的模块,它可以是:sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp。然后就可以了!
David Tonhofer '16

@DavidTonhofer getsebool -a命令中的次要错字(少了1个e)。
davidjb

1
@DavidTonhofer,您不必为现有端口创建新策略,而是可以对其进行修改:semanage port -m -t http_port_t -p tcp 25,请参见semanage port --help
HTF

对于zabbix,在CentOS 7.5上已经有一个特殊的布尔值:setsebool -P httpd_can_connect_zabbix true
David Tonhofer

17

您可能需要使用

semanage port -m -t http_port_t -p tcp 6379

如果缺少semanage,请添加软件包policycoreutils-python

yum install policycoreutils-python

semanage可能policycoreutils-python-utils现在(至少在Fedora 23上)
David Tonhofer

1
CentOS 7仍包含semanage在中policycoreutils-python
jxmallett

感谢您为问题提供了答案,而不是其他答案。
Florian Heigl

3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.