|
Apache 1.2 で紹介されているsuEXECの特徴は、Apacheユーザがウェブサーバを呼び出すユーザIDとは違ったユーザIDで、CGI と SSI プログラムを動かせることが可能だということです。通常、CGI や SSI のプログラムを実行するときには、ウェブサーバを動かしているのと同じユーザによって行われます。
適切に使えば、この特徴は CGI や SSI のプログラムを個人的に開発して走らせることをユーザに許可することによるセキュリティ上のリスクを、かなり軽減することができます。しかし、suEXEC が不適切にコンフィギュアされると、いくつかの問題を引き起こし、コンピュータセキュリティに穴を開けることになります。もしそれによって生じる setuid ルートプログラムの管理や、セキュリティ問題に詳しくないのなら、suEXEC を使わないことを勧めます。
このドキュメントの冒頭に入る前に、Apache Group と、このドキュメントでの前提があります。
最初に、setuid と setgid の操作ができる UNIX の OSを使っているものとします。全てのコマンドの例は、これに関連したものです。他のプラットフォームで、それが suEXEC をサポートできるなら、そのコンフィギュレーションは異なっているかもしれません。
二番目に、コンピュータのセキュリティとその管理に関する基本的な概念をわかっているものとします。これは setuid/setgid 操作と、システムとそのセキュリティに与える様々な影響についての理解を意味します。
三番目に、修正されていないバージョンの suEXEC コードを使っているものとします。すべての suEXEC コードは、多数のベータテスターと同じ位、開発者によりていねいに調べられ、テストされます。あらゆる警戒は、単純で非常に安全なベースコードを保証するようになっています。このコードの変更は、予期しない問題と新しいセキュリティリスクを引き起こすかもしれません。セキュリティプログラムに特に精通していなくて、Apache グループと仕事を共有するつもりでないのなら、suEXEC コードを変更することは勧められません。
最後に、Apacheのデフォルトのインストールの suEXEC 部分を作っていないのは、Apacheグループの判断によるものです。終わりに、suEXEC コンフィギュレーションは、管理者に詳細な注意を要求します。このプロセスを通じて、Apache グループはそれを使うことに決めた人だけには、suEXEC インストールを制限することを望みます。
まだ付いて来れますか?大丈夫?では始めましょう!
suEXEC のコンフィギュアとインストールを始める前に、最初に、実行しようとしているセキュリティモデルを説明します。そうすることにより、suEXEC 内部で何が正確に動いているのか、システムセキュリティを保証する事前注意事項は何か、ということをより理解できます。
suEXECは、メインの Apache ウェブサーバによって呼ばれる setuid "wrapper" プログラムを基にしています。この wrapper は HTTP リクエストが、管理者がメインサーバとは違うユーザIDで実行するようにした CGI や SSI プログラムから出来ているときに、呼ばれます。そのようなリクエストが作られると、Apacheはプログラム名と、プログラム実行下のユーザ、グループのIDで suEXEC wrapper を与えます。
wrapper はそれから、うまくいくか、失敗するかを決定する以下のプロセスを用います -- もしこれらの条件のどれか一つが失敗すれば、プログラムが失敗をログしてエラーを出し、そうでなければ続行するでしょう:
もし適当な数の引数が与えられていれば、wrapper は実行するだけです。適当な引数のフォーマットは Apache ウェブサーバに知られています。もし wrapper が適当な数の引数を受け取っていなければ、ハックされるか、Apache バイナリの suEXEC 部分になにか不都合が起こるかのどちらかでしょう。
これは wrapper を実行するユーザがシステムの真のユーザであることを保証します。
このユーザは、この wrapper を走らせることを許可されていますか?たった一人のユーザ(Apache ユーザ)だけが、このプログラムの実行を許可されています。
ターゲットプログラムは先導の'/'を含んでいるか、後方参照の'..'を持っていますか?これらは許可されていません;ターゲットプログラムは Apache ウェブスペース内部に存在しなければなりません。
ターゲットユーザは存在しますか?
ターゲットグループは存在しますか?
現在、suEXEC は'root'に CGI/SSI プログラムの実行を許可していません。
最小ユーザID数はコンフィギュレーションで指定されます。これは CGI/SSI プログラムを実行することを許可されたユーザIDを可能な限り少なく設定させます。これは"system"アカウントを消すのに使います。
現在、suEXEC は CGI/SSI プログラムの実行を'root'グループに許可していません。
最小グループID数はコンフィギュレーションで指定されます。これは CGI/SSI プログラムを実行するのを許可する最低限のグループIDを設定させます。これは、"system"グループの侵入を阻止するためのものです。
ここは、プログラムが setuid と setgid のコールによってターゲットのユーザとグループになる場所です。グループアクセスリストはまた、ユーザがメンバーであるグループの全てについて初期化されます。
もしなければ、ファイルを正確には持てないでしょう。
もしリクエストがサーバの通常の分配についてなら、リクエストされたディレクトリはサーバのドキュメントルートにありますか?リクエストがUserDirについてなら、リクエストされたディレクトリは、ユーザのドキュメントルートにありますか?
他の人に対してはディレクトリを開きたくありません;オーナーユーザはこのディレクトリの内容を変更できるかもしれません。
もし存在しなければ、正しく実行されません。
オーナー以外の誰かにプログラムを変えさせたくありません。
UID/GIDを再び変更するプログラムを実行したくありません。
ユーザはファイルのオーナーですか?
suEXEC は、安全な実行パス(コンフィギュレーションによって定義される)を確立することにより、安全な環境リストに名前が載っている(コンフィギュレーションによって作られます)それらの変数を通じて、ただパスするようなプロセス環境を整えます。
ここでsuEXECは終わって、ターゲットプログラムが始まります。
これは suEXEC wrapper のセキュリティモデルの標準操作です。いくらか厳密で、CGI/SSI デザインについての新しい制限とガイドラインがありますが、セキュリティについては徐々に開発されていました。
適切な suEXEC のセットアップを妨げるようなセキュリティのリスクがどんなものであるか、というようなことについて、このセキュリティモデルがサーバコンフィギュレーションに関して、どのようにして可能な限り制限するかは、このドキュメントの"Beware the Jabberwock"セクションを参照してください。
ここはおもしろい所です。suEXEC のコンフィギュレーションとインストールは、4段階のプロセスです:suEXEC ヘッダファイルの編集、suEXEC のコンパイル、適当なロケーションへの suEXEC バイナリの配置、suEXEC の使用についての Apache のコンフィギュア。
EDITING THE SUEXEC HEADER FILE
- From the top-level of the Apache source tree, type:
cd support [ENTER]
suexec.h ファイルの編集とローカルの Apache インストールと一致する以下のマクロを変更します。
From support/suexec.h
/*
* HTTPD_USER -- Define as the username under which Apache normally
* runs. This is the only user allowed to execute
* this program.
*/
#define HTTPD_USER "www"
/*
* UID_MIN -- Define this as the lowest UID allowed to be a target user
* for suEXEC. For most systems, 500 or 100 is common.
*/
#define UID_MIN 100
/*
* GID_MIN -- Define this as the lowest GID allowed to be a target group
* for suEXEC. For most systems, 100 is common.
*/
#define GID_MIN 100
/*
* USERDIR_SUFFIX -- Define to be the subdirectory under users'
* home directories where suEXEC access should
* be allowed. All executables under this directory
* will be executable by suEXEC as the user so
* they should be "safe" programs. If you are
* using a "simple" UserDir directive (ie. one
* without a "*" in it) this should be set to
* the same value. suEXEC will not work properly
* in cases where the UserDir directive points to
* a location that is not the same as the user's
* home directory as referenced in the passwd file.
*
* If you have VirtualHosts with a different
* UserDir for each, you will need to define them to
* all reside in one parent directory; then name that
* parent directory here. IF THIS IS NOT DEFINED
* PROPERLY, ~USERDIR CGI REQUESTS WILL NOT WORK!
* See the suEXEC documentation for more detailed
* information.
*/
#define USERDIR_SUFFIX "public_html"
/*
* LOG_EXEC -- Define this as a filename if you want all suEXEC
* transactions and errors logged for auditing and
* debugging purposes.
*/
#define LOG_EXEC "/usr/local/apache/logs/cgi.log" /* Need me? */
/*
* DOC_ROOT -- Define as the DocumentRoot set for Apache. This
* will be the only hierarchy (aside from UserDirs)
* that can be used for suEXEC behavior.
*/
#define DOC_ROOT "/usr/local/apache/htdocs"
/*
* SAFE_PATH -- Define a safe PATH environment to pass to CGI executables.
*
*/
#define SAFE_PATH "/usr/local/bin:/usr/bin:/bin"
COMPILING THE SUEXEC WRAPPER
suEXEC wrapper をコンパイルする必要があります。シェルコマンドプロンプトで、 cc suexec.c -o suexec [ENTER]と入力します。これは、実行可能なsuexec wrapper を作ります。
COMPILING APACHE FOR USE WITH SUEXEC
デフォルトでは、Apache は以下の場所で suEXEC wrapper を捜すためにコンパイルされます。
From src/httpd.h
/* The path to the suEXEC wrapper */
#define SUEXEC_BIN "/usr/local/apache/sbin/suexec"
インストールが、違うディレクトリでの wrapper プログラムの配置を要求すれば、src/httpd.h を編集して、Apache サーバを再コンパイルします。このプロセスについての詳細は、Compiling and Installing Apacheを参照してください。
COPYING THE SUEXEC BINARY TO ITS PROPER LOCATION
SUEXEC_BINの定義された場所に、実行のために作られたsuexecをコピーします。
cp suexec /usr/local/apache/sbin/suexec [ENTER]
wrapper にユーザIDを設定するには、オーナールートとしてインストールされなければならず、ファイルモードに setuserid 実行ビットセットを持っていなければなりません。もしルートユーザシェルを実行できなければ、それを行って以下のコマンドを実行してください。
chown root /usr/local/apache/sbin/suexec [ENTER]
chmod 4711 /usr/local/apache/sbin/suexec [ENTER]
適切な suexec wrapper のインストールの後で、Apacheサーバを kill して、再起動しなければなりません。単純なkill -1 `cat httpd.pid`では不十分でしょう。ウェブサーバのスタートアップで、Apache が適切にコンフィギュアされた suexec wrapper を見つければ、コンソールに以下のメッセージをプリントするでしょう:
suexec wrapper を使用するための Apache のコンフィギュア
サーバスタートアップでこのメッセージを見なければ、サーバはそれを要求する wrapper プログラムをほとんど見つけることができないか、あるいは、実行可能なものが setuid root にインストールされていないのです。インストールを確認して、再び試してください。
suEXEC を使う一つの方法は、User を通っていて、VirtualHost の定義に Group 命令があることです。メインサーバのユーザIDとは違った値をこれらの命令に設定することにより、CGI リソースの全てのリクエストは、<VirtualHost> で定義された User と Group として実行されるでしょう。これらの命令の一つかそれ以上が<VirtualHost> で指定されていれば、メインサーバの userid は仮定されます。
suEXEC はまた、リクエストがユーザに送られるような CGI プログラムを実行するためにも使われます。これは実行が必要なユーザ ID に接頭文字の ~ を使うことによって行われます。この特徴を生かすために必要なことは、ユーザに CGI の実行を可能にさせ、スクリプトが上記の security checks の精査を行わなければなりません。
suEXEC wrapper は上に示されたように suexec.h で定義されたロケーションに対するログ情報を書きます。wrapper を適切にコンフィギュアして、インストールしたようなら、このログと、間違えてしまったサーバについてのエラーログを見てください。
注意! このセクションは完全ではないかもしれません。このセクションのドキュメントの最新の改訂は、Apache グループの Online Documentation を見てください。
サーバセットアップに制限を引き起こす wrapper については、2、3の興味深い点があります。suEXEC に関するなんらかの "bugs" を示す前に、これらをレビューしてください。
セキュリティと効率について、全ての suexec リクエストは、バーチャルホストのリクエストについて、トップレベルのドキュメントルートか、あるいは userdir のリクエストについて、一つの個人的なドキュメントルートのどちらかに残らなければなりません。例えば、もしコンフィギュアされた4つのバーチャルホストを持っていれば、バーチャルホストについて suEXEC に有利になるメイン Apache ドキュメント階層構造の、全てのバーチャルホスト・ドキュメントルートの最後まで構築する必要があります。(例えば forthcoming)
これを変更することは危険でもあります。この定義に含まれるあらゆるパスが信頼されたディレクトリであることを確認してください。そこでの trojan horse を走らせて世界を横切ることで、なにかを持つ人々を開けたくありません。
さらに、何をしているのかをわからずにこれを行おうとすると、大きなトラブルになります。出来る限りそれを避けてください。
The English original manual is here.