[PREVIOUS CHAPTER] [NEXT CHAPTER]
4 リモート管理


この章は「MLの管理のためにfmlの走っているマシンには入ることなく、メー
ルでfmlにコマンドを送ってメンバーの登録などを行なう」などの話です。
注意: 管理者がコマンドを送ってメンバーの登録を行なうやり方は手動登録と
呼んでいます。例: "admin subscribe fukachan@fml.org"


リモート管理用のコマンドは help-admin というファイルをみて下さい。


4.1	イントロダクション
../utility_programs 6.17

FMLでの"リモート管理"とはML管理者が guide などのファイルや配送リスト
(e.g. members)などをそのMLサーバのマシンに入って直接いじるのではなく
サーバにコマンドメールを送って ML の設定ファイルなどをメインテナンスす
ることを意図しています。

デフォールトの設定では『リモート管理ができる人』は
	メンバーリストに登録されている($ADMIN_MEMBER_LISTへ登録)
かつ
	パスワードを知っている
人達です。パスワードは複数人いたらそれぞれに別のパスワードを付けること
ができます。パスワード認証が要らない等のカスタマイズもできます。PGP を
使った認証もできます。
4.6

現在では makefml があるので、これを使って登録とパスワードの初期化をす
るとよいでしょう。PGP では各MLごとに独立したPGPPATHを使ってPGP
pubringを独立に保守しています。そのため間違えないように常に makefml
pgp を使うと便利です。

根本的な問題として SMTP (Simple Mail Transfer Protocol) では原理的に認
証はできないということがあります。パスワードによる認証もまたあてにはな
りません。パスワードを含むメールが FAIL してどこかのポストマスタにうっ
かり見えてしまう可能性もあります(普通はヘッダだけですが)。でもその場合
でもヘッダの Approval: password フィールドは見えてしまいます。

そういう意味でリモート管理は決して"推奨していません"が、実用上しかたな
く使うことになるケースも一杯あるらしいので実装しています。そういうもの
だと心に止めておいて下さい。

認証に関してはPGPベースがもっとも安全です。PGPベースでのリモート管理なら
まぁ推奨してもよいです:)

FYI: draft-myers-smtp-auth-11.txt ?

4.2	より安全を考えると

より安全を考えるならそもそも SMTP でコントロールしてはいけません。
例えば Secure Shell で(認証は RSA して)

	ssh remote-host $FML/makefml add address

や
	scp remote-host:$FML/ml/elena/guide newguide 
	newguide を編集
	scp newguide remote-host:$FML/ml/elena/guide

のような操作をする方がはるかに優れていると思います。これならコネクショ
ンがRSA認証されていてなおかつ128bitのIDEAで暗号化されるという優れ物で
す。

なおマシンの上で他の人に覗かれた場合は少しだけましで、etc/passwd とい
うパスワードを保存するファイルにパスワードをcryptで暗号化して保存して
います。

	$REMOTE_ADMINISTRATION_AUTH_TYPE = "crypt"; (default)


	$REMOTE_ADMINISTRATION_AUTH_TYPE = "md5";
の時は MD5 で保存します(旧 $USE_MD5)。そのためパスワードファイルの編集
には makefml passwd を使って下さい(もちろん自分で crypt してもいいです
けど普通手動ではしないでしょう:)。

4.3	リモート管理モードを有効にする

makefml で設定を変更できます。変更すると config.ph で次の変数がセット
されます。

	$REMOTE_ADMINISTRATION = 1;

$REMOTE_ADMINISTRATION = 1; を設定するとリモート管理を可能にします。
makefml config ML で操作できます。認証の仕方ですがデフォールトでは

	$REMOTE_ADMINISTRATION_AUTH_TYPE = "crypt";

	(config.ph CFVersion 3 以前では
		$REMOTE_ADMINISTRATION = 1;
		$REMOTE_ADMINISTRATION_REQUIRE_PASSWORD = 1;
	に相当)

と定義されています。これは

	リモート管理を認め
	管理者であることを証明するためには
		メールヘッダの From: 行が管理者メンバーに登録されていて
	   かつ
		パスワード認証が必要

という設定です。crypt, pgp などへの変更も makefml config でできます。

という設定です。メールヘッダの From: 行が管理者メンバーに登録されてい
るだけで十分でパスワード認証を必要としない場合は

	$REMOTE_ADMINISTRATION_AUTH_TYPE = "address";

とすればそうなりますが、これはするべきではありません。
$REMOTE_ADMINISTRATION_AUTH_TYPE は

		address		From:での認証
		crypt		From:での認証+パスワード(cryptして保存)
		md5		From:での認証+パスワード(MD5で保存)
		pgp		PGPベースでの認証(Chapter ../encryption 4.0)

のいずれかです。

4.4	admin コマンド

リモートで管理を許される人は

	admin コマンド オプション
もしくは
	approve パスワード コマンド オプション

というシンタックスのコマンドをMLサーバに送ることで様々な操作をするこ
とができます。

パスワード認証(crypt or md5)を必要とする場合、一般に次のような一連のコ
マンドをいれることになります。
注意: パスワードが関係するのは $REMOTE_ADMINISTRATION_AUTH_TYPE が 
crypt と md5 の時だけです。またPGPではコマンド列を書いた後メール本文全
体にPGPをかけます。

Example:
	admin pass password
	admin addadmin fukachan@sapporo.iij.ad.jp
	admin add      fukachan@sapporo.iij.ad.jp

4.5	Approve Password Command Syntax
../utility_programs 3.0

admin 形式は
   password認証して、その後は全部認証したものとみなす

approve 形式は
   毎回 password を書く 

どっちもそれなりに面倒くさいですが…ようはapproveは毎回 password を書
くことだと思えばいいでしょう。このコマンドは Listserv スタイルとの互換
性のために付け加えられました

例:	(上と同じコマンド)
	approve パスワード addadmin fukachan@sapporo.iij.ad.jp
	approve パスワード add      fukachan@sapporo.iij.ad.jp

つまり

	approve password commands 

は 2行分

	admin pass password
	admin commands

と同じになります。つまり『admin コマンド』は『approve password コ
マンド』と等価です。apporove スタイルはPGPでは意味がありません(パスワー
ドを使わないし、パスワードを平文で書きたくないから)。

4.6	リモート管理の設定

リモートで管理を許される人のリスト

	$ADMIN_MEMBER_LIST	= "$DIR/members-admin";

このリモート管理サーバのコマンドのヘルプ

	$ADMIN_HELP_FILE	= "$DIR/help-admin";

もしリモートの管理者にパスワードを要求するなら、

	$REMOTE_ADMINISTRATION_AUTH_TYPE = "crypt";
or
	$REMOTE_ADMINISTRATION_AUTH_TYPE = "md5"; (perl 5 only)

このチェックに使うパスワードファイルが

	$PASSWD_FILE = "$DIR/etc/passwd";

です。

注意: config.ph CFVersion 3 では 
	$REMOTE_ADMINISTRATION_REQUIRE_PASSWORD
	$REMOTE_AUTH 
は obsolete です($REMOTE_AUTHは昔の変数名です)。

4.7	リモートで管理する人を増やす時(PGP以外)

PGPの場合については Chapter ../encryption 4.0 を参照。
fukachan@sapporo.iij.ad.jp を管理者に加える際、次のようなコマンドを送
りこみます。

* パスワード認証をしていない時は

   admin addadmin fukachan@sapporo.iij.ad.jp

* パスワード認証(crypt or md5)もしている時は

   admin addadmin fukachan@sapporo.iij.ad.jp
   admin initpass fukachan@sapporo.iij.ad.jp password

コマンドで初期化するより、より良いのは makefml を使うことです。
# ISP にコネクトする場合はSSHなんて使わせてくれない気がするが…

	% makefml passwd ML fukachan@sapporo.iij.ad.jp
4.11

その場合途中の経路上が暗号化されているとより望ましいです。例えば 
Secure Shell を使えば実現できます。SSL(Secure Socket Layer)化 telnet 
等もあります。

通信路が暗号化されていないなら、そのマシンがリモートにある場合さらに良
い方法は、あらかじめそのパスワードを crypt した文字列を(ローカルマシ
ン上で)用意して、そのマシンへ入って $DIR/etc/passwd (ML の HOME の下
の etc/passwd) を手で編集するなら少しましです。

暗号化に関しては初期化プロセスだけ暗号化されていても、メールで admin 
コマンドを送る場合SMTP 上で動いてるのでパスワード隠蔽に関しては、どの
みちあまり意味はありませんが…

4.8	リモートで管理する人を削除する時

コマンドは

	admin byeadmin fukachan@sapporo.iij.ad.jp

です。

4.9	アドミンのコマンド一覧 (help-admin より)

   admin pass パスワード
   admin password パスワード
   admin passwd 新しいパスワード
   admin initpass アドレス パスワード
   admin help
   admin log
   admin add address
   admin off address
   admin on address
   admin bye address
   admin chaddr old-addr new-addr
   admin change old-addr new-addr
   admin change-address old-addr new-addr
   admin matome address 引数 
   admin skip address
   admin addadmin address
   admin addpriv  address
   admin byeadmin address
   admin byepriv  address
   admin dir
   admin ls options
   admin remove filename
   admin get filename
   admin resend filename address
   admin put filename
   admin rename filename1 filename2
   admin newinfo
   admin newguide
   admin unlink-article ID
   admin remove-article ID
   admin pgp options

4.10	リモート管理で使えるコマンドを増やすor減らす
../command 4.1

普通のコマンドを増やす要領で同じようにやれば良いです。
config.ph でコントロールできます。
いくつかの変数がありますが、次のように作動します
../command 4.1

   1	@PermitAdminProcedure が定義してあるなら
	@PermitAdminProcedure で許しているコマンドだけを設定します。
	もし、定義されていなければデフォールトのすべてのコマンドが
	利用可能になります。
	これらの設定はグローバル変数の %AdminProcedure に定義されます。

   2	%LocalAdminProcedure が定義されているなら
	1 で定義された %AdminProcedure を %LocalAdminProcedure で上書き
	します。

   3	@DenyAdminProcedure が定義されているなら
	@DenyAdminProcedure のコマンドだけを使えなくする

   4	$ADMIN_COMMAND_HOOK を評価する。

例:
	○ 管理者用の helpとaddadminのみを使用可能、それ以外はすべて使用不可

	@PermitAdminProcedure = ('admin:help', 'admin:addadmin');

	○デフォールトに加え自分で定義した hack コマンドも使える
	もちろんこの場合はどこかで sub ProcAdminHack { ...; } があって
	この関数を用意しておく必要がある。

	%LocalAdminProcedure = ('admin:hack', 'ProcAdminHack');

	○デフォールトの中で addadmin は使えなくする

	@DenyAdminProcedure = ('admin:addadmin');

4.11	パスワードファイルの初期化と設定
../utility_programs 6.17
../makefml 1.0

	makefml passwd ML名 options

fukachan@phys.titech.ac.jp のパスワードを初期化する。初期化はMLサー
バを edit できる人にしかできません。

4.12	リモートでパスワードの変更

コマンドで

	admin pass	パスワード
	admin passwd	新しいパスワード

をサーバへ送り込むことで変更 (etc/passwdの設定変更) をすることができま
す。approve コマンドなら

	approve パスワード passwd 新しいパスワード

ですね。

4.13	'admin add' した時に「いらっしゃいませ」メールを送る

	$ADMIN_ADD_SEND_WELCOME_FILE = 1; (default 0)

#これだけは特殊なので、オプションを一つ作りました。

4.14	登録するアドレスの範囲を制限する
../how_to_subscribe 4.3

この変数は自動登録でもリモートコマンドによる登録でも制限できます。
しかし makefml では無効です。

デフォールトでは $REJECT_ADDR にあてはまらないならどんなアドレスでも登
録します。特定のドメインのみを登録対象にしたいなら 
$REGISTRATION_ACCEPT_ADDR に正規表現を書いて下さい。

Example 1;
	$REGISTRATION_ACCEPT_ADDR = 'domain.co.jp';

Example 2;
	$REGISTRATION_ACCEPT_ADDR = 'domain1.co.jp|domain2.co.jp';

$AUTO_REGISTRATION_ACCEPT_ADDR は自動登録ルーチンにだけ作用する変数で
す。使用可能ですが obsolete です。

4.15	リモート管理モードでのアドレスの複数マッチ問題について 

通常のリモートコマンドの場合、 OFF コマンド等での multiple-matching 
を認めません。例えば一般に

	fukachan@aoi.chan.panic
	fukachan@uja.aoi.chan.panic

のアドレスは間違えてホスト名までついているのかそれとも別のドメインの別
人なのか区別できません。両方ともマッチしてしまう時は『チェックをきびし
くしてひとつのアドレスだけを選ぶ』のがデフォールトのFMLの挙動です。リ
モート管理のコマンドの時だけは multiple です。つまり、上の両方のアドレ
スを一気に消して、新しく add したりできるわけです。

4.16	リモートで入れ替えが可能なファイルについて、

具体的には remove unlink put rename コマンドの場合に、任意のファイルが
操作できるのはまずいです。本来これらのコマンドはリモートで guide ファ
イルを入れ換える等の目的のためにあります。現在では

@REMOTE_RECONFIGURABLE_FILES という配列で定義されたファイルにのみこれ
らのコマンドは作用します。デフォールトは、次の変数で設定されているもの
を操作可能にしてあります。

	$INDEX_FILE		$WHOIS_DB
	$ADMIN_MEMBER_LIST	$ADMIN_HELP_FILE
	$PASSWD_FILE		$LOG_MESSAGE_ID
	$MEMBER_LIST		$ACTIVE_LIST
	$OBJECTIVE_FILE		$GUIDE_FILE
	$HELP_FILE		$DENY_FILE
	$WELCOME_FILE		$CONFIRMATION_FILE
	$LOGFILE		$MGET_LOGFILE
	$SMTPLOG		$SUMMARY_FILE
	$SEQUENCE_FILE		$MSEND_RC
	$LOCK_FILE

	$FILE_TO_REGIST
	$FTP_HELP_FILE		$WHOIS_HELP_FILE

	@ACTIVE_LIST		@MEMBER_LIST

増やす場合は config.ph で

	push(@REMOTE_RECONFIGURABLE_FILES, "$DIR/file-to-add");

のように配列の中身を追加してください。ちなみにこの場合 put 等の引数の
ファイル名は$DIR からの相対パスを全部書いてもらう必要があります。
ファイル名だけでは複数の置く可能性のある directory の中から自動的には
決められないからですね。


4.17	ログファイルについて

ログファイル ってML本体と管理者コマンドって同じファイルを使ってます。
分けられません:)

4.18	リモート管理の古い設定への注意

古い設定のままでは動きません(libfml.pl 1.5.2より前)。ごめんなさい

昔、リモート管理はフックをしかけることで実装していました。 
いまでは、$REMOTE_ADMINISTRATION で ON, OFF できるようになっています。


[PREVIOUS CHAPTER] [NEXT CHAPTER]