Servidor Apache ejecutando Centos7. Estoy intentando ejecutar un ping desde el comando 'exec' de PHP pero aparece "socket: permiso denegado". Funciona con selinux deshabilitado. Mis conocimientos de Linux son algo limitados, no estoy seguro de cómo puedo solucionar este problema.
Hice algunas actualizaciones de políticas en selinux y ahora se ejecuta ping, pero se pierde el 100% de los paquetes como si no pudiera alcanzar la IP de destino, pero la alcanza con selinux deshabilitado.
Respuesta1
Me encanta cuando SELinux realmente detecta las cosas malas. En este caso,
exec
: sí, puedo ver cómo la configuración de un servidor querría reaccionar de forma alérgica a un script PHP que ejecuta un ejecutable externo; punto de entrada clásico. ¡Al menos espero que no estés pasando la entrada del usuario a algún shell!- Si realmente necesita realizar una solicitud ICMP ("ping"), deberá proporcionar el
ping_exec_t
tipo de archivo ejecutable que realiza la llamada (probablemente, /usr/bin/php o algo así).Documentación.
Con todo, si eres un desarrollador sin experiencia (¡todos lo somos en algún aspecto!) es muy probable que estés escribiendo algo que seade hechoexponer su servidor a problemas de ejecución remota (el uso exec
en PHP suele ser una señal de alerta muy grande, es por eso que su CentOS configura SELinux para prohibirlo). Las llamadas ping
se pueden reemplazar estableciendo directamente (por ejemplo, una conexión TCP) con el servicio que realmente le interesa, y probablemente debería hacerlo, si es posible.
Respuesta2
Estoy de acuerdo con Marcus Müller en que probablemente no querrás esto. Pero entonces, esto probablemente funcione:
Crea un archivo my-httpd-php-ping.te
y pon esto en él:
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 };
Compílelo en un módulo SELinux así:
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
E instalarlo:
semodule -i my-httpd-php-ping.pp
Luego, habilite SELinux nuevamente:
setenforce 1
Ping ahora debería funcionar. Si no, publique el resultado ausearch -ts recent -m avc -i
como le pedí en mi comentario.