Apache 서버는 Centos7을 실행합니다. PHP의 "exec" 명령으로 ping을 시도하고 있는데 "소켓: 권한이 거부되었습니다."라는 메시지가 나타납니다. selinux가 비활성화된 상태에서도 작동합니다. 내 Linux 지식은 다소 제한되어 있으며 이 문제를 해결하는 방법을 모르겠습니다.
selinux에서 일부 정책 업데이트가 발생했고 이제 ping이 실행되지만 100% 패킷 손실로 인해 대상 IP에 도달할 수 없지만 selinux가 비활성화된 상태에서 대상에 도달하는 것과 같습니다.
답변1
나는 SELinux가 나쁜 것들을 잡아낸다는 점을 좋아합니다. 이 경우,
exec
: 예, 외부 실행 파일을 실행하는 PHP 스크립트에 서버 구성이 어떻게 반응하는지 알 수 있습니다. 적어도 실제로 사용자 입력을 일부 쉘에 전달하지 않기를 바랍니다!- ICMP 요청("ping")을 수행해야 하는 경우 호출 실행 파일(예: /usr/bin/php 등) 파일 형식을 제공해야 합니다
ping_exec_t
.문서.
전체적으로, 경험이 부족한 개발자라면(우리 모두는 어떤 면에서는 그렇습니다!) 아마 다음과 같은 글을 쓰고 있을 것입니다.실제로서버를 원격 실행 문제에 노출시키는 것( exec
PHP에서 사용되는 것은 일반적으로 매우 큰 위험 신호이므로 CentOS가 이를 비활성화하도록 SELinux로 구성되어 있습니다). 호출은 ping
실제로 관심 있는 서비스에 직접(예: TCP) 연결을 설정하는 것으로 대체될 수 있으며 가능하면 이렇게 해야 합니다.
답변2
나는 Marcus Mueller의 의견에 동의합니다. 아마 당신은 이것을 원하지 않을 것입니다. 그러나 다음과 같이 작동할 수도 있습니다.
파일을 만들고 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
댓글에 제가 요청한 출력을 게시해 주세요.