배경

배경

배경

에뮬레이트하려는 서버 구성

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_logAH01232: 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.phpUserDir 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_cgidPHP 애플리케이션을 실행합니다 . 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 동작 모방이 시스템의 우선순위: 가장 높은 우선순위입니다.

  1. 이 컴퓨터에서 Apache 2.4가 PHP 파일을 정적 파일로 제공하는 대신 0400PHP 5.6을 통해 CGI 스크립트로 shebang 권한이 있거나 누락된 PHP 파일을 실행하도록 어떻게 설득합니까 ? 0444즉, 어떻게 구현할까요?무엇위에 언급했듯이? 비표준으로 Apache를 컴파일하게 되어 기쁩니다.suEXEC 구성 옵션, 필요하다면.
  2. 특히, 서비스를 제공하는 동안 어떻게 해야 합니까?아니요UserDir URL을 사용해야 합니까( /~myuser예: URL 부분 없이 http://mywebsite.com/~myuser/mypage.php)?
  3. 이 시간 동안 나는 무엇을 해야 합니까?반품이 파일이 다음에 의해 생성되었는지 확인하십시오.내 사용자, 대신 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사용자의 홈 디렉터리에 바이너리를 설치하는 것은 원칙적으로 실행 가능한 조치여야 하며 시스템 바이너리 및 해당 디렉터리의 소유권을 수정하는 것보다 덜 심각해야 합니다.)

따라서 이 답변이 도움이 되었다면 자유롭게 공감하고 건설적인 의견을 남길 수 없다면 더 나은 답변이 나올 수 있기를 바라며 지금은 이를 "정확함"으로 표시하겠습니다.

관련 정보