Apache-сервер с Centos7. Я пытаюсь выполнить ping из команды PHP 'exec', но получаю "socket: permission denied". Работает с отключенным selinux. Мои познания в Linux несколько ограничены, я не уверен, как это исправить.
Выполнил некоторые обновления политики в selinux, и теперь ping запускается, но теряет 100% пакетов, как будто не может достичь IP-адреса назначения, хотя при отключенном selinux он достигает его.
решение1
Мне нравится, когда SELinux действительно ловит плохие вещи. В этом случае,
exec
: да, я понимаю, как конфигурация сервера может аллергично отреагировать на PHP-скрипт, выполняющий внешний исполняемый файл; классическая точка входа. Я по крайней мере надеюсь, что вы на самом деле не передаете пользовательский ввод в какую-то оболочку!- Если вам действительно нужно выполнить 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
как я просил в своем комментарии.