Servidor Apache rodando Centos7. Estou tentando executar um ping do comando 'exec' do PHP, mas recebo "socket: permissão negada". Funciona com o selinux desabilitado. Meu conhecimento sobre Linux é um tanto limitado, não sei como posso consertar isso.
Fiz algumas atualizações de política no selinux e o ping agora é executado, mas obtém 100% de perda de pacotes, como se não pudesse alcançar o IP de destino, mas chega com o selinux desativado.
Responder1
Adoro quando o SELinux realmente detecta as coisas ruins. Nesse caso,
exec
: sim, posso ver como uma configuração de servidor gostaria de reagir alérgicamente a um script PHP executando um executável externo; ponto de entrada clássico. Pelo menos espero que você não esteja passando a entrada do usuário para algum shell!- Se você realmente precisar fazer uma solicitação ICMP ("ping"), precisará fornecer o
ping_exec_t
tipo de arquivo executável de chamada (provavelmente /usr/bin/php ou algo assim).Documentação.
Resumindo, se você é um desenvolvedor inexperiente (todos nós o somos em algum aspecto!), é muito provável que você esteja escrevendo algo que éna verdadeexpor seu servidor a problemas de execução remota (usar exec
em PHP geralmente é um grande sinal de alerta, é por isso que seu CentOS configura o SELinux para proibir isso). A chamada ping
pode ser substituída pelo estabelecimento direto (por exemplo, uma conexão TCP) com o serviço no qual você está realmente interessado, e você provavelmente deve fazer isso, se possível.
Responder2
Concordo com Marcus Müller que você provavelmente não vai querer isso. Mas então, isso provavelmente funcionará:
Crie um arquivo my-httpd-php-ping.te
e coloque isto nele:
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 };
Compile-o em um módulo SELinux assim:
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 instale-o:
semodule -i my-httpd-php-ping.pp
Depois, habilite o SELinux novamente:
setenforce 1
O Ping agora deve funcionar. Caso contrário, poste o resultado ausearch -ts recent -m avc -i
como perguntei em meu comentário.