背景
エミュレートするサーバーの構成
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/
ディレクトリは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.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を介して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
ユーザーのホームディレクトリにバイナリをインストールすることは、原則として実行可能なアクションである必要があり、システムバイナリとそのディレクトリの所有権を変更するよりも深刻でなければなりません。)
したがって、この回答が役に立った場合は、自由に共感し、建設的な意見を残すことができない場合は、より良い回答が出てくることを願って、今はこれを「正確さ」と表示します。