Назад | Перейти на главную страницу

SELinux, Nginx и fcgiWrap: как разрешить доступ к сокету fcgiWrap?

Я использую 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 просто взаимодействовать с неограниченными службами - хотя и менее безопасно - намного проще.