selinux bloqueia ping do php exec

selinux bloqueia ping do php exec

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,

  1. 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!
  2. Se você realmente precisar fazer uma solicitação ICMP ("ping"), precisará fornecer o ping_exec_ttipo 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 execem PHP geralmente é um grande sinal de alerta, é por isso que seu CentOS configura o SELinux para proibir isso). A chamada pingpode 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.tee 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 -icomo perguntei em meu comentário.

informação relacionada