Mac OS XにsuEXECを

'02.7.3 ('05.4.28更新)

suEXECをインストールするだけなら、Apacheの再インストールまでは必要ありません。あるとしたら、suEXECを置く場所の変更をする場合です (--sbindirオプションで指定)。Apacheのmakeまでは必要ですが。

suEXECをインストールするには2通りあって、suEXECの設定オプション付きでconfigureしてApacheと同時にmakeする方法と、オプション無しでApacheのconfigureとmakeを行い、suexec.hで必要事項の設定をしてから「% make suexec」する方法があります。ここでは前者の方法を紹介します。

(自己責任で行ってください。suEXECの設定は、意味を理解しないで行うと危険です。ここで紹介する方法に問題が無いとの保証もできません)


インストール手順

ソースをダウンロードしてきて展開

suEXECだけ入れるなら、OS Xに入ってるバージョンにあわせます。ソースのアーカイブは「JAPAN APACHE USERS GROUP」等からダウンロード。(以下は1.3.26の場合)

% tar xzf apache_1.3.26.tar.gz

ディレクトリ内に入る

% cd apache_1.3.26

configure

suEXEC設定オプションをつけてconfigureします。Apacheのインストールまでするなら、suEXEC以外のオプションも必要ですね。(コピーし易いよう改行無しで書いてあります。uidmin=502は暫定です。オプション解説参照のこと)

% ./configure --enable-suexec --suexec-docroot=/Library/WebServer/Documents --suexec-userdir=Sites --suexec-uidmin=502 --suexec-gidmin=20

デフォルトのままでいいオプションもありますが、全てのオプションの解説。 ([ ]内はOS Xでconfigureした場合のデフォルト)

--enable-suexec
suEXECを有効にする。(これだけしか書かないとエラー)
--suexec-caller=www
Apacheを動作させるユーザ名 [www] (httpd.confのUserと同じにする)
--suexec-docroot=/Library/WebServer/Documents
suEXECの動作するドキュメントルート [/Library/WebServer/htdocs]
--suexec-userdir=Sites
ユーザのサブディレクトリ名 [public_html]
--suexec-logfile=/var/log/httpd/suexec_log
ログファイルの場所。デフォルトではログディレクトリ [/var/log/httpd/suexec_log]
--suexec-uidmin=502
対象ユーザとして許されるUIDの最小値。OS Xのユーザは501からで、デフォルトで管理者権限を持つことになるため、安全を考え502にします。他に管理者権限を持つユーザがいれば、それを避けてください (そのユーザのCGIは動作しなくなります)。ローカルでCGIテストのためだけに使う場合は、501として自分で作ったCGIをそのまま使えるようにします。[100]
--suexec-gidmin=20
対象グループとして許されるGIDの最小値。OS Xのユーザのグループstaffは20 [100] (必要以上に小さくすると危険)
--suexec-safepath=/usr/local/bin:/usr/bin:/bin
CGIに渡される安全なPATH環境変数 [/usr/local/bin:/usr/bin:/bin] (安全性の確認できないパスを追加するのは危険)
--suexec-umask=077
CGIが作るファイルのumask [サーバの設定値 通常022] (公開するHTMLファイルを作るなら022ですが、CGIからしか読まないファイルを作るなら077が安心。この設定をするとプログラムの書き換えが必要になるかもしれません)

設定内容の確認には、「--layout」を追加してconfigureします。その場合、configureそのものは行われません。

make

% make

Apacheの上書きインストールなら、次に「% make install」しておしまい。しかし、われわれはsuEXECだけをインストールするのであった。

動作ディレクトリにコピー

apache_1.3.26/src/support/suexecを/usr/sbinに入れます。

% sudo cp src/support/suexec /usr/sbin

ユーザとパーミッションの設定

所有者rootでSUIDビットを立てます。つまり、ユーザwwwがrootとしてsuEXECを起動し、CGIのユーザとグループを所有者と同じに変更して動かします。

 % cd /usr/sbin
 % sudo chmod 4711 suexec
(% sudo chown root suexec)

sudoでコピーしたので、ユーザは変更せずともrootのはずです。パーミッションを変えると以下のようになります。

-rws--x--x  1 root  wheel   18820 Jul  3 18:04 suexec

インストール確認

一番下の行に「suexec: enabled」が出ればOK

% httpd -l
Compiled-in modules:
  http_core.c
  mod_so.c
suexec: enabled; valid wrapper /usr/sbin/suexec

Apacheの再起動

Apacheをkillして再起動。HUPやUSR1による再起動ではだめ。

つまり「apachectl restart」「apachectl graceful」は使えない。

% sudo apachectl stop

% sudo apachectl start

これでユーザディレクトリ内のCGIは、オーナー権限で動くようになりますが、/Library/WebServer/CGI-Executables 内のCGIは、指定ディレクトリ外なので影響ありません。

suEXECの無効化は、suexecファイルを削除し、Apacheをkillして再起動。

suexec.hの設定

今回は使いませんでしたが、設定内容はsuEXEC設定オプションと同じです。

#define HTTPD_USER "www"
#define UID_MIN 500
#define GID_MIN 20
#define USERDIR_SUFFIX "Sites"
#define LOG_EXEC "/var/log/httpd/suexec_log"
#define DOC_ROOT "/Library/WebServer/Documents"
#define SAFE_PATH "/usr/local/bin:/usr/bin:/bin"

参考文献

謝辞