Apache 1.3.17 のインストール
SERVER
suEXEC 付きの Apache 1.3.17 を RedHat 6.2 にインストールしてみました。
Apache のインストール
UNIX 界で有名な Web サーバ、Apache のインストールを行います。今回は、http://www.apache.org/ より apache-1.3.17.tar.gz というファイルを取得して、それをインストールすることにしました。
はじめは Apache 1.3.19 のインストールに挑戦していたのですけど、なぜか Segmentation Fault が発生して、コンパイルこそ終了するものの httpd の起動を行うことができませんでしたので、今回はバージョンを落としてでの挑戦となりました。
まずはこれを展開します。ソースは /usr/local/src/ ディレクトリ内にダウンロードしたものと想定して話を進めていきます。
cd /usr/local/src
tar xvzf apache-1.3.17.tar.gz
展開が終わったら、出来上がった apache-1.3.19/ という名のディレクトリへ入って、./configure を実行します。今回は suEXEC も使用したかったので、suEXEC 系のオプションも添えて実行してみることにしました。
cd apache-1.3.17/
./configure --enable-suexec --suexec-caller=apache --suexec-uidmin=1000 --suexec-gidmin=1000
これで、Makefile が自動的に出来上がりますので、今度はこれに少し微調整を加えます。apache を動かすためのアカウントとして、apache ( wwws ) を用意します。
/usr/sbin/groupadd wwws
/usr/sbin/useradd -g wwws -s /bin/false -d /dev/null apache
そしてこれを、Makefile の中の次の項目に設定します。
conf_user = apache
conf_group = wwws
ほかにも、conf_serveradmin や conf_servername などもありますので、このあたりは適宜設定します。
これで下準備が終わったので、続いてコンパイルとインストール作業に入ります。次のような手順で、コンパイルとインストールを行います。
make
make install
これでインストールは完了です。
設定の微調整と起動
まずは、CGI を使用できるように、/usr/local/apache/conf/httpd.conf の編集を行いました。
AddHandler cgi-script .cgi
これで CGI が起動できる準備ができました。
あとついでに、UserDir public_html が書いてあるあたりに次の行も加えておくことにします。これで各ユーザのホームディレクトリから CGI を起動できるようにします。
<IfModule mod_userdir.c>
UserDir public_html
</IfModule>
<Directory /home/*/public_html>
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
続いて Apache の起動です。起動は次のようなスクリプトを実行することで行えます。
/usr/local/apache/bin/apachectl start
これで、Apache が起動して Web が見れるようになります。
suEXEC の確認
今回の目的のひとつ、suEXEC の動作を確認方法を書いて見ます。まずは次のようなスクリプトを用意します。
#!/bin/sh
echo "Content-Type: text/plain"
echo
whoami
これを、今回は who.cgi という名前で保存することにします。
そして、これを suEXEC が許可されるユーザの public_html/ ディレクトリへコピーして Web ブラウザからそれを実行します。
たとえば www.mydomain というサーバで、ユーザーアカウント user のディレクトリ、/home/user/public_html/ に用意した場合には、http://www.mydomain/~user/who.cgi で実行することができます。
suEXEC がうまくいった場合には、ブラウザ上に実行中のユーザアカウント名が表示されます。今回の場合は user と表示されるはずです。
うまくいかなかった場合には次のことを確認してみてください。
- 目的のユーザのユーザ ID が --suexec-minuid で指定したユーザ ID 以上であるか
- 目的のユーザのグループ ID が --suexec-mingid で指定したグループ ID 以上であるか
- Apache の実行アカウントが、--suexec-caller で指定したユーザと一致しているか
- ちゃんと suEXEC が利用可能になっているか
- ちゃんと AddHeader cgi-script .cgi が設定されているか
- ユーザのホームディレクトリ上で Options ExecCGI が有効になっているか
- public_html/ がそのユーザの所有物となっているか
- who.cgi の所有者が、その public_html/ ディレクトリの Owner になっているか
- who.cgi の所有グループが、その public_html/ ディレクトリの Group になっているか
- who.cgi が自分自身が実行できる権限に設定されているか ( chmod u+x who.cgi )
- who.cgi がほかの人が書き換えられるようになっていないか ( chmod go-w who.cgi )
自分自身、このあたりの調整ですっごくてこずってしまいましたので、そのあたりをもうちょっと書いてみることにしますね。
--suexec あたりの設定確認
このあたりはちょっと確実なチェックはできないので、不安だったら ./configure あたりからやり直してください。一応、,/configure を行った後にできあがる Makefile の中の # suexec details (optional) あたりで見ることができるので、ここでチェックするのもいいでしょう。
Apache の実行アカウントが --suexec-caller で指定したユーザと一致しているか
まず、--suexec-caller に指定したユーザの確認方法は、上記の --suexec あたりの設定確認 を参照してください。Apache の実行アカウントは、/usr/local/apache/conf/httpd.conf の中の、User の設定を確認してみてください。
ちゃんと suEXEC が利用可能になっているか
まず、/usr/local/apache/bin/httpd -V を実行すると、Apache の設定が表示されます。このなかで、-D SUEXEC_BIN の値で設定されているのと同じ場所に suexec があるかを確認します。また、その suexec のパーミッションが -rws--x--x となっていること、所有者が root、所有グループが root となっていることなども確認しておきましょう。また、ちゃんと Apache が suexec を見つけたかどうかは logs/error_log に [notice] suEXEC mechanism enabled というログが残っているか で確認することができます。
CGI のパーミッションについて
suEXEC を使用して CGI を実行する場合、その CGI がおかれている public_html/ と同じユーザとグループ設定になっている必要があります。たとえばユーザアカウント user、グループが users というアカウントのホームディレクトリにある public_html/ の場合、その中の CGI スクリプトもまた、所有者 user、所有グループ users となっている必要があります。またその他の権限も重要で、自分以外にたいして書き込み権限があってはいけないようです。suexec はそのユーザになりきって実行しますので、グループやその他のユーザに対しては特に権限は必要ないので、700 というパーミッション設定でいいと思います。