![SElinux:允許httpd連接到特定端口](https://rvso.com/image/623626/SElinux%EF%BC%9A%E5%85%81%E8%A8%B1httpd%E9%80%A3%E6%8E%A5%E5%88%B0%E7%89%B9%E5%AE%9A%E7%AB%AF%E5%8F%A3.png)
我的系統運行的是 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,然後使用以下命令產生並建立自訂策略模組審核2允許