selinux блокирует пинг от php exec

selinux блокирует пинг от php exec

Apache-сервер с Centos7. Я пытаюсь выполнить ping из команды PHP 'exec', но получаю "socket: permission denied". Работает с отключенным selinux. Мои познания в Linux несколько ограничены, я не уверен, как это исправить.

Выполнил некоторые обновления политики в selinux, и теперь ping запускается, но теряет 100% пакетов, как будто не может достичь IP-адреса назначения, хотя при отключенном selinux он достигает его.

решение1

Мне нравится, когда SELinux действительно ловит плохие вещи. В этом случае,

  1. exec: да, я понимаю, как конфигурация сервера может аллергично отреагировать на PHP-скрипт, выполняющий внешний исполняемый файл; классическая точка входа. Я по крайней мере надеюсь, что вы на самом деле не передаете пользовательский ввод в какую-то оболочку!
  2. Если вам действительно нужно выполнить ICMP-запрос («ping»), вам нужно будет указать ping_exec_tтип вызывающего исполняемого файла (вероятно, /usr/bin/php или около того).Документация.

В общем, если вы неопытный разработчик (а мы все в какой-то степени таковыми являемся!), весьма вероятно, что вы пишете что-то, чтона самом делеподвергая ваш сервер проблемам удаленного выполнения (использование execв PHP обычно является действительно большим красным флагом, поэтому ваш CentOS настраивает SELinux, чтобы запретить это). Вызов pingможет быть заменен прямой установкой (например, TCP) соединения с сервисом, который вас действительно интересует, и вам, вероятно, следует это сделать, если это возможно.

решение2

Я согласен с Маркусом Мюллером, что вам это, вероятно, не нужно. Но тогда, это, вероятно, сработает:

Создайте файл my-httpd-php-ping.teи поместите в него следующее:

module my-httpd-php-ping 1.0;

require {
        type httpd_t;
        class capability { net_admin net_raw };
        class icmp_socket create;
        class rawip_socket { create getopt read setopt write };
}

#============= httpd_t ==============
allow httpd_t self:capability { net_admin net_raw };
allow httpd_t self:icmp_socket create;
allow httpd_t self:rawip_socket { create getopt read setopt write };

Скомпилируйте его в модуль SELinux следующим образом:

checkmodule -M -m -o my-httpd-php-ping.mod my-httpd-php-ping.te
semodule_package -o my-httpd-php-ping.pp -m my-httpd-php-ping.mod

И устанавливаем его:

semodule -i my-httpd-php-ping.pp

После этого снова включите SELinux:

setenforce 1

Теперь пинг должен работать. Если нет, опубликуйте вывод, ausearch -ts recent -m avc -iкак я просил в своем комментарии.

Связанный контент