[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.ドメイン名';

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

    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になるのは、

    １	chown がちゃんとできないとき
    ２	world writable であるとき

    です。で、１のほうは 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]