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, це було б краще. Не впевнений, чому моя параноїя настільки сильна на це, але ей ...

Хтось знає?


Чи не було б краще змусити його вийти через проксі? Таким чином ви можете: а) мати кращий контроль над тим, до чого можна отримати доступ; б) мати кращий аудит того, що сталося і коли.
Камерон Керр

Відповіді:


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 у мене виникла проблема надсилати електронну пошту (підключившись до 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).
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
Девід Тонхофер,

17

Можливо, вам доведеться використовувати

semanage port -m -t http_port_t -p tcp 6379

Якщо семанювання відсутнє, додайте пакунок policycoreutils-python

yum install policycoreutils-python

semanageможе бути policycoreutils-python-utilsзараз (принаймні на Fedora 23)
Девід Тонхофер

1
CentOS 7 все ще включає semanageв себе policycoreutils-python.
jxmallett

дякую за те, що ви дали відповідь на питання замість чогось іншого.
Флоріан Хейгл

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.