[Apache] CGI 使うなら suEXEC 設定しとこ
正月気分が抜けねぇぜ〜・・・。2012 年初投稿!今年もよろしくお願いします。nakamura です。
今年の一発目は Apache のちょいネタ。Movable Type などの CGI プログラムを Apache で動かす際に設定しておくとちょっといい感じになる suEXEC について解説してみます。Apache をよくさわる人なら何を今更なエントリーだと思いますので、華麗にスルーしちゃってください。
suEXEC ってなんなの
su して exec するんです。要は CGI の実行ユーザを任意のものに指定する為の仕組みです。デフォルトでは Apache の起動ユーザになります。
詳細はマニュアルを参照してください。
suEXEC を使わない場合の問題点
CentOS のデフォルトでは Apache の起動ユーザである apache ユーザによって CGI プログラムは実行されます。suEXEC を使わない場合、この状態で例えば MT を動かすには二通りの方法があります。
- CGI プログラム、及び MT がファイルを出力するディレクトリのオーナーを apache ユーザに変える
- apache ユーザでも実行、書き込みができるよう CGI プログラム、及び MT がファイルを出力するディレクトリのパーミッションをゆるくする
1 の方法でもひとまず MT 自体は問題なく動くでしょう。ただ現実的には全てのファイルを MT で管理するわけではなく、css や js など手動でアップロードしたいファイルも多いはずです。でもオーナー apache のディレクトリにアップロード用のユーザで書き込みはできない・・・、となると MT で出力するディレクトリと手動でアップロードするディレクトリでオーナーを細かく分けて・・・云々カンヌン・・・。あーもうシャラクセェ!パーミッション変えちまえ!という事でよくないとは思いつつも結局 2 の方法に逃げてしまったりするんですね~。
suEXEC を使ってみる
suEXEC を使うと上記のようなメンドクサイ状況があっさり解決できてしまいます。要は CGI の実行ユーザとファイルアップロード用のユーザが同じならいいわけですね。
まずはファイルアップロード用のユーザを作成します。ユーザ名はお好みで。
useradd deployer
passwd deployer
CGI と出力先のディレクトリのオーナーをアップロード用のユーザに変更します。
chown deployer:deployer -R /var/www/cgi-bin/mt/
chown deployer:deployer -R /home/projects/c-brains.jp/htdocs/
CGI ファイルには実行権限が必要です。念のため。
find /var/www/cgi-bin/mt -maxdepth 1 -mindepth 1 -type f -name "*.cgi" | xargs chmod +x
CentOS のデフォルトであれば、後は Apache の設定をして再起動するだけです。ソースからコンパイルしているとか、OS が違うとかであれば、mod_suexec が有効になっているか確認してください。
Apache の設定はだいたいこんな感じ。
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /home/projects/c-brains.jp/htdocs
ServerAdmin nakamura@example.com
# これを追加するだけ
SuexecUserGroup deployer deployer
<Directory "/home/projects/c-brains.jp/htdocs">
Options FollowSymLinks
AllowOverride All
Order Deny,Allow
</Directory>
Alias /cgi-bin /var/www/cgi-bin
<Directory /var/www/cgi-bin>
AllowOverRide All
Options ExecCGI
AddHandler cgi-script .cgi .pl
Order Deny,Allow
</Directory>
</VirtualHost>
Apache を再起動して反映します。
httpd -t
/etc/init.d/httpd restart
以上で終わりです!特にパーミッション云々を意識せずとも CGI は動くし、ファイルのアップロードもできるようになっているはずです。
終わりに
セキュリティ的にもよいですし、何よりパーミッションやらオーナーやらの設定が劇的にシンプルになるので CGI を使う際は必ず設定しています。機会があればぜひ試してみてください。