Я использую Fedora 31 (ядро Linux 5.4.13, Nginx 1.16.1, fcgiwrap 1.1.0), работающее с SELinux в принудительном режиме (политика: таргетинг 3.14.4-44.fc31).
В моем ящике находится сервер, управляемый Nginx. Частично он основан на сценариях Perl. Nginx был настроен для передачи выполнения CGI через FastCGI с помощью fcgiwrap (подключение через сокет Unix /var/run/fcgiwrap/fcgiwrap@0.sock).
Все протестировано в «Разрешающем» режиме. Затем он был переведен в режим «Принудительное». Я получил кучу AVC, которые можно было обрабатывать либо изменением логических значений, либо созданием пользовательских политик, как это было предложено в комментариях аудита.
Однако нельзя обратиться к одному AVC. Журнал рассказывает:
type=AVC msg=audit(1580046727.459:548): avc: denied { connectto } for pid=4619 comm="nginx" path="/run/fcgiwrap/fcgiwrap-0.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
Настраиваемая политика содержит следующее:
module nginx 1.0;
require {
type httpd_t;
type soundd_port_t;
type http_port_t;
type tor_port_t;
type unconfined_service_t;
type httpd_user_content_t;
class tcp_socket { name_bind name_connect };
class file { getattr read };
class unix_stream_socket connectto;
}
#============= httpd_t ==============
#!!!! This avc is allowed in the current policy
allow httpd_t http_port_t:tcp_socket name_connect;
#!!!! This avc is allowed in the current policy
allow httpd_t httpd_user_content_t:file { getattr read };
allow httpd_t soundd_port_t:tcp_socket name_bind;
#!!!! This avc is allowed in the current policy
allow httpd_t tor_port_t:tcp_socket name_connect;
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
Как видно из автоматически сгенерированных комментариев, эта настраиваемая политика не действует, поскольку она уже включена в глобальную политику.
После добавления этого модуля ничего не меняется. Я все еще получаю предупреждения AVC, предлагающие такое же исправление.
Если я вернусь к «Разрешающему» или если я установлю домен httpd в разрешающем режиме скрипты CGI выполняются, и я получаю ожидаемый результат.
ls -Z /var/run/fcgiwrap/fcgiwrap-0.sock
возвращает:
system_u:object_r:httpd_var_run_t:s0 /var/run/fcgiwrap/fcgiwrap-0.sock
Мне не удалось найти ярлык httpd_var_run_t
использовался ли логический контролируемый доступ к этому типу файлов (я новичок в конфигурации SELinux).
Как я могу предоставить доступ к сокету в «принудительном» режиме?
ИЗМЕНИТЬ 2020-01-27
Похоже, в модуле уже есть правило перехода Apache для:
allow httpd_t unconfined_service_t:unix_stream_socket connectto;
но он неэффективен или другой модуль (какой?) его блокирует. Временное решение - поставить домен httpd в разрешающем режиме, но мне это не нравится, потому что теперь любой веб-сервер может делать что угодно.
Есть идеи, почему переход запрещен?
Я не проверял и не тестировал это должным образом - на самом деле я почти уверен, что это само по себе не сработает.
Я предполагаю, что создание пути /var/run/fcgiwrap
имеет тип каталога unconfined_service_t
и я не уверен, так ли это на самом деле.
Однако с этого вы должны с чего-то начать.
policy_module(nginx_local, 31.0.0)
require {
type httpd_t;
type unconfined_service_t;
}
stream_connect_pattern(httpd_t, unconfined_service_t, unconfined_service_t, unconfined_service_t)
Что касается сетевых проблем, вы можете просто включить логическое httpd_can_network_connect
что уже должно заставить замолчать некоторых из них. Если вы не хотите уточнить это.
В лучших и идеальных обстоятельствах было бы идеально создать политику, специфичную для вашего процесса fcgi, но это гораздо более сложная задача, поэтому заставить nginx просто взаимодействовать с неограниченными службами - хотя и менее безопасно - намного проще.