apacheのsuEXECをチェックしましょう
apacheのsuEXECの現状を確認しましょう。
CentOSならインストールされているはずなので、まずは、その確認からはじめましょう。
まずは、インストールの確認です
CentOSの場合、apacheを普通にインストールすれば、suEXECもインストールされています。
ちゃんとインストールされているか確認しましょう。
一般的には、パスがはれているはずなので、whichコマンドで検索できるはずです。
$ which suexec
/usr/sbin/suexec
|
・・・とこんな感じです。
自力でインストールされた場合は、インストール先などが指定できるのでそれでわかると思います。
また、apacheでは、デフォルトを
/usr/local/apache/sbin/suexec
としていますので、もし探せないようなら、確認してみるのも良いと思います。
また、実際にsuEXECがapache上で動作しているかログで確認することができます。
httpdの
エラーログに、以下のようなログが出力されます。
[Wed May 18 05:11:38 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
|
次に、suEXECの環境設定の確認です
suEXECのインストールができていたら、以下のようにsuEXECの環境を出力しておきましょう。
$ /usr/sbin/suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="apache"
-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=500
-D AP_USERDIR_SUFFIX="public_html"
|
この情報は、大事ですから必ずメモしておきましょう。
出力情報について、以下に簡単な解説をしておきます。
(まるまるapacheの引用です。)
AP_DOC_ROOT
example “/var/www”
Apache のドキュメントルートを設定します。これが suEXEC の動作で使用する唯一のディレクトリ階層になります (UserDir の指定は別)。デフォルトでは –datedir に “/htdocs” というサフィックスをつけたものです。 “–datadir=/home/apache” として設定すると、 suEXEC wrapper にとって “/home/apache/htdocs” がドキュメントルートとして使われます。
AP_GID_MIN
example 100
suEXEC の対象グループとして許される GID の最小値を指定します。大抵のシステムでは 100 が一般的なので、 デフォルト値としても 100 が使われています。
AP_HTTPD_USER
example “apache”
Apache を通常動作させるユーザ名を指定します。 このユーザだけが suexec の実行を許可されたユーザになります。
AP_LOG_EXEC
example “/var/log/httpd/suexec.log”
suEXEC の処理とエラーが記録されるファイル名を指定します。 (監査やデバッグ目的に有用) デフォルトではログファイルは “suexec_log” という名前で、 標準のログファイルディレクトリ (–logfiledir) に置かれます。
AP_SAFE_PATH
example “/usr/local/bin:/usr/bin:/bin”
CGI 実行ファイルに渡される安全な PATH 環境変数です。 デフォルト値は “/usr/local/bin:/usr/bin:/bin” です。
AP_UID_MIN
example 500
suEXEC の対象ユーザとして許される UID の最小値を指定します。 大抵のシステムでは 500 か 100 が一般的です。 デフォルト値は 100 です。
AP_USERDIR_SUFFIX
example “public_html”
suEXEC がアクセスを許されるユーザホームディレクトリ配下の サブディレクトリを指定します。 このディレクトリ以下の全実行ファイルは、”安全な”プログラムになるよう、 suEXEC がそのユーザとして実行できるようにします。 “単純な” UserDir ディレクティブを使っている場合 (すなわち “*” を含まないもの)、これと同じ値を設定すべきです。 Userdir ディレクティブがそのユーザのパスワードファイル内の ホームディレクトリと同じ場所を指していなければ、 suEXEC は適切に動作しません。デフォルトは “public_html” です。
各 UserDir が異なった仮想ホストを設定している場合、 それらを全て一つの親ディレクトリに含めて、 その親ディレクトリの名前をここで指定する必要があります。 このように指定されなければ “~userdir” cgi へのリクエストが動作しません。
もしもインストールできていないようなら、インストールしましょう。
古いバージョンならありえますが、最近では、ほとんど何もせずにインストールできているはずです。
比較的新しいバージョンなのにインストールできていない場合は、意識的にインストールしていない場合が多いので、確認しましょう。
また、上記の環境は、confファイルなどでの変更はできません。
もし、変更したい場合は、リコンパイルになります。
apacheの環境を変更している方は、リコンパイルが必要になるかもしれませんが、ほとんどの方には、そのまま利用できると思います。
続けて、phpの環境設定をあわせて実施してみましょう。
phpをsuEXECの環境下で動かすための環境設定をしましょう
phpをapacheのsuEXECの下で動作させるためには、いくつかの設定を行う必要があります。
ここでは、suEXECの特徴でもあるユーザ毎の権限を確認するためにも2人のユーザ(piyo,hoge)を使って、各ユーザサイトをsuEXECの下で動作できるように設定してみましょう。
ここでは、2人のユーザ(piyo,hoge)は、グループ名もそれぞれユーザ名と同じグループ名としましょう。(デフォルトでは、ユーザ登録するとそうなるのでそうします。)
また、特別な権限を持つ(wheelなど)に所属していないものとして、以降に簡単に解説してみます。
各ユーザの仮想ホストを設定する
確認するためのありますが、まずは、各ユーザサイトをapacheの仮想ホスト(VirtualHost)を使って登録します。
この際、仮想ホストのsuEXEC を実行するユーザ、グループを指定するために、SuexecUserGroup のパラメータを設定します。
以下は、/etc/httpd/conf/httpd.confの設定例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| ScriptAlias /php5-piyo /var/www/users/cgi-piyo/php-cgi
ScriptAlias /php5-hoge /var/www/users/cgi-hoge/php-cgi
<VirtualHost *:80>
ServerName piyo.example.com
DocumentRoot "/home/piyo/public_html"
ServerAlias piyo.example.com
SuexecUserGroup piyo piyo
ErrorLog /var/log/httpd/piyo_example-error.log
CustomLog /var/log/httpd/piyo_example-access.log
<Directory "/home/piyo/public_html">
Options FollowSymLinks ExecCGI
DirectoryIndex index.php index.html index.htm index.cgi
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName hoge.example.com
DocumentRoot "/home/hoge/public_html"
ServerAlias hoge.example.com
SuexecUserGroup hoge piyo
ErrorLog /var/log/httpd/hoge_example-error.log
CustomLog /var/log/httpd/hoge_example-access.log
<Directory "/home/hoge/public_html">
Options FollowSymLinks ExecCGI
DirectoryIndex index.php index.html index.htm index.cgi
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
|
- 1 – 2 行目 : phpのcgi版を実行するシェルスクリプトファイルのエイリアス(別名)設定になります。(詳細は、こちら)
各ユーザ毎に用意してあげる必要があります。
実行する際は、SuexecUserGroupで指定した同じユーザ所有のファイルでなければ実行できません。
- 4 – 19 行目 : piyoのサイト定義になります。
- ドメイン : piyo.example.com
- ルートディレクトリ : /home/piyo/public_html (詳細は、こちら)
- suEXECユーザ : piyo
- 21 – 36 行目 : hogeのサイト定義になります。
- ドメイン : hoge.example.com
- ルートディレクトリ : /home/hoge/public_html (詳細は、こちら)
- suEXECユーザ : hoge
Optionsは、phpを動作させるために最低限
ExecCGIの指定は必要です。
AllowOverrideは、ここでは、
Allを指定しています。後で出てきますが、.htaccessを使いたいからです。(詳細は、
こちら)
各ユーザのphpのcgi版を実行するシェルスクリプトファイルを作成する
先の仮想ホスト設定でphpのcgi版を実行するシェルスクリプトファイルのエイリアス(別名)を設定しました。
ここでは、そのシェルスクリプトの実態を作成します。
まずは、ディレクトリを各ユーザ毎に作成します。もちろん作成したディレクトリの所有者は、各ユーザとなります。
以下で、su で rootになって、ディレクトリを作成してみます。
$ mkdir /var/www/users
$ mkdir /var/www/users/cgi-piyo
$ mkdir /var/www/users/cgi-hoge
$ chmod 0711 /var/www/users
$ chmod 0710 /var/www/users/cgi-piyo
$ chmod 0710 /var/www/users/cgi-hoge
$ chown apache.apache /var/www/users
$ chown piyo.piyo /var/www/users/cgi-piyo
$ chown hoge.hoge /var/www/users/cgi-hoge
|
/var/www/users は、apacheの所有にして、みんな参照はできるようにしておきます。
/var/www/users/cgi-piyo は、piyoの所有にして、piyoと同じクループまで参照はできるようにしておきます。
/var/www/users/cgi-hoge は、hogeの所有にして、hogeと同じクループまで参照はできるようにしておきます。
続けて作成したディレクトリにシェルスクリプトを作成します。
シェルの内容は、以下のようなものです。
#!/bin/sh
exec /usr/bin/php-cgi
|
簡単ですね。php-cgiを実行しているだけのものです。
これと同じものを、
/var/www/users/cgi-piyo
/var/www/users/cgi-hoge
の両方に
php-cgiというファイル名で作成します。
もちろん所有者は、各ユーザになります。
実行権も同じグループまで付与します。
$ chmod 750 /var/www/users/cgi-piyo/php-cgi
$ chmod 750 /var/www/users/cgi-hoge/php-cgi
$ chown piyo.piyo /var/www/users/cgi-piyo/php-cgi
$ chown hoge.hoge /var/www/users/cgi-hoge/php-cgi
|
各ユーザの仮想ホストのルートディレクトリを作成する
各ユーザのルートディレクトリに.htaccessを作成する
各ユーザのルートディレクトリに.htaccessを作成し、phpの動作を指定します。
piyoの場合
Action php5-cgi /php5-piyo
AddHandler php5-cgi .php
|
hogeの場合
Action php5-cgi /php5-hoge
AddHandler php5-cgi .php
|
とこんな感じです。
各ユーザ毎に準備したphpのシェルスクリプトファイルをそれぞれに割り当てる感じです。
これで、phpを実行する場合、piyoであれば、
/var/www/users/cgi-piyo/php-cgi
が実行されることになります。
各ユーザグループをapacheに追加し、apacheを再起動する
環境設定は、これで最後になります。
各ユーザグループをapacheに追加し
apacheを再起動します。
$ usermod -G piyo,hoge apache
$ /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
|
とこんな感じです。
phpをsuEXECの環境下で動かしてみましょう
さあ、これで環境が整ったはずなので、動かしてみましょう。
動作確認は、簡単です。
まずは、
以下のphp情報だけを出力するphpファイルをサンプルとして各ユーザサイトの各ルートディレクトリにおいてみましょう。
さあ、アクセスして以下のような画面がでればOKです。
もちろん各ユーザのサイトで確認しましょう。
piyoなら、ここの例では、piyo.example.com にアクセスしてみましょう。
これができたら、次は、エラーを発生させてみましょう。
これも簡単で、単純にphpのcgi版を実行するためのシェルスクリプトの所有者を変更してみればOKです。
piyoなら、ここの例では、/var/www/users/cgi-piyo/php-cgi の所有者をhogeに変更して、
$ chown hoge.hoge /var/www/users/cgi-piyo/php-cgi
|
piyo.example.com にアクセスしてみましょう。
以下のようなエラー500が表示されればOKです。ちゃんとsuEXECが機能してます。
suexecのログも確認しておきましょう。デフォルトでは、/var/log/httpd/suexec.logに出力されるはずです。
以下のように出力されてます。プログラムのユーザと実行しているユーザが異なる由のエラーです。
[2011-05-19 06:59:56]: target uid/gid (501/501) mismatch with directory (501/501) or program (500/500)
|
ざっとこんな感じです。いかがだったでしょうか?
ちょっと、面倒ですが、複数のユーザが同じサーバーでサイトを立ち上げるような場合は、セキュリティ強化のためには、この設定は必要だと思いますね。
でも、それって共有レンタルサーバーそのもののような気もしますね。
ここまでちゃんとユーザ毎にsuEXECを使うのは、あんまりないかもしれませんね。
ただphpの場合、個人的にはちょっとはまりやすい点もあったので整理の意味でまとめてみました。
phpの場合、php-cgiのありかではまりやすいんですよね。
ここでは、/var/www/users というディレクトリを作成して、その配下に各ユーザ毎のディレクトリを作成し、そこにphp-cgiを設置しています。
たとえば、以下の例では、
/var/www/user/cgi-piyo/php-cgi
の/cgi-piyo/php-cgiの部分は、すべてオーナーが各ユーザでなければ動作しません。
案外、ここではまるんですよね。自分も最初は、ずいぶんはまりました。
参考:
suEXECを停止したい(利用したくない)場合は、
suexecの実行ファイルをリネームして、
apacheを再起動すればOKです。
$ mv /usr/sbin/suexec /usr/sbin/suexec_back
$ /etc/init.d/httpd restart
|
こんな感じです。
2012年2月15日, 1:04 PM
[…] 「レンタルサーバー・自宅サーバー設定・構築のヒント」様を参考にさせて頂きましたので、詳細はそちらをご覧ください。 […]