![SElinux: разрешить httpd подключаться к определенному порту](https://rvso.com/image/623626/SElinux%3A%20%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B8%D1%82%D1%8C%20httpd%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D0%BA%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%BC%D1%83%20%D0%BF%D0%BE%D1%80%D1%82%D1%83.png)
Моя система работает на CentOS 6.4 с apache2.2.15. SElinux принудительно применяет, и я пытаюсь подключиться к локальному экземпляру redis через мое приложение python/wsgi. Я получаю ошибку 13, Permission denied. Я могу исправить это с помощью команды:
setsebool -P httpd_can_network_connect
Однако я не хочу, чтобы httpd мог подключаться ко всем портам tcp. Как мне указать, к каким портам/сетям httpd разрешено подключаться? Если бы я мог сделать модуль, позволяющий httpd подключаться к порту 6379 (redis) или любому tcp на 127.0.0.1, это было бы предпочтительнее. Не знаю, почему моя паранойя так сильна по этому поводу, но эй...
Кто-нибудь знает?
решение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разрешить