	fml CGI インターフェイスのインストールについて

				深町 賢一
------------------------------------------------------------
1	Overview
1.1	はじめに
1.2	CGI のセットアップ手順

2	実例 ( apache 1.3.14 で suexec を使う場合)
2.1	~/public_html 
2.2	CGI スクリプトの準備
2.3	メールサーバの設定 ( sendmail の場合 )
2.4	apache の設定
2.5	確認: パスワード
2.6	確認: ~fml/public_html/
2.7	テストをする

3	CGI 階層のモデル

4	CGI スクリプトをつくる

5	WWW サーバの設定の変更 (apache 1.3.x)

6	メールサーバの設定
6.1	sendmail 8.9.3 まで の場合
6.2	sendmail 8.10 以降の場合
6.3	postfix の場合

7	httpd のリスタート
7.1	httpd のリスタート
7.2	テスト: WWWにアクセスしてみる

8	suEXEC を使う場合
8.1	ユーザ fml を用意する。
8.2	apache で suexec を可能にする。
8.3	CGI スクリプトの生成

9	特定の ML だけはCGIでいじれるようにしてあげる

Appendix A	トラブルシュート
------------------------------------------------------------


注: fml CGI インターフェイスはいくつかの組み合わせで動くことが一応確認
されていますが、まだテスト段階と思って下さい。多くの組み合わせて検証さ
れてはいないとおもいます。また、メニュー項目が洗練されているかもまだわ
かりません。有志の方が挑戦していただけると幸いです。

また、fml CGI インタフェイスは Unix でしかテストされたことがありません。
なんとなく apache for NT があれば 2000/NT でも動く気がしますが
試したことはありません。チャレンジャーを募集中です:)

なお以下の $EXEC_DIR は /usr/local/fml です。

1	Overview

1.1	はじめに

fml CGI インターフェイスは makefml の代表的な機能を CGI 経由で可能にす
るものです。あなた自身が使うかどうかはともかく、この fml CGI インター
フェイスにより UNIX に不慣れな人にも各自の WWW ブラウザによるメンバー
の登録と削除などが可能になります。

また makefml config で可能なカスタマイズ項目は CGI のメニュー設定画面
でも利用できます。

現在想定されているサーバ構成は WWW は apache (1.3.x)、メールサーバは、
sendmail か postfix です。

qmail を使っている場合でもＭＬの作成および削除以外は CGI から操作する
ことはできます。qmail でのＭＬの作成方法は qmail のどの機能と組み合わ
せるのがよいかを検討中です。

1.2	CGI のセットアップ手順

次の３ステップからなります。

   CGI スクリプトの準備	htpasswd .htaccess などの設定
   apache の変更	設定変更の見本を参考にして下さい(後述)
   メールサーバの変更	設定変更の見本を参考にして下さい(後述)

本ドキュメント本編は fml GUI 専用サーバを作る前提で書かれています。
もし、稼働中の WWW サーバを大きく改造することができない場合
suexec (=> 8 章) などを使い、~fml/cgi-bin/ などといった
URL で fml CGI を使うことになります(後述)。

2	実例 ( apache 1.3.14 で suexec を使う場合)

以下は sendmail と apache 1.3.14 で suexec を使う場合の操作例です。
ここでは SSL は使わずに、Basic 認証のみです。

もし、うまくいかない場合は、まず

	/usr/local/apache/logs/error_log
	/usr/local/apache/logs/suexec_log

を見て下さい。また、付録のトラブルシュート(=> Appendix A )
も参考にして下さい。

2.1	~/public_html 

まず最初に ~/public_html を作成して下さい。

2.2	CGI スクリプトの準備

特に fml を再インストールする必要などはありません。

	makefml admin.cgi config 

を実行し、以下の順番に操作して下さい。

	項目 1 で USE_MOD_SSL を NO に変更する

	項目 2 の REAL_CGI_PATH を ~/public_html/cgi-bin/fml に変更する

	項目 4 でユーザとパスワードを設定する

 which ? (0-7) [0] 4

 user (fml) [fml] fml

 % /usr/local/apache/bin/htpasswd /usr/local/fml/www/authdb/admin/htpasswd fml
 New password: 
 Re-type new password: 

	項目 5 で、CGI スクリプトを生成する

 which ? (0-7) [0] 5

  * create /home/fukachan/public_html/cgi-bin/fml/admin/.htaccess
  * create CGI scripts in /home/fukachan/public_html/cgi-bin/fml/admin/
    menu.cgi makefml.cgi mlmenu.cgi menubar.cgi index.cgi newml.cgi rmml.cgi 

	0 を入力し、メニューを終了します。

2.3	メールサーバの設定 ( sendmail の場合 )

root になり 

   # touch /var/spool/ml/etc/aliases.db

してください。

2.4	apache の設定

apache をインストールするところから解説します。suEXEC を有効にするため
に configure を次のように実行します。

    # tar zxvf apache_1.3.14.tar.gz
    # cd apache_1.3.14/
    # ./configure --enable-suexec --suexec-caller=nobody
    # make
    # make install 

nobody の部分は httpd.conf の User 行とあわせます。デフォルトは nobody 
です。次に /usr/local/apache/conf/httpd.conf を編集します。

つぎに CGI を有効にするためにディレクトリコンテナを設定します。例えば 
ユーザ fml のホームディレクトリが /home/fml なら、次のような設定を 
httpd.conf に追加します。

    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
    </A>

    AddHandler cgi-script .cgi

httpd.conf には最初から <Directory /home/*/public_html> の見本がコメン
トとして入っていますが、それには ExecCGI が入っていません。コメントを
はずしただけではだめで、追加する必要があることに注意して下さい。

httpd.conf の編集後、

	# apachectl configtest
	OK
	# apachectl restart

/usr/local/apache/logs/error_log をみて

   Apache/1.3.14 (Unix) configured -- resuming normal operations
   suEXEC mechanism enabled (wrapper: /usr/local/apache/bin/suexec)

といったログが出ていればとりあえずは成功です。しかし、このログが出てい
ても suEXEC がうまくいかないことは多々あります。
付録のトラブルシュート例を参考に、設定の確認をして下さい。

2.5	確認: パスワード

/usr/local/fml/www/authdb ディレクトリ以下をユーザ nobody が読めること
を確認して下さい。例えば、次の用にします。

	# chmod -R go+rx `find /usr/local/fml/www/authdb -type d -print`
	# chmod -R go+r /usr/local/fml/www/authdb

注意: ユーザ nobody にも読めるように o+r をする必要がありますが、これ
      はよくありません。グループ fml に nobody を加え、g+r だけにすることが
      のぞましいのかもしれません。最終的にどちらが望ましいかは
      そのホストをどのように運用しているかに依存します。

2.6	確認: ~fml/public_html/

~/public_html/ 以下のパーミッションの確認をして下さい。

	% chmod -R go-w ~/public_html/	
	% chown -R fml:fml  ~/public_html/	

などとして、不要なパーミッションをおとしてください。

2.7	テストをする

	http://そのホスト/~fml/cgi-bin/fml/admin/menu.cgi

にアクセスしていろいろ操作してみて下さい。

特に ML を作成してみてください。MLを作成すると、
/var/spool/ml/etc/aliases にその作成したMLのエントリがあるはずです。そ
して、/var/spool/ml/etc/aliases.db (普通では読めないバイナリファイルで
すけど)中にもその作成したMLのエントリがあるはずです。

もし、うまくいってないなら、メールサーバの newaliases の設定がおかしい
ことになります。makefml admin.cgi config を実行し、項目 ６と７の設定を
見直して下さい。また、aliases.db のパーミッションを見直して下さい(注意
点については後述)。

3	CGI 階層のモデル

URL の階層がどういう前提で分けられているか、各ディレクトリの権限につい
てまとめます。

   $EXEC_DIR/www/share/cgi-bin/fml/admin/

	fml 管理者用画面といえる階層
	そのホスト上で makefml を使える人
	つまり何でもできる権限がある人と等価

	各MLの管理者とは別の集合である可能性がある
	よってパスワードは別途設定するべき(特にインストール時)

   $EXEC_DIR/www/share/cgi-bin/fml/ml-admin/$ml/

	各 ML の MAINTAINER 用の階層

	この人はメーリングリストサーバのホストに入れるとは限らない
	イメージとしてはリモート管理者に近いといえるかも。

	パスワード認証をともなうべきで
	adminコマンドと同じパスワード?

   $EXEC_DIR/www/share/cgi-bin/fml/ml/$ml/ (仮) 未実装

	一般ユーザが入る階層
	パスワード認証をともなうべき

4	CGI スクリプトをつくる

まず、fml 管理者用のスクリプトを用意します。

% makefml admin.cgi config

を実行すると以下のような画面になります。

   ************************************************************

        <<< makefml --- FML CGI Configuration Interface --- >>>

0     END
1     USE_MOD_SSL         YES
2     REAL_CGI_PATH       /usr/local/fml/www/share/cgi-bin/fml
3     CGI_AUTHDB_DIR      /usr/local/fml/www/authdb
4     CHANGE PASSWORD
5     REMAKE CGI SCRIPTS
6     MTA                 sendmail
7     HOW TO UPDATE ALIAS newaliases

which ? (0-7) [0] 

使い方も意味は何となくわかるとおもいます。

1. SSL をつかうか否か
2. WWW サーバにとって /cgi-bin/fml/ になるディレクトリです。
3. htpasswd をおくディレクトリです。

1. 2. 3. は基本的な設定といえます。SSL を使わない場合は 1. で NO にし
てください。そして 2, 3 のパス名を適当に修正して下さい。デフォールトで
は 2, 3 はそのままでも構いません。

この３つの設定をした後 4. でユーザとパスワードをつけてください。

6, 7 は aliases の更新をどのように実行するかを指定する項目です。
デフォルトは sendmail になっています。6と7は本来一組かもしれませんが、
便宜上２つにわけてあります。

メールサーバを postfix にするには 6, 7 をそれぞれ次のように変更して下さい。

	6	postfix
	7	postalias /var/spool/ml/etc/aliases

です。

○ 終了時

終了時には CGI スクリプトを作りなおすか？と聞かれます。そこで y と答え
ると $REAL_CGI_PATH 以下のスクリプトと .htaccess を再生成します。
パスを変更した場合などには再生成が必要です。

5	WWW サーバの設定の変更 (apache 1.3.x)

/usr/local/fml/www/examples/ の下に変更点の見本があります。それを参考
にして /usr/local/apache/conf/httpd.conf を編集してください。

a) ユーザの設定

	User fml

つまり /usr/local/fml や /var/spool/ml のオーナと同じにして下さい。

b) ScriptAlias 行を変更する。

	# ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

最初の行が有効になってしまうので
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" 

行も有効にしたい場合は、その行より前に

	ScriptAlias /cgi-bin/fml/ "/usr/local/fml/www/share/cgi-bin/fml/"

を足して下さい。例:

	ScriptAlias /cgi-bin/fml/ "/usr/local/fml/www/share/cgi-bin/fml/"
	ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

6	メールサーバの設定

6.1	sendmail 8.9.3 まで の場合

/etc/sendmail.cf を編集する。編集する箇所は

   O AliasFile=/etc/aliases

行です。ここを

   O AliasFile=/etc/aliases,/var/spool/ml/etc/aliases

に変更して下さい。

次に、ユーザ root になり

   # touch /var/spool/ml/etc/aliases.db

などとしておいて下さい。サフィックスが .db なのか .pag .dir なのかは 
OS によります。4.4BSD では .db です。そして sendmail をリスタートして
ください。

6.2	sendmail 8.10 以降の場合

前述の 8.9.3 の場合と同様に作業をして下さい。その後、さらに
/etc/mail/sendmail.cf に trusted user として fml を付け足してください。

	T fml

を付け足して sendmail をリスタートして下さい。これを実行しないと 
newaliases を実行できません。

6.3	postfix の場合

/etc/postfix/main.cf を次のように変更した後、
"postfix reload" を実行して下さい。

	alias_maps = hash:/etc/aliases, 
		hash:/var/spool/ml/etc/aliases

	# permit :include: operation in aliases
	allow_mail_to_commands = alias,forward,include

7	httpd のリスタート

7.1	httpd のリスタート

	# apachectl configtest

で、設定ファイルのシンタックスが OK かどうかを確かめ、

	# apachectl restart

を実行して下さい。

7.2	テスト: WWWにアクセスしてみる

例えば URL は

    http://web.fml.org/cgi-bin/fml/admin/menu.cgi

などとなります。この画面で次のようなことが可能になります。

	 ML をつくる, 消す
	 ML のユーザ登録,削除
	 ML の管理者の登録,削除
	 ML の設定(makefml config メニューでできることと同じ)
	ログをみる

8	suEXEC を使う場合

どうすれば

   http://www.xxx.yyy/~fml/cgi-bin/fml/admin/menu.cgi

のように CGI にアクセスできるようになるかを説明します。
基本的に手順は前述の fml CGI 専用機の場合と同様です。

8.1	ユーザ fml を用意する。

まず、ユーザ fml を用意します。ユーザ fml の所属するグループは fml と
しましょう。この fml の uid および gid は suEXEC の制限(ちいさ過ぎる 
UID や GID は禁止)に引っかからないようにして下さい。例えばここで ユー
ザ fml の uid は 1000、gid 1000 とします。

8.2	apache で suexec を可能にする。

suexec のログや /usr/local/apache/logs/error_log を見ながら
suexec がうごくことを確認して下さい。

典型的なインストール例は以下の通りです。
    # tar zxvf apache_1.3.14.tar.gz
    # cd apache_1.3.14/
    # ./configure --enable-suexec --suexec-caller=nobody
    # make
    # make install 

おそらく /usr/local/apache/conf/httpd.conf の変更が必要です。例えば、
この 2 箇所辺りです。config ファイルでの ExecCGI の追加と AddHandler 
の定義について調べて下さい。
    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
    
    AddHandler cgi-script .cgi

ExecCGI と AddHandler cgi-script .cgi の部分が特に重要です。

もし、ホームディレクトリが /home/マシン名/ユーザ名 (例:
/home/ahodori/fukachan )のようになるなら

    <Directory /home/*/*/public_html>
        AllowOverride FileInfo AuthConfig Limit
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
    
    AddHandler cgi-script .cgi

としてください。

8.3	CGI スクリプトの生成

次に、ユーザ fml で ~/public_html/ を作って下さい。

	% su fml
	% mkdir ~/public_html
	% chmod 755 ~/public_html

そして、このディレクトリの下に CGI スクリプトを生成します。

	% makefml admin.cgi config

を実行すると以下のメニュー画面になります。

   0     END
   1     USE_MOD_SSL         YES
   2     REAL_CGI_PATH       /usr/local/fml/www/share/cgi-bin/fml
   3     CGI_AUTHDB_DIR      /usr/local/fml/www/authdb
   4     CHANGE PASSWORD
   5     REMAKE CGI SCRIPTS
   6     MTA                 sendmail
   7     HOW TO UPDATE ALIAS newaliases

   which ? (0-7) [0] 

2 を選択し、/home/fukachan/public_html/cgi-bin/fml に変更します。
次に 4 を実行して、ユーザとパスワードを設定して下さい。
そして 5 を実行すると

	~/public_html/cgi-bin/fml/admin/*.cgi

が生成されます。

(たぶん必要ないと思いますけど)念には念をいれて

	% su fml
	% chown -R fml ~/public_html
	% chgrp -R fml ~/public_html
	% chmod -R go-w ~/public_html

を実行しパーミッションの念押しをしておくとなお良いと思います。

9	特定の ML だけはCGIでいじれるようにしてあげる

例えば elena ML の設定を有効にするには次のようなコマンドを実行して下さい。

   % makefml ml-admin.cgi elena config

   0     END
   1     USE_MOD_SSL         YES
   2     CHANGE PASSWORD
   3     REMAKE CGI SCRIPTS

使い方は admin.cgi と同様です。1 は SSL を使うか否か？です。2 でユーザ
とパスワードを設定して下さい。3 で ml-admin/ 以下の CGI スクリプトと 
.htaccess が再生成されます。

階層が異なるだけで、基本的なノウハウは admin.cgi の場合と同様です。

Appendix A	トラブルシュート

うまくいかない時は fml 自体ではなく WWW サーバもしくはメールサーバの
設定でつまづいていることが多いようです。
まずそれぞれのサーバのログを確認しエラー等がないかを確認して下さい。
また各 WWW サーバの詳細な設定の仕方、方法についてそれぞれのサーバのマ
ニュアルや文献を確認して下さい。

Q: SSL 

/usr/local/fml/www/share/cgi-bin/fml/admin/.htaccess: 
	Invalid command 'SSLRequireSSL', 〜略〜

.htaccess で SSL を使うように設定されています。しかし apache が SSL 対
応出ない場合にこのエラーメッセージが出ます。

	% makefml admin.cgi config 

を実行し、メニュー１で SSL を使わないようにして下さい。 

Q: ~/public_html/ のパーミッションの確認

	ファイルのモード  ( ユーザ fml 以外は書き込むことができません )
	オーナ、グループ、( ディレクトリとファイルすべて
				オーナが fml
				グループが fml	
				になっている必要があります。
			  )
	UID、GID が両方とも1000より大きいか？

念のため次のコマンドを実行するとよいでしょう。

	% chmod -R go-w ~/public_html/	
	% chown -R fml:fml  ~/public_html/	

ファイルを読むことは誰にでもできるようになっているかも確認して下さい。
例:

     % ls -lR ~/public_html
     total 1
     drwxr-xr-x  4 fml  fml  512 Nov 28 09:07 cgi-bin/

     /home/fml/public_html/cgi-bin:
     total 2
     drwxr-xr-x  2 fml  fml  512 Nov 28 09:07 admin/
     drwxr-xr-x  3 fml  fml  512 Nov 28 09:07 fml/

     /home/fml/public_html/cgi-bin/admin:

     /home/fml/public_html/cgi-bin/fml:
     total 1
     drwxr-xr-x  2 fml  fml  512 Dec 16 21:18 admin/

     /home/fml/public_html/cgi-bin/fml/admin:
     total 7
     -rwxr-xr-x  1 fml  fml  618 Dec 16 21:18 index.cgi
     -rwxr-xr-x  1 fml  fml  575 Dec 16 21:18 makefml.cgi
     -rwxr-xr-x  1 fml  fml  616 Dec 16 21:18 menu.cgi
     -rwxr-xr-x  1 fml  fml  622 Dec 16 21:18 menubar.cgi
     -rwxr-xr-x  1 fml  fml  648 Dec 16 21:18 mlmenu.cgi
     -rwxr-xr-x  1 fml  fml  618 Dec 16 21:18 newml.cgi
     -rwxr-xr-x  1 fml  fml  616 Dec 16 21:18 rmml.cgi

Q: パスワードファイルのパーミッションの間違い

(13)Permission denied: Could not open password file: /usr/local/fml/www/authdb/admin/htpasswd

authdb/ 以下はユーザ nobody などが読めるようになっていないといけません。
そのため authdb/ ディレクトリ以下を誰にでも読めるように設定して下さい。
たとえば

	# chmod -R go+r /usr/local/fml/www/authdb

もしくは
	# chmod -R go+rx `find /usr/local/fml/www/authdb -type d -print`
	# chmod -R go+r /usr/local/fml/www/authdb

としてください。 

注意: ユーザ nobody にも読めるように o+r をする必要がありますが、これ
      はよくありません。グループ fml に nobody を加え、g+r だけにすることが
      のぞましいのかもしれません。

Q: Options ExecCGI is off in this directory

    <Directory /home/*/public_html>
        AllowOverride FileInfo AuthConfig Limit
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
    </A>

Options に ExecCGI がぬけていませんか？もしくはホームディレクトリは 
/home/* 形式でただしいですか？

Q: menu.cgi の中身が見えてしまう

AddHandler cgi-script .cgi を追加するのを忘れていませんか？

Q: suexec.log に crit: calling user mismatch (nobody instead of www)

これは httpd.conf の User の名前との不整合のためです。例えば
httpd.conf の User は nobody なのに、apache のインストールの際に

   # ./configure --enable-suexec --suexec-caller=nobody

ではなく、

   # ./configure --enable-suexec --suexec-caller=www

としてしまった場合です。この caller= と httpd.conf の User の名前は同
じものにして下さい。

Q: suexec.log に  target uid/gid (1000/1000) mismatch with directory ...

UID が 1000、GID が 1000 であることを suEXEC は期待していますが、ディ
レクトリの設定が実際には間違っています。~/public_html 以下のディレクト
リのオーナ（UID）とグループID（GID）を確認してください。

$FML: INSTALL_CGI.wix,v 1.23.2.2 2001/08/23 11:46:45 fukachan Exp $
