[PREVIOUS CHAPTER] [NEXT CHAPTER]
4 メールサーバの問題

4.1	エラーメールの例

エラーメールが返ってきたら,こんな風になっていると思います。
この
   ----- The following addresses had permanent fatal errors -----
や
   ----- Transcript of session follows -----
のあたりをみて、

	Quota exceeded

のようなキーワードを探して下さい。


◯ sendmail が返すエラーメールの例
エラーメールのヘッダ

   ----- The following addresses had permanent fatal errors -----
<rudo@nui.fml.org

   ----- Transcript of session follows -----
procmail: Quota exceeded while writing "/var/spool/mail/rudo"
550 <rudo@nui.fml.org>... Can't create output

	この後に DSN

	送った本文などが続く…


4.2	典型的なエラーメール

エラーメールの最初の方に以下のようなキーワードがありますか?

	エラー		原因
	--------------------------------------------------------
	unsafe	 	ファイルやdirectoryのpermissionがおかしい
			どこかが group writable になっていませんか?
			/ から全階層に渡ってチェック

			とあるOSで / が drwxrwxrwx というのがありました
			(なんて駄目過ぎる OS …)

	loop		/etc/aliases の設定がおかしい 
			newaliases を実行しましたか?

	user unknown	そんなユーザはいない
			/etc/aliases に設定はありますか?
			newaliases を実行しましたか?

	sh: fml.pl not available
			smrsh を使ってたりしますか?
			(最近のRedhatでこのsmrshからみのトラブルが多いです)
			sendmail.cfをどうやって作ったかを確認してください

	Quota exceeded	ディスク(の割り当て)が一杯でメールスプールに書けない
			相手の問題			

	Can't create output	書けないといっている。
			結果はどうでもよくて、問題は理由。
			その前後に理由が書いてないですか?


4.3	Can't locate getopts.pl in @INC at makefml line 104.	

perlが正しくインストールされていません。perlをインストールしなおして
ください。


4.4	:include: がうまく動かない場合 (/etc/aliases)

可能性として

○ メールサーバが include 形式をそもそもサポートしていない
	そんなことはなく、設定がおかしい
	NT なんかだと普通かも(?)


○ include ファイルの場所がセキュリティ的に問題があるためエラー
   例えば 
	・ NFS ごし
	・ include ファイルのある場所までのどこかの permission が危ない
	   例えば /usr, /usr/local, /usr/local/fml のように順次下って
	   group writable か否かを調べる。chmod 755 をしまくる

などが考えられます。include ファイルの置き場所は可能な限り permission 
を落したローカル(NFSではない)場所(そこまでの階層すべての permission に
配慮する)に include ファイルを置いてみて下さい。例えば /usr/local が 
local disk の上にあるとして /usr/local/include/ の下に置いておくなどです。
#注意: そもそも NFS ごしに setuid しようというのが間違い

C wrapper の詳細: ../MTA 4.1


4.5	553 machine-name host name configuration error

あるOS(たしかOEMのSUNかなにかだったとおもう)の附属の sendmail でおきま
す。sendmail R8 では相当するコードが存在しないので…なにがおこっている
のかわかりません;-)

config.ph の $HOST を

	$HOST =  'localhost.ドメイン名';

とかにするとOKになることもあります(よくわからない)。


4.6	Executable files not allowed 

aliase database /etc/aliases rebuilt by root
cannot open /var/spool/ml/etc/aliases 
Executable files not allowed 

executable bit を落してください。/ から全階層をたどって検査して下さい。
% chmod a-x /var/spool/ml/etc/aliases


4.7	Insecure dependency in chdir, Permission denied, ... 
../MTA 4.1
../MTA 5.1
../internals 2.4

/ から全階層をたどって permission を検査して下さい。
/var/spool/ml/elena に仮想ユーザ fml 以外が書く権限は必要はありません。


4.8	sh: fml.pl not available for sendmail programs

最近では Red Hat Linux ではまる人が多いのが
sendmail の smrsh ではまるケースのようです(?)。
例えばこのようなエラーメールが返ってきます

      ----- The following addresses had permanent fatal errors -----
   "|/usr/local/fml/fml.pl /var/spool/ml/elena "
       (expanded from: :include:/var/spool/ml/elena/include)

      ----- Transcript of session follows -----
   sh: fml.pl not available for sendmail programs
   554 "|/usr/local/fml/fml.pl /var/spool/ml/elena "... Service unavailable

これは fml じゃなくて sendmail のエラーです。この段階では fml は実行さ
れてもいません。よって fml のログも残りません。

1. /usr/local/bin/perlなどが存在しない。
   fml.pl の先頭の #!/usr/local/bin/perl の部分のこのPATHが間違い

   A.  直して下さい
   A2. インストール時に自動的に修正しているはずなので
       インストーラがうまく働いてないかもしれません

2. sendmail restricted shell のせい

	最近の linux の distribution のなかにはそれがデフォールトのも
	のがあったとおもいます。で、Redhat がまさにそれだったようなきが
	します

sendmail.cf に

Mprog,                P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/,
のような行が P=/bin/smrsh になっていればこれです。

A. 回避策 1

	(securityを緩める方向のうしろむきな解決ですが) そこを/bin/sh 
	にするととりあえず動くようになるとおもいます。もしこれが正解だっ
	たら、Sendmail Restricted Shell というものについて調べて下さい。
	そして smrsh について正しい設定をしなおしてみてください。

A2. 回避策 2: link をはりまくる

   fml-support:  07458

smrshを使っていると @LIBDIR に/usr/local/fmlが入らない。
このために 

	require default_config.ph 

の場所などでエラーになる。

回避例(『fml バイブル』 5.2.3 節より):

/var/spool/ml/etc/fml/site_init.ph というファイルに
push(@INC,   "/usr/local/fml");
push(@LIBDIR,"/usr/local/fml/module");
push(@LIBDIR,"/usr/local/fml/module/CPAN");
push(@LIBDIR,"/usr/local/fml/module/Japanese");
push(@LIBDIR,"/usr/local/fml/module/fml-devel");
1;
と書いて下さい。そして以下の symbolik link をはって下さい。

smrsh のディレクトリが /usr/adm/sm.bin とすると
# ln -s /usr/local/fml/fml.pl /usr/adm/sm.bin
# ln -s /usr/local/fml/libloadconfig.pl /usr/adm/sm.bin/
# ln -s /usr/local/fml/default_config.ph /usr/adm/sm.bin/
# ln -s /usr/local/fml/site_init.ph /usr/adm/sm.bin/

注意: fml-current 3.0B 以降は /usr/local/fml/libloadconfig.pl および 
default_config.ph の link が必要です。それ以前の current,
fml-3.0-stable などでは必要ありません。

補足: Red Hat Linux 7.x ではディレクトリは
      /usr/adm/sm.bin ではなく /etc/smrsh になるそうです。
      (thanks Koichi Honda)

References: fml-support ML:

	01877,01879,01881
	03942,03944,03965
	05706,05708,05712,05715,05721,05722,05723,05724,05725,05726,05727,05728
	07458,07733


4.9	:include:何か is unsafe for mailing to program ...

Posted:  Fri, 21 Jul 1995 03:10:25 JST
fml-support: 00476

チェック: includeするファイルおよびそこまでのパスのどこかで危ないこと
がないか?

OS依存性: fpathconf はPOSIXなのでPOSIX準拠OSには普通あるでしょう。そう
いうOSでは fpathconf() を使ってる可能性大です。ソースの間違いの場合と 
fpathconf() の判定が変な場合も有り得るでしょう。

NECのEWS はよくわかりません。
# fml-support X-Mail-Count: 02120。EWSのオンラインリリースメモの注意
# 制限事項の中にこの関係の話が書いてあるそうです。

HP では fchown() ではんていしてるらしいです。あと、HP では setuid() じゃ
なくて まだ setreuid() を使ってるとおもうので、default の fml.c ではう
まくいかないでしょう。
setuid -> setreuid にしてでいいのかな…
% man setreuid ででてくる設定は多分setuid
なんかとおなじだとおもいますが…

対策: include ファイル $HOME/ml/elena/include などをローカルDISKの上の 
/usr/local/ml/include-file などへ移し、/etc/aliases を設定し直す。そし
て permission をきびしくする。C wrapper でも同様。特にいまのMTAは/から
途中すべての directory についてチェックしているので group writable に
なっているからか?などについて全部のdirectoryについてチェックします。

裏技: sendmail の chownsafe() が常に真を返すように改造(ひどい;-)

理由(sendmailの場合): QUNSAFEADDR フラッグがONになるのは、

1	chown がちゃんとできないとき
2	world writable であるとき

です。で、1のほうは fpathconf() とか  fchown() だとすれば

sendmail -> 
forkした sendmail -> includeを評価	→ /bin/shをfork()→exec fml.pl
			このとき
			fpathconf()が安全性をチェックする

の時に fpathconf() が bugってるか、それともpath

	path = /home/local/lib/ML/fml/run_HOGEHOGE

のどこかにファイルの所有者以外への write permission が与えられていると
か NFSごし などの時です。


4.10	include's owner != config.ph's owner.

in fml-support: 02475, 02469, 02472 あたり

makefml newml をだれの権限で行なったかを確認する。
一般ユーザで makefml newml をして ML を作ってみる。


4.11	/var/spool/ml/src/fml.pl: permission denied

実行 permission がない。ls -l fml.pl とやって

	rwxr-xr-x 

のように permission が表示されるかどうかを確認する。
# chmod(1) chmod(2) chown(8)

perl の実行 permission がない場合もありうるかも


4.12	550 User %s@%s doesn't have a valid shell for mailing to programs

FMLプロセスの所有者のシェルが /etc/shells にないためです。
使っているシェルを /etc/shells に登録して下さい。

* /usr/src/usr.sbin/sendmail/src/

	else if (bitset(QBOGUSSHELL, a->q_alias->q_flags)) {
	  a->q_flags |= QBADADDR;
	  a->q_status = "5.7.1";
	  if (a->q_alias->q_ruser == NULL)
	    usrerr("550 UID %d is an unknown user: cannot mail to programs",
		   a->q_alias->q_uid);
	  else
	    usrerr("550 User %s@%s doesn't have a valid shell for mailing to programs",
		   a->q_alias->q_ruser, MyHostName);
	}
	else if (bitset(QUNSAFEADDR, a->q_alias->q_flags))

とか

  if (!usershellok(pw->pw_name, pw->pw_shell)) {
    a->q_flags |= QBOGUSSHELL;
  }

とか…


4.13	sh: /var/spool/ml/src/fml.pl: No such file or directory

/var/spool/ml/src/fml.pl の場所にファイルがない。perl がない場合にもで
るかもしれない。


4.14	sh: /var/spool/ml/src/fml.pl: command not found

/var/spool/ml/src/fml.pl は perl が実行しますが
先頭の #!/usr/local/bin/perl の場所に perl がない時にでます。

「コマンドがない」という理由は fml.pl を perl fml.pl に展開してから実
行するので、perl がないというつもりで「コマンドがない」というエラーメッ
セージになります。
# make 時に configure が自動的に補正することにはなっているはずですが
# それがうまくいってないOSの場合にありうるかもしれません

[PREVIOUS CHAPTER] [NEXT CHAPTER]