2008-09-03

Apache suEXEC on Leopard

TracをFastCGIで動かすのにsuEXECを使いたくなったので、タイトルの通り調査中。類似記事を見つけたけど、Leopard用のがないようなので、やってみた。

まず、Apacheのバージョンとコンパイルオプションを確認
$ /usr/sbin/httpd -V
Server version: Apache/2.2.8 (Unix)
Server built: Mar 4 2008 21:37:02
Server's Module Magic Number: 20051115:11
Server loaded: APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_FLOCK_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/usr"
-D SUEXEC_BIN="/usr/bin/suexec"
-D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/private/var/run/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"
都合、制約事項としては
  1. httpd-2.2.8を使う
  2. 64bitでビルド
  3. コマンドは/usr/bin/suexecに配置する
  4. mod_suexec.soも作る
と言ったところか。configureにコンパイルオプションを渡すやり方を忘れたので、環境変数で設定し、/etc/apache2/httpd.confとにらめっこしながら、パラメータを組み立てるとこんな感じ:
$ CFLAGS='-arch ppc -arch ppc64 -arch i386 -arch x86_64' \
./configure --enable-mods-shared=all \
--enable-suexec \
--with-suexec-bin=/usr/bin/suexec \
--with-suexec-caller=_www \
--with-suexec-docroot=/Library/WebServer/Documents \
--with-suexec-uidmin=500 \
--with-suexec-gidmin=20 \
--with-suexec-logfile=/var/log/apache2/suexec_log \
--with-suexec-safepath=/opt/local/bin:/usr/local/bin:/usr/bin:/bin \
--with-suexec-userdir=Sites
あとはmakeして、suexecmod_suexec.soをコピーするだけ:
$ make
$ sudo cp modules/generators/.libs/mod_suexec.so /usr/libexec/apache2/
$ sudo cp support/suexec /usr/bin/
$ sudo chown root:_www /usr/bin/suexec
$ sudo chmod 4750 /usr/bin/suexec
ちょいちょいとhttpd.confを変更すると、とりあえず動かすだけならOKだった。

gidminに設定する値が小さすぎるのが気持ち悪いところ。Leopardでユーザを作るとstaffグループで作られるのだけど、これがgid=20なのが原因。元記事だと「最初のユーザが管理権限を持つ」云々のくだりがあって、実際の危険性はファイルシステムの多くでgid=80のadminグループにWriteパーミッションが与えられていることだと思う。最初に作ったユーザはもれなくadminグループに参加しているので、問題があるのでしょう。確かに外に出すサーバではできないよなぁ。
ということで
  1. staffグループのgidを500くらいにする。
  2. ファイルシステムの所有グループをgid=0のwheelにする。
とか位やれば、まぁ安心できそう。sudo打つ回数は多くなりそうだけど、きょうびのOSはそんなもんでしょう。代替なしの環境でやるのはおっかないので折をみて。