우리는 PHP로 우리 제품의 관리 UI를 개발 중입니다. Centos 7 및 Apache 웹 서버에서 호스팅됩니다. 사용자는 이 UI를 사용하여 IP 주소를 ping할 수 있어야 합니다. 따라서 우리는 PHP 코드를 호출 exec(IPAddress)
하고 결과를 얻어 사용자에게 표시해야 합니다. 문제는 오류 메시지가 발생한다는 것입니다. 오류는 다음과 같습니다.
ping: socket: Permission denied
쉘에서 실행할 때 setenforce 0
Centos를 사용하면 PHP에서 ping 명령을 실행할 수 있습니다. PHP가 ping 명령을 영구적으로 실행하도록 Centos에 지시하는 방법은 무엇입니까?
업데이트: 다음을 사용하여 audit2why
이 메시지를 받았습니다 .
type=AVC msg=audit(1502697341.249:11426): avc: denied { create } for
pid=28530 comm="ping" scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:system_r:httpd_t:s0 tclass=rawip_socket
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
답변1
SELinux가 PHP 실행을 차단하고 있습니다 ping
. PHP 스크립트에 올바른 컨텍스트를 지정해야 합니다.
위치에 있다고 가정하면 /var/www/html/
다음을 수행해야 합니다.
semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html(/.*)?'
restorecon -R -v /var/www/html/
그러나 이 작업은 서버의 루트 사용자가 수행해야 합니다.
setenforce 0
참고: 이 명령은 SELinux를 비활성화하므로 입력 후에 ping이 작동합니다 . SELinux를 영구적으로 비활성화하려면(보안 검사가 꺼지므로 권장되지 않음) 을 편집 /etc/sysconfig/selinux
하고 지정합니다 SELINUX=disabled
.
답변2
다음을 시도해 볼 수 있습니다.
이 코드를 local_httpd.te
파일에 넣으세요:
policy_module(local_httpd, 0.0.1)
gen_require(`
type httpd_t;
')
netutils_domtrans_ping(httpd_t)
selinux-policy-devel
RPM이 설치되어 있는지 확인한 후 다음을 수행하십시오.
make -f /usr/share/selinux/devel/Makefile local_httpd.pp
그리고semodule -i local_httpd.pp
이렇게 하면 Apache(httpd_t)가 ping 실행 파일의 컨텍스트로 전환할 수 있습니다.
답변3
제가 드릴 수 있는 최고의 조언은SELinux 끄기난해하고 임의적인 문제를 뛰어넘기보다는 시스템을 더욱 안전하게 만드는 데 시간을 투자하세요.
....불행하게도 우리는 완벽한 세상에 살고 있지 않습니다. 따라서 "권장되는" 솔루션은 정책을 완화로 설정하고, ping을 호출하는 스크립트를 실행하고, 적용 모드로 되돌린 다음, 생성된 감사를 대상으로 하는 것입니다. 테스트 로그는 audit2allow를 실행합니다(자세한 내용은 링크된 문서 참조).
불행히도 이것은 모든 상황에서 작동하지 않습니다.