배경
에뮬레이트하려는 서버 구성
cPanel/WHM이 설치되어 있고 다음 구성으로 EasyApache4를 실행하는 CentOS 7 서버에 액세스할 수 있습니다.
# /usr/local/cpanel/bin/rebuild_phpconf --current
DEFAULT PHP: ea-php56
ea-php55 SAPI: cgi
ea-php56 SAPI: cgi
ea-php70 SAPI: cgi
# rpm -qa|grep ruid2
# rpm -qa|grep suexec
ea-apache24-mod_suexec-2.4.33-5.5.1.cpanel.x86_64
.suEXEC
/var/log/apache2/error_log
AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
mod_ruid2
, , suPHP
, , , PHP-FPM
, FastCGI
, DSO
(일명 mod_php
)이 활성화되지 않은 것 같습니다 .
서버에는 사용자가 있습니다.내 사용자, 해당 ~/public_html/public/
디렉토리는 웹 사이트의 문서 루트 역할을 합니다.mywebsite.com. (물론 실제 이름은 아닙니다.)
whoami.php
해당 디렉토리에 다음 내용 이 포함된 PHP 파일을 배치하면 (셰르본):
<html>
<body>
<p>sapi_name: <?php print php_sapi_name(); ?></p>
<p>exec whoami: <?php print exec('whoami'); ?></p>
<p>system whoami: <?php system('whoami'); ?></p>
<p>system id -a: <?php system("id -a"); ?></p>
<p>getcurrentuser: <?php print get_current_user(); ?></p>
</body>
</html>
브라우저에서 액세스합니다 http://mywebsite.com/whoami.php
(참고:아니요http://mywebsite.com/~myuser/whoami.php
UserDir URL 형식을 사용하면 다음과 같이 렌더링됩니다.
sapi_name: cgi-fcgi
exec whoami: myuser
시스템 whoami: myuser
시스템 id -a: uid=1002(myuser) gid=1003(myuser) groups=1003(myuser)
getcurrentuser: myuser
닮고 싶은 행동
다음과 같이 실행 권한이 누락된 경우에도 마찬가지입니다.
$ ls -l /home/myuser/public_html/public/whoami.php | cut -d' ' -f1,3,4,9
-r-------- myuser myuser /home/myuser/public_html/public/whoami.php
일반적으로 CGI 모드의 Apache 2.4는 이와 같은 실행 불가능한 파일을 실행할 수 없습니다.문서옳은:
물론 파일이 존재해야 하고,그리고 실행 가능, 특정 방식으로 출력을 반환합니다. 그렇지 않으면 Apache는 오류 메시지를 반환합니다.
그러나 cPanel/WHM은 다음과 같은 기능을 수행할 수 있는 것 같습니다.무엇이 사실을 바꾸려고. ~에 따르면WHM 문서:
컴퓨터 그래픽 이미지 처리
CGI 핸들러는 Apache 모듈
mod_cgi
을 통해mod_cgid
PHP 애플리케이션을 실행합니다 . suEXEC 모듈을 설치하면 시스템은 요청을 처리하는 VirtualHost를 소유한 사용자로 PHP 애플리케이션을 실행합니다. suEXEC 모듈을 제거하면 시스템은nobody
시스템 사용자로 PHP 애플리케이션을 실행합니다. 시스템은mod_cgi
기본적으로 및를 제공합니다.mod_ruid2
.user.ini
PHP 파일에서 CGI 처리기의 설정을 사용자 정의할 수 있습니다 . […]중요한:
만약 너라면~할 수 있게 하다suEXEC 또는 Ruid2와 같은 사용자별 모듈을 사용할 수 있습니다
0400
. suEXEC 또는 Ruid2와 같은 사용자별 모듈을 비활성화하면 해당 모듈을 사용할 수 있습니다0444
.
즉, suEXEC나 Ruid2가 활성화되지 않은 경우에도 EasyApache4는 Apache가 실행할 수 없는 PHP 파일을 단순히 정적 파일로 제공하는 것이 아니라 CGI 스크립트로 처리하도록 할 수 있습니다.
질문
인터넷에서 라우팅할 수 없고 개발에만 사용되는 다른 CentOS 7 시스템이 있습니다. 물론아니요cPanel/WHM이 설치되었습니다. 안전은아니요이 머신의 우선순위는 SELinux가 비활성화되어 있습니다. cPanel/WHM 동작 모방예이 시스템의 우선순위: 가장 높은 우선순위입니다.
- 이 컴퓨터에서 Apache 2.4가 PHP 파일을 정적 파일로 제공하는 대신
0400
PHP 5.6을 통해 CGI 스크립트로 shebang 권한이 있거나 누락된 PHP 파일을 실행하도록 어떻게 설득합니까 ?0444
즉, 어떻게 구현할까요?무엇위에 언급했듯이? 비표준으로 Apache를 컴파일하게 되어 기쁩니다.suEXEC 구성 옵션, 필요하다면. - 특히, 서비스를 제공하는 동안 어떻게 해야 합니까?아니요UserDir URL을 사용해야 합니까(
/~myuser
예: URL 부분 없이http://mywebsite.com/~myuser/mypage.php
)? - 이 시간 동안 나는 무엇을 해야 합니까?반품이 파일이 다음에 의해 생성되었는지 확인하십시오.내 사용자, 대신 suEXEC를 통해아파치또는httpd또는아무도사용자?
세 가지 질문을 한꺼번에 답변할 수 있으면 더 좋겠지만, 첫 번째 질문만 답변해도 큰 도움이 될 것입니다! 감사해요:)
답변1
이는 이를 수행하는 한 가지 방법입니다. 해당 목적을 위한 전용 개발 환경에서는 괜찮지만안 돼요라우팅 가능한 인터넷이 있는 머신에서 사용됩니다.
다음과 같은 다소 급진적인 명령을 실행하십시오.
# chown myuser:myser /usr/bin
# chown myuser:myser /usr/bin/php-cgi
그 다음에:
# chmod 711 /home/myuser
# chmod 755 /home/myuser/public_html
#
또한 suEXEC를 갖도록 Apache를 (재)컴파일한 AP_DOC_ROOT="/"
후 (재)설치하십시오.
/etc/httpd/conf/httpd.conf
다음 라인을 따라 수정하십시오.
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
ServerAdmin root@localhost
#ServerName example.local
ServerName localhost
User apache
Group apache
<Directory />
AllowOverride none
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot "/home/myuser/public_html/public"
SuexecUserGroup myuser myuser
<IfModule alias_module>
ScriptAlias /cgi-bin/ /home/myuser/public_html/public/cgi-bin/
</IfModule>
<Directory "/home/myuser/public_html/public">
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
Require all granted
AddHandler cgi-script .cgi .pl
</Directory>
</VirtualHost>
<IfModule dir_module>
DirectoryIndex index.php index.cgi index.html index.htm
</IfModule>
그리고 /etc/httpd/conf.d/php.conf
대략적으로 다음과 같이 수정되었습니다.
ScriptAlias /local-bin /usr/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php5 /local-bin/php-cgi
마지막으로 Apache를 (다시) 시작하십시오.
이것이 위의 질문을 하기 전에 제가 찾은 최선의 접근 방식입니다. 그러나 더 나은 옵션이 거의 확실하고 이에 대해 배우고 싶어서 이 질문을 게시했습니다. (예를 들어 php-cgi
사용자의 홈 디렉터리에 바이너리를 설치하는 것은 원칙적으로 실행 가능한 조치여야 하며 시스템 바이너리 및 해당 디렉터리의 소유권을 수정하는 것보다 덜 심각해야 합니다.)
따라서 이 답변이 도움이 되었다면 자유롭게 공감하고 건설적인 의견을 남길 수 없다면 더 나은 답변이 나올 수 있기를 바라며 지금은 이를 "정확함"으로 표시하겠습니다.