Моя система работает под управлением CentOS 6.4 с apache2.2.15. SElinux работает, и я пытаюсь подключиться к локальному экземпляру redis через мое приложение python / wsgi. Я получаю ошибку 13, в доступе отказано. Я мог исправить это с помощью команды:
setsebool -P httpd_can_network_connect
Однако я не хочу, чтобы httpd мог подключаться ко всем портам TCP. Как я могу указать, к каким портам / сетям разрешено подключаться httpd? Если бы я мог создать модуль, позволяющий httpd подключаться к порту 6379 (redis) или любому tcp на 127.0.0.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";
?>
Возможно, вам придется использовать
semanage port -m -t http_port_t -p tcp 6379
Если semanage отсутствует, добавьте пакет policycoreutils-python
yum install policycoreutils-python
Вы можете временно перевести selinux в разрешающий режим и позволить httpd подключаться к redis, а затем сгенерировать и построить собственный модуль политики, используя audit2allow