SElinux: разрешить httpd подключаться к определенному порту

41

Моя система работает под управлением 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, это было бы предпочтительнее. Не уверен, почему моя паранойя так сильна в этом, но эй ...

Кто-нибудь знает?

savagecitizen
источник
Не лучше ли заставить его выйти через прокси? Таким образом, вы можете: а) лучше контролировать то, к чему можно получить доступ б) лучше контролировать то, что произошло и когда.
Кэмерон Керр

Ответы:

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";

?>
HTF
источник
3
У меня была проблема в Fedora 23 для отправки электронной почты (путем подключения к 127.0.0.1 через порт 25) из сценария perl (с использованием Net :: SMTP), запущенного с httpd. «Разрешение для подключения 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)
Дэвид Тонхофер
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. Тогда это работает!
Дэвид Тонхофер
@DavidTonhofer Незначительная опечатка в getsebool -aкоманде (на один меньше e).
Давиджб
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
Дэвид Тонхофер
17

Вам может понадобиться использовать

semanage port -m -t http_port_t -p tcp 6379

Если semanage отсутствует, добавьте пакет policycoreutils-python

yum install policycoreutils-python
Том Халлам
источник
semanageможет быть policycoreutils-python-utilsсейчас (по крайней мере, на Fedora 23)
Дэвид Тонхофер
1
CentOS 7 по-прежнему включает semanageв себя policycoreutils-python.
Jxmallett
Спасибо, что дали ответ на вопрос, а не что-то еще.
Флориан Хейгл
3

Вы можете временно перевести selinux в разрешающий режим и позволить httpd подключиться к redis, а затем сгенерировать и построить модуль пользовательской политики с помощью audit2allow.

AM
источник