背景

背景

背景

エミュレートするサーバーの構成

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ようです。FastCGIDSOmod_php

サーバーにはユーザーがいます。私のユーザー、その~/public_html/public/ディレクトリはWebサイトのドキュメントルートとして機能します。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を介してApacheまたはhttpdまたは誰もユーザー?

3つの質問を一度に回答することができれば良いのですが、最初の質問だけを答えても大いに役立ちます!ありがとうございます:)

ベストアンサー1

これはこれを行う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ユーザーのホームディレクトリにバイナリをインストールすることは、原則として実行可能なアクションである必要があり、システムバイナリとそのディレクトリの所有権を変更するよりも深刻でなければなりません。)

したがって、この回答が役に立った場合は、自由に共感し、建設的な意見を残すことができない場合は、より良い回答が出てくることを願って、今はこれを「正確さ」と表示します。

おすすめ記事