- 2007-04-27 (金) 2:53
少し調べたので、まとめておきます。
suEXECって何?
Apache のモジュールの一つです。CGIプログラムなどを web サーバの実行ユーザとは異なるユーザIDで動作させることができるようになります。各ユーザの ホームディレクトリ/public_html 以下に置かれた cgi を各ユーザ権限で実行したり、またディレクトリごとに cgi の実行ユーザを指定することもできます。
公式ドキュメント: suEXEC サポート - Apache HTTP サーバ
メリット
・suEXEC 環境では CGI はユーザ権限で実行されるため、CGIに問題があった場合にも、他のユーザやシステムに影響が及ぶのを防ぐことができます。
・suECEXを使用しない場合、CGI は web サーバのユーザ(apache、nobodyなど)で実行され、それによって生成されるファイルのオーナは 、web サーバのオーナとなります。そのため一般ユーザ権限では削除出来ずに管理者の頼む必要があるなど、管理が煩雑になる場合があります。suecex によって、各ユーザに管理を任せられるようになります。
・CGI ファイルのパーミッションを絞ることができます。suECEX 環境では CGI はオーナ権限で実行されるため、オーナのみに実行権限を与えれば大丈夫です。(逆に権限を与えすぎると動かない。詳細は後述。)
制限
suEXEC の実体は、setuidされたrootのプログラムです。 Permission復習 でも書いたように、setuid されたプログラムは、使い方を誤ると大変危険です。そのため、suecex には多くの制限がかかっており、そのチェックに引っ掛かると動作しないようになっています。例として、以下ような制限があります。
・suecex 経由で実行されるcgiのオーナは、suexec で実行されるユーザでなければなりません。(ApacheSuexec - TachTrac - Trac で言及されているように、この制限は簡単に回避可能ですが、使用はできるだけ控えるべきです。)
・CGIファイルとそのディレクトリに対し、他人の書き込みが許可されいる場合(777など)、CGIは実行されません。
私は以下のようなパーミッション設定にしています。
CGIファイル: 700
ディレクトリ: 701
HTML、CSS、その他のファイル: 604
利用方法 (CentOS4.4環境)
CentOS4.4 では、suecec がデフォルトで有効になっているので簡単です。suecec の設定は、 `suexec -V` で確認できます。
# suexec -V
-D AP_DOC_ROOT=”/var/www” #ユーザディレクトリを除き、 suEXEC が動作で使用する唯一のディレクトリ
-D AP_GID_MIN=100 #suEXEC の対象グループとして許される GID の最小値
-D AP_HTTPD_USER=”apache” #suexec の実行を許可されたユーザ。apacheを動作させるユーザ名を指定
-D AP_LOG_EXEC=”/var/log/httpd/suexec.log” #suEXEC の処理とエラーが記録されるファイル名
-D AP_SAFE_PATH=”/usr/local/bin:/usr/bin:/bin”
-D AP_UID_MIN=500 #suEXEC の対象ユーザとして許される UID の最小値
-D AP_USERDIR_SUFFIX=”public_html” #suEXEC がアクセスを許されるユーザホームディレクトリ配下の サブディレクトリ
基本的に、各ユーザのホームディレクトリ配下の USERDIR_SUFFIX で指定されたディレクトリと、AP_DOC_ROOT で指定されたディレクトリ以外では、suexec は動作しません。
各ユーザのホームディレクトリ配下の USERDIR_SUFFIX で指定されたディレクトリ(この場合は public_html )に置かれた cgi ファイルは、該当のユーザ権限で実行されます。CetnOS4.4 では、apacheのユーザディレクトリの設定(設定例) を行うだけで、public_html に置かれた cgi ファイルは各ユーザ権限で動作します。
AP_DOC_ROOT で指定されたディレクトリ(この場合は/var/www) 以下では、指定しない限り、cgi は AP_HTTPD_USER で指定されたユーザ (この場合は apache ) で実行されます。特定のユーザで実行したい場合は、httpd.conf で SuexecUserGroup ディレクティブを使って指定します。このブログでは、以下のように設定しています。
設定例 (このブログ)
- /var/wwwに juyama.net というディレクトリを作成し、オーナを web とする
- 各ファイルのパーミッションを設定する (CGIファイル: 700、ディレクトリ: 701、 HTMLやCSSなどのその他ファイル: 604)
httpd.conf に以下のように記述。
<VirtualHost *:80>
ServerName juyama.net
DocumentRoot /var/www/juyama.netSuexecUserGroup web web
<Directory “/var/www/juyama.net”>
Options FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
動作確認
以下のスクリプトを whoami.cgi などの名前で保存してブラウザから実行することで、suexec の動作を確認することが出来ます。suexec により一般ユーザ権限で実行されている場合、そのユーザ名表示されます。そうでない場合は、web サーバの実行ユーザ (apache、nobodyなど) が表示されます。
#!/usr/bin/perl
print “Content-type: text/plain\n\n”
print `whoami`;
module版PHPとsuexec
module版PHPは、suexec環境でもwebサーバの実行ユーザで実行されるため、それによって操作されるディレクトリには適所権限を与えなければなりません。このブログで使用しているMovableType3.3 のダイナミックパブリッシング機能は、module版PHP によって実現されています。そのため、template_c ディレクトリのパーミッションは707にしています。(軽くハマりました。) FreshReader の db ディレクトリなども同様です。
参考
- suEXEC サポート - Apache HTTP サーバ
- suEXEC環境への移行 - パソコンおやじ
- WWWサーバの構築(CentOS編) - パソコンおやじ
- ApacheSuexec - TachTrac - Trac
- Newer: ハードウェア構成
- Older: MT 自宅サーバへの移転と各種設定
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://juyama.net/2007/04/27/22/trackback
- Listed below are links to weblogs that reference
- Apache の suEXEC について from juyama.net

