[an error occurred while processing this directive]
[APACHE DOCUMENTATION]

Apache HTTP Server Version 1.3

Apache suEXEC サポート

    CONTENTS
  1. suEXECとは?
  2. 始める前に
  3. suEXEC セキュリティモデル
  4. suEXEC のコンフィギュアとインストール
  5. suEXEC の有効化と無効化
  6. suEXEC のデバッギング
  7. Jabberwock の注意: 警告と例

suEXECとは?

Apache 1.2 で紹介されているsuEXECの特徴は、Apacheユーザがウェブサーバを呼び出すユーザIDとは違ったユーザIDで、CGISSI プログラムを動かせることが可能だということです。通常、CGI や SSI のプログラムを実行するときには、ウェブサーバを動かしているのと同じユーザによって行われます。

適切に使えば、この特徴は CGI や SSI のプログラムを個人的に開発して走らせることをユーザに許可することによるセキュリティ上のリスクを、かなり軽減することができます。しかし、suEXEC が不適切にコンフィギュアされると、いくつかの問題を引き起こし、コンピュータセキュリティに穴を開けることになります。もしそれによって生じる setuid ルートプログラムの管理や、セキュリティ問題に詳しくないのなら、suEXEC を使わないことを勧めます。

BACK TO CONTENTS

始める前に

このドキュメントの冒頭に入る前に、Apache Group と、このドキュメントでの前提があります。

最初に、setuidsetgid の操作ができる UNIX の OSを使っているものとします。全てのコマンドの例は、これに関連したものです。他のプラットフォームで、それが suEXEC をサポートできるなら、そのコンフィギュレーションは異なっているかもしれません。

二番目に、コンピュータのセキュリティとその管理に関する基本的な概念をわかっているものとします。これは setuid/setgid 操作と、システムとそのセキュリティに与える様々な影響についての理解を意味します。

三番目に、修正されていないバージョンの suEXEC コードを使っているものとします。すべての suEXEC コードは、多数のベータテスターと同じ位、開発者によりていねいに調べられ、テストされます。あらゆる警戒は、単純で非常に安全なベースコードを保証するようになっています。このコードの変更は、予期しない問題と新しいセキュリティリスクを引き起こすかもしれません。セキュリティプログラムに特に精通していなくて、Apache グループと仕事を共有するつもりでないのなら、suEXEC コードを変更することは勧められません

最後に、Apacheのデフォルトのインストールの suEXEC 部分を作っていないのは、Apacheグループの判断によるものです。終わりに、suEXEC コンフィギュレーションは、管理者に詳細な注意を要求します。このプロセスを通じて、Apache グループはそれを使うことに決めた人だけには、suEXEC インストールを制限することを望みます。

まだ付いて来れますか?大丈夫?では始めましょう!

BACK TO CONTENTS

suEXEC セキュリティモデル

suEXEC のコンフィギュアとインストールを始める前に、最初に、実行しようとしているセキュリティモデルを説明します。そうすることにより、suEXEC 内部で何が正確に動いているのか、システムセキュリティを保証する事前注意事項は何か、ということをより理解できます。

suEXECは、メインの Apache ウェブサーバによって呼ばれる setuid "wrapper" プログラムを基にしています。この wrapper は HTTP リクエストが、管理者がメインサーバとは違うユーザIDで実行するようにした CGI や SSI プログラムから出来ているときに、呼ばれます。そのようなリクエストが作られると、Apacheはプログラム名と、プログラム実行下のユーザ、グループのIDで suEXEC wrapper を与えます。

wrapper はそれから、うまくいくか、失敗するかを決定する以下のプロセスを用います -- もしこれらの条件のどれか一つが失敗すれば、プログラムが失敗をログしてエラーを出し、そうでなければ続行するでしょう:

  1. wrapper は適当な数の引数で呼ばれますか?
    もし適当な数の引数が与えられていれば、wrapper は実行するだけです。適当な引数のフォーマットは Apache ウェブサーバに知られています。もし wrapper が適当な数の引数を受け取っていなければ、ハックされるか、Apache バイナリの suEXEC 部分になにか不都合が起こるかのどちらかでしょう。
  2. この wrapper を実行するユーザはシステムの正当なユーザですか?
    これは wrapper を実行するユーザがシステムの真のユーザであることを保証します。
  3. この正当なユーザは wrapper を走らせることを許可されていますか?
    このユーザは、この wrapper を走らせることを許可されていますか?たった一人のユーザ(Apache ユーザ)だけが、このプログラムの実行を許可されています。
  4. ターゲットプログラムは不安定な階層的な参照をしますか?
    ターゲットプログラムは先導の'/'を含んでいるか、後方参照の'..'を持っていますか?これらは許可されていません;ターゲットプログラムは Apache ウェブスペース内部に存在しなければなりません。
  5. ターゲットユーザ名は正当ですか?
    ターゲットユーザは存在しますか?
  6. ターゲットグループ名は正当ですか?
    ターゲットグループは存在しますか?
  7. ターゲットユーザはスーパーユーザではないのですか?
    現在、suEXEC は'root'に CGI/SSI プログラムの実行を許可していません。
  8. ターゲットユーザIDは最小ID数より多いですか?
    最小ユーザID数はコンフィギュレーションで指定されます。これは CGI/SSI プログラムを実行することを許可されたユーザIDを可能な限り少なく設定させます。これは"system"アカウントを消すのに使います。
  9. ターゲットグループはスーパーユーザグループではないのですか?
    現在、suEXEC は CGI/SSI プログラムの実行を'root'グループに許可していません。
  10. ターゲットグループIDは最小ID数より大きいですか?
    最小グループID数はコンフィギュレーションで指定されます。これは CGI/SSI プログラムを実行するのを許可する最低限のグループIDを設定させます。これは、"system"グループの侵入を阻止するためのものです。
  11. wrapperはうまくターゲットユーザとグループになれますか?
    ここは、プログラムが setuid と setgid のコールによってターゲットのユーザとグループになる場所です。グループアクセスリストはまた、ユーザがメンバーであるグループの全てについて初期化されます。
  12. プログラムが常駐しているディレクトリはありますか?
    もしなければ、ファイルを正確には持てないでしょう。
  13. Apacheのウェブスペースにディレクトリはありますか?
    もしリクエストがサーバの通常の分配についてなら、リクエストされたディレクトリはサーバのドキュメントルートにありますか?リクエストがUserDirについてなら、リクエストされたディレクトリは、ユーザのドキュメントルートにありますか?
  14. ディレクトリは誰か他の人によって書き込みができないのですか?
    他の人に対してはディレクトリを開きたくありません;オーナーユーザはこのディレクトリの内容を変更できるかもしれません。
  15. ターゲットプログラムは存在しますか?
    もし存在しなければ、正しく実行されません。
  16. ターゲットプログラムは誰か他の人によって書き込みができないのですか?
    オーナー以外の誰かにプログラムを変えさせたくありません。
  17. ターゲットプログラムは setuid か setgid ではないのですか?
    UID/GIDを再び変更するプログラムを実行したくありません。
  18. ターゲットの user/group はプログラムの user/group と同じですか?
    ユーザはファイルのオーナーですか?
  19. 首尾よく安全な操作をできるプロセス環境を整えることができますか?
    suEXEC は、安全な実行パス(コンフィギュレーションによって定義される)を確立することにより、安全な環境リストに名前が載っている(コンフィギュレーションによって作られます)それらの変数を通じて、ただパスするようなプロセス環境を整えます。
  20. 首尾よくターゲットプログラムになって、実行することができますか?
    ここでsuEXECは終わって、ターゲットプログラムが始まります。

これは suEXEC wrapper のセキュリティモデルの標準操作です。いくらか厳密で、CGI/SSI デザインについての新しい制限とガイドラインがありますが、セキュリティについては徐々に開発されていました。

適切な suEXEC のセットアップを妨げるようなセキュリティのリスクがどんなものであるか、というようなことについて、このセキュリティモデルがサーバコンフィギュレーションに関して、どのようにして可能な限り制限するかは、このドキュメントの"Beware the Jabberwock"セクションを参照してください。

BACK TO CONTENTS

suEXEC のコンフィギュアとインストール

ここはおもしろい所です。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]

BACK TO CONTENTS

suEXEC の有効化と無効化

適切な 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> で定義された UserGroup として実行されるでしょう。これらの命令の一つかそれ以上が<VirtualHost> で指定されていれば、メインサーバの userid は仮定されます。

suEXEC はまた、リクエストがユーザに送られるような CGI プログラムを実行するためにも使われます。これは実行が必要なユーザ ID に接頭文字の ~ を使うことによって行われます。この特徴を生かすために必要なことは、ユーザに CGI の実行を可能にさせ、スクリプトが上記の security checks の精査を行わなければなりません。

BACK TO CONTENTS

suEXEC のデバッギング

suEXEC wrapper は上に示されたように suexec.h で定義されたロケーションに対するログ情報を書きます。wrapper を適切にコンフィギュアして、インストールしたようなら、このログと、間違えてしまったサーバについてのエラーログを見てください。

BACK TO CONTENTS

Jabberwock の注意: 警告と例

注意! このセクションは完全ではないかもしれません。このセクションのドキュメントの最新の改訂は、Apache グループの Online Documentation を見てください。

サーバセットアップに制限を引き起こす wrapper については、2、3の興味深い点があります。suEXEC に関するなんらかの "bugs" を示す前に、これらをレビューしてください。

BACK TO CONTENTS


Apache HTTP Server Version 1.3

検索文字
このJAPACHE!ニュースグループへ ( japache.suEXEC ) | JAPACHE!ニュースについて | JAPACHE!ホームページへ

Index The English original manual is here.


このページの情報に関わる、ご質問、お問い合わせは、 japache@infoscience.co.jpまで。

JAPACHE ホームページ