入間市 ジョンソンタウンと富士見公園DoCoMoのAndroid携帯GALAXY S やっときましたね

2010年11月02日

ServersMan@VPS - CentOS5 - suexec環境でshopformerを利用する

久しぶりにshopformerネタで。国産ECオープンソースshopformerのダウンロードは下記URLから。開発者は私です(笑)ご意見ご感想はコメントくださいね。本稿執筆時点での最新バージョンは1.2.00ですよ。

http://www.mds-tools.com

業界最安値水準のVPSサービスDTIのServersMan@VPSの申し込みはこちら



さて、前置きをいいますと。shopformerやmailformerは、自分が管理者じゃない場合や、共用サーバーのホスティングを利用する場合は全ての場所でsuexec環境で利用することをお勧めします。自分が管理者で他の人が使わないOS環境の場合は、必須ではありません。ServersMan@VPSは自分が管理者なので必須ではないのですが、formerシリーズに付属している管理パネルからのソフトウェア更新機能を利用したい場合は、プログラムライブラリのフォルダ以下を全てWebサーバーユーザーが書き込み可能な権限に設定する必要がありますので若干面倒だし、いくら管理者が自分といえどもセキュリティ上好ましくありません。

そこで、suexecを管理パネルの下のみ部分的に適用したいわけですね。

CentOSの標準でyumからインストールできるmod_suexecは、suexec環境の設定が/homeではなく、/var/wwwとなっていて、/var/www配下にユーザーフォルダの実体を配置することで解決します。
いちばん簡単なのは、ServersMan@VPSを利用する場合root権限をもつ管理者なわけですから初期設定である/var/www/htmlフォルダ以下でサイトを公開すればいいだけです。

/var/www/htmlフォルダ以下でサイトを公開してユーザーhogeの権限でsuexecを有効にするには、/etc/httpd/conf/httpd.confの下記の箇所を書き換えます。注意点として、ServersManでは初期状態でapacheの実行ユーザーはdaemon:daemonになっています。実行グループをapacheにするか/usr/bin/suexecの所有権をroot:daemonにしなければsuexecを実行できません。ここでは、apacheの実行ユーザ設定をdaemon:apacheに変更します。なぜならapache:apacheにしてしまうとServersManの管理画面と思われるcgiの所有者がdaemon:daemonの755だったのでこの実行に問題がでてもいやなので。
User daemon
Group daemon
↓
User daemon
Group apache
SuexecUserGroup hoge hoge
これだけだとFTPやSCPでの接続はchrootして自分のホームディレクトリから出られないから不便だという場合は、単純にメイン接続ユーザーのホームディレクトリから上記ディレクトリにリンクを作成して上へ戻るでホームディレクトリに戻るように設定してしまいましょう。例えば、/home/hoge/www.example.com以下にファイルをアップして公開するようにするには下記のようにシンボリックリンクを作成してください。

ln -s /var/www/html /home/hoge/www.example.com
移動したときにcd ../で上部に戻った際、/home/hogeに戻れるようにhogeの.bashrcをviで開いて、ファイル末尾に下記の行を追加します。
alias cd='cd -P'
これでApacheで設定したドキュメントルートすなわちデフォルトのURLのアクセスに関してはsuexecで動作することが実現します。

バーチャルホストごとにsuexecを実現する場合

次にhttp://www.example2.com/をユーザーhoge2、http://www.example3.com/をhoge3などで公開してそれぞれ別のユーザーでsuexecしたい場合の説明をします。

基本的には、公開フォルダは/var/wwwの下にそれぞれ作成し、該当ユーザーのホームディレクトリにシンボリックリンクをはる方法でおこなえば問題ありません。

hoge2,hoge3ユーザー用の公開フォルダを用意します。
su -
mkdir /var/www/hoge2 /var/www/hoge3
chown hoge2. /var/www/hoge2
chown hoge3. /var/www/hoge3
ln -s /var/www/hoge2 /home/hoge2/www.example2.com
ln -s /var/www/hoge3 /home/hoge3/www.example3.com
公開フォルダの準備ができたらhttpd.confの最下部にバーチャルホスト毎の設定ファイルを読み込むように追記します。ここでは、バーチャルホストごとの設定ファイルは/etc/httpd/virtualフォルダ以下に*.confと言う名前で配置するルールにします。

vi /etc/httpd/conf/httpd.conf
-------以下ファイル内容-----------
#NameVirtualHost *:80
↓
NameVirtualHost *:80

#--- 以下追記
<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/html
    ServerName www.example.com
    SuexecUserGroup hoge hoge
    ErrorLog logs/www.example.com-error_log
    CustomLog logs/www.example.com-access_log common
</VirtualHost>

Include virtual/*.conf

次に、www.example2.com用、www.example3.com用のバーチャルホスト設定ファイルを作成します。
vi /etc/httpd/virtual/www.example2.com.conf
-------以下ファイル内容-----------
<VirtualHost *:80>
    ServerAdmin webmaster@example2.com
    DocumentRoot /var/www/hoge2
    ServerName www.example2.com
    SuexecUserGroup hoge2 hoge2
    ErrorLog logs/www.example2.com-error_log
    CustomLog logs/www.example2.com-access_log common
</VirtualHost>
vi /etc/httpd/virtual/www.example3.com.conf
-------以下ファイル内容-----------
<VirtualHost *:80>
    ServerAdmin webmaster@example3.com
    DocumentRoot /var/www/hoge3
    ServerName www.example3.com
    SuexecUserGroup hoge3 hoge3
    ErrorLog logs/www.example3.com-error_log
    CustomLog logs/www.example3.com-access_log common
</VirtualHost>
これでwww.example2.comはユーザーhoge2で、www.example3.comではユーザーhoge3でcgiが実行される環境が整いました。

次はphpをcgiモードで動作させるようにするだけですね。デフォルトではCentOS5のphpはモジュールモードで動作します。ここでは、http://www.example3.com/panelフォルダ以下のみphpがcgiモードで実行されるように/etc/httpd/virtual/www.example3.com.confを編集してみます。

最初に公開フォルダ以下にphp-cgiモード実行ファイルをhoge3ユーザー用にコピー作成しておきます。この時このプログラムがcgiとして動作するように拡張しを.cgiにしておきます。(強引な方法なので他も後日検討)
cp /usr/bin/php-cgi /var/www/hoge3/php5.cgi
chown hoge3. /var/www/hoge3/php5.cgi

次に設定ファイルを下記のように編集します。
vi /etc/httpd/virtual/www.example3.com.conf
-------以下ファイル内容-----------
<VirtualHost *:80>
    ServerAdmin webmaster@example3.com
    DocumentRoot /var/www/hoge3
    ServerName www.example3.com
    SuexecUserGroup hoge3 hoge3
    ErrorLog logs/www.example3.com-error_log
    CustomLog logs/www.example3.com-access_log common
    <Location /panel>
       SetEnv PHPRC /etc
       AddHandler php5-cgi-script .php 
       Action php5-cgi-script /php5.cgi
    </Location>
</VirtualHost>
この設定は例えば/info.phpへのアクセスを/php5.cgi/info.phpにリダイレクトするアクションを起こします。これによって、phpスクリプト自体のファイル冒頭に#!/usr/bin/phpなどとphp実行ファイルへのパスを記述する必要がないため、フリーで配布されているphpなどがほとんどそのまま動作するメリットがあります。デメリットとしては、suexec環境下のバーチャルホストにおいてはこのphp実行cgiを必ずドキュメントルートの下に配置しないと動作しないことでしょうか。抜け道があるのかもしれませんがそれはまた今度。php5.cgiファイルに関してはここで記載してあるファイル名のままでなく巧妙に名前を変更して隠した方が無難かと思われます。アクセスされてもインターナルサーバーエラーになるだけなんですがエラーログもたまりますし好ましくありません。そこで形だけでも今回コピー作成したphp5.cgiファイルへの直アクセスを拒否しておきましょう。

vi /etc/httpd/virtual/www.example3.com.conf
-------以下ファイル内容-----------
<VirtualHost *:80>
    ServerAdmin webmaster@example3.com
    DocumentRoot /var/www/hoge3
    ServerName www.example3.com
    SuexecUserGroup hoge3 hoge3
    ErrorLog logs/www.example3.com-error_log
    CustomLog logs/www.example3.com-access_log common
    <Location /panel>
       SetEnv PHPRC /etc
       AddHandler php5-cgi-script .php 
       Action php5-cgi-script /php5.cgi
    </Location>
    <Location ~ "/php5\.cgi$">
        Order Deny,Allow
        Deny From All
    </Location>
</VirtualHost>

これで設定はすべて完了です。shopformerをhttp://www.mds-tools.comからダウンロードしてzipを解凍し、shopformerフォルダの中身を丸ごと/var/www/hoge3の下にFTPやSCPでアップロードしてみましょう。転送時の設定でフォルダは705に、その他のファイルは全て604に設定しておけば吉です。

# /var/www/hoge3以下のファイルを一括変更
chmod -R 604 /var/www/hoge3
# フォルダを一括で705に変更
find /var/www/hoge3 -type d -exec chmod 705 {} \;
# 実行ファイルのphp5.cgiだけ実行可能な704に変更
chmod 704 /var/www/hoge3/php5.cgi

最後に、ServersManのデフォルトのphp.iniではNoticeメッセージが表示されて現状のshopformerでは都度表示されてしまい動作に問題が発生する可能性があるのでphp.iniのエラーレポート設定を下記のように変更します。
error_reporting  =  E_ALL
↓
error_reporting  =  E_ALL & ~E_NOTICE

書き漏れがあるかもしれないけどだいたいまぁこんな感じで動作しました。suexecでの実行の仕方は色々なパターンがありますが、その他の方法についてはまた今度にします。

haruchaco at 01:59│Comments(0)TrackBack(0) shopformer | CentOS

トラックバックURL

コメントする

名前
 
  絵文字
 
 
入間市 ジョンソンタウンと富士見公園DoCoMoのAndroid携帯GALAXY S やっときましたね