selinux는 PHP exec의 핑을 차단합니다.

selinux는 PHP exec의 핑을 차단합니다.

Centos7을 실행하는 Apache 서버. PHP의 'exec' 명령에서 ping을 실행하려고 하는데 "소켓: 권한이 거부되었습니다"라는 메시지가 표시됩니다. selinux가 비활성화된 상태에서도 작동합니다. 내 Linux 지식이 다소 제한되어 있어 이 문제를 어떻게 해결할 수 있는지 잘 모르겠습니다.

selinux에서 일부 정책을 업데이트하고 ping이 이제 실행되지만 대상 IP에 도달할 수 없는 것처럼 100% 패킷 손실이 발생하지만 selinux가 비활성화된 상태에서 도달합니다.

답변1

나는 SELinux가 실제로 나쁜 것을 잡아내는 것을 좋아합니다. 이 경우,

  1. exec: 예, 서버 구성이 외부 실행 파일을 실행하는 PHP 스크립트에 알레르기 반응을 보이는 방법을 알 수 있습니다. 고전적인 진입점. 적어도 실제로 사용자 입력을 일부 쉘에 전달하지 않기를 바랍니다!
  2. ICMP 요청("ping")을 실제로 수행해야 하는 경우 호출 실행 파일(아마도 /usr/bin/php 등) 파일 형식을 제공해야 합니다 ping_exec_t.선적 서류 비치.

대체로, 당신이 경험이 없는 개발자라면(우리 모두는 어떤 면에서는 그렇습니다!) 당신은 뭔가를 작성하고 있을 가능성이 매우 높습니다.실제로서버를 원격 실행 문제에 노출시킵니다( execPHP에서 사용하는 것은 일반적으로 매우 큰 위험 신호이므로 CentOS는 이를 금지하도록 SELinux를 구성합니다). 호출은 ping실제로 관심 있는 서비스에 직접 연결(예: TCP)을 설정하는 것으로 대체될 수 있으며 가능하다면 그렇게 해야 합니다.

답변2

나는 당신이 아마도 이것을 원하지 않을 것이라는 Marcus Müller의 의견에 동의합니다. 하지만 그러면 아마도 다음과 같이 작동할 것입니다.

파일을 만들고 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

이제 Ping이 작동할 것입니다. 그렇지 않은 경우 ausearch -ts recent -m avc -i내 댓글에서 요청한 것과 같은 출력을 게시하십시오.

관련 정보