sendmail 8.12とMILTER (FreeBSD PRESS No.8)

梅本肇 / ume@mahoroba.org

 先号では速報という形でお知らせさせて頂きましたが、 sendmail 8.12がリリースされています。8.12.0のリリー ス直後に、その売りであるセキュリティ回りの改善部分 においてセキュリティホールが見つかり少しハラハラさ せられましたが、すぐに修正された8.12.1がリリースさ れています。先号でのお約束通り、8.12について紹介し たいと思います。
 加えて、アンチウィルスプログラムである AMaViS-perlを例に、8.12で正式機能になったMILTERに ついて説明します。

1. setuid rootの廃止

 8.12の特長は、セキュリティ回りの見直しです。セキュ リティを考えたとき、rootにsetuidされたバイナリは嫌 なものです。いよいよsendmailはrootにsetuidされなく なりました。
 sendmailは、メールの転送をおこなうMTA*1)としての 機能と、ローカルからメールの送信をおこなうMSP*2) としての機能を合わせ持ったプログラムです。MTAとし ては動作するにはroot権限が必要ですが、MSPとして動 作する場合は必ずしもroot権限は必要ありません。
 そもそもMTAとして動作するsendmailはroot権限で起 動しますので、MSPが必要とする権限で動作するように すれば、rootにsetuidする必要がなくなります。 8.12では、MTAの機能とMSPの機能を分離しました。そ して、MSPの機能のために、sendmailが使用するグルー プにsetgidされるようになりました。

2. 8.12のインストールと設定

 sendmailをインストールする前に、sendmail用のユー ザとグループを作っておく必要があります。これらのデ フォルトはsmmspですので、インストール前にsmmspとい うユーザとグループを作っておきます。また、sendmail をインストールすると、/var/spool/clientmqueue*3) が作られ、/etc/mail/submit.cfがインストールされま す。portsでインストールする場合、これらは自動的に おこなわれます。
 なお、11月18日に5.0-CURRENTに、smmspと後述する mailnullが登録されました(図1)。本稿が読まれる頃に はsendmailが8.12.1に上がっているかもしれません。こ れらのユーザを登録する際は合わせておくと、混乱が少 なく良いでしょう。
図1 5.0-CURRENTのsmmspとmailnullのエントリ
/etc/master.passwd:

    smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
    mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin

/etc/group:

    smmsp:*:25:
    mailnull:*:26:
 この新しい型式では、メールを受信するデーモンが使 用するsendmail.cfと、ローカルからのメール送信時に 使用するsubmit.cfの2つの設定ファイルを使用します (図2)。
図2 8.12の動作
8.12の動作
 sendmail.cfには従来のものでも基本的にそのまま使 用できます。ただし、フォーマットがV10/Berkeleyに上 がっていますので、8.12.1付属のcfを使って sendmail.cfを生成し直したほうが良いでしょう。
 FreeBSD添付のfreebsd.mcは基本的に8.12でも使える ことを確認しています。しかし、access_dbの設定の一 部に変更があり、.cfの生成に失敗します。図3は、 /usr/share/sendmail/cf以下を8.12.1添付のものに入れ 換え、/etc/mailでmakeしたところです。
図3 8.12のcfではfreebsd.mcからの生成に失敗する
ume@cheer:133# make
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/   /usr/share/sendmail/cf/m4/cf.m4 /etc/mail/cheer.mahoroba.org.mc > /etc/mail/cheer.mahoroba.org.cf
*** WARNING: missing -T<TMPF> in argument of FEATURE(`access_db', hash -o /etc/mail/access)
 このエラーメッセージに従って、access_dbの設定を リスト1のように修正することで、無事.cfを生成できる ようになります。
リスト1 freebsd.mcの修正
FEATURE(access_db, `hash -T<TMPF> -o /etc/mail/access')
 また、
define(`confDONT_BLAME_SENDMAIL',`GroupReadableSASLFile')
を指定している場合、
define(`confDONT_BLAME_SENDMAIL',`GroupReadableSASLDBFile')
に変更する必要があります。SMTP AUTHを使用している 場合は注意して下さい。

 sendmailインストール時にsubmit.cfが/etc/mailにイ ンストールされます。submit.cfを変更したい場合は、 cf/cf/submit.mcをベースにすることになります。リス ト2はsubmit.mcからコメント部分を除いたものです。実 質的にFEATURE(`msp')が指定されているだけです。

リスト2 submit.mc (抜粋)
VERSIONID(`$Id: submit.mc,v 8.5 2001/09/08 01:20:53 gshapiro Exp $')
define(`confCF_VERSION', `Submit')dnl
define(`__OSTYPE__',`')dnl dirty hack to keep proto.m4 from complaining
define(`_USE_DECNET_SYNTAX_', `1')dnl support DECnet
FEATURE(`msp')dnl
 sendmailは動作モードによって2つの.cfを使い分けま す。sendmailが-bm (デフォルト)、-bsまたは-tオプショ ン付で起動された場合、submit.cfを使用し、それ以外 の場合はsendmail.cfを使用します。
 この挙動は、-Acまたは-Amオプションを指定すること で変更できます。強制的にsendmail.cfを使用したい場 合は-Amを、submit.cfを使用したい場合いは-Acを指定 します。
 sendmailをinetdから起動するようにしている場合に は注意が必要です。この場合、sendmailはsendmail.cf ではなくsubmit.cfの方を使用してしまいますので、ルー プしてしまいます。inetdから起動する場合、-bsに加え て-Amを指定する必要があります。

 また、MTAとMSAで別々のキューを使用することに留意 下さい。従来、sendmailをデーモンとして起動する際に -q30mのように指定しておくと、定期的に /var/spool/mqueueに溜ったメールを吐き出してくれま した。8.12では、これに加えて、別途 /var/spool/clientmqueueの方も定期的に吐き出すよう にしておく必要があります。この方法として、cronで定 期的に

/usr/sbin/sendmail -Ac -q
を実行するようにするか、boot時に
/usr/sbin/sendmail -Ac -q30m
で吐き出し専用のデーモンとして起動するようにするか の2通りがあります。

 なお、従来通りの動きとなるようにインストールする こともできます。rootにsetuidする形でインストールす るには、

sh ./Build install-set-user-id
と、引数にinstallの代わりにinstall-set-user-idと指 定してBuildを実行します。
 ただし、この場合も、8.12のその他の新しい機能を使 用したい場合はsendmail.cfの作り直しが必要です。

 詳細はsendmail/SECURITYを参照下さい。

3. submit.cfへのローカルな変更

 submit.cfには変更を加える必要はあまりないでしょ う。むしろ、絶対必要とわかっているわけではなければ、 optionやfeatureをsubmit.mcに加えてはいけません。 .mcに指定できるもの中にはMSPで動作させることを意図 していないものもあります。
 もし修正を加えたいとすれば、ローカルからのメール 送信時のFrom:の設定でしょうか。リスト3の例では、 rootからのメールを除き、ドメイン名が付くよう設定し ています。
 なお、submit.cfで設定した場合でも、User unknown などでエラーメールを返す場合のFrom:にはsendmail.cf での設定を使用しますので、sendmail.cf側でも同様の 設定が必要です。
リスト3 ローカルからの送信時のFrom:の設定例
FEATURE(`allmasquerade')
FEATURE(`always_add_domain')
FEATURE(`limited_masquerade')
FEATURE(`masquerade_envelope')
EXPOSED_USER(`root')
MASQUERADE_AS(`$m')
 また、MLを運用しているなどの場合、 confTRUSTED_USERSを設定していることと思います。ML ドライバなどからsendmailを起動した場合は、sendmail はMSPとして動作することになります。そのため confTRUSTED_USERSはsubmit.mc側で設定する必要があり ます。

4. MSAとMSP

 MSPはRFC2476に規定されています。SMTPは元々メール を転送するためのプロトコルとして設計されました。例 えば、一部のヘッダを除いて、メッセージテキストを変 更することを想定していません。
 しかし、現在ではSMTPはMUA*4)からのメールの送信 用に広く使われています。
 MUAからのメールの送信を受け付けるプロセスをMSA*5) と呼びます。
 最近のsendmailはメール転送とメール送信を区別して 扱うことができるようになっています。

 sendmailがMSPとして動作する際にはsubmit.cfが使用 されます。
 MSA用に587番ポートが予約されています。しかし、従 来通り25番ポートをMTAと兼用することも想定されてい ます。最近のsendmailはデフォルトでは587番ポートを MSA用にbindしています。しかし、現状のsubmit.mcでは 25番ポートを使用するようになっています。つまり、 587番ポートをbindしていても実際には使用していませ んので、現状では嬉しくないかもしれません。587番ポー トを閉じるには、sendmail.mcで

FEATURE(`no_default_msa')
を指定します。
 もちろん、MSPが587番ポートを使用するようにも設定 できます。その場合は、submit.mcでFEATURE(`msp')が 指定されている部分を、
FEATURE(`msp', `', `MSA')
に書き換えます。

 また、自ホストはメールを受信せず、専ら日々のcron ジョブの結果を送信するだけのホストも多いと思います。 従来は、そのようなホストではsendmailをデーモンとし て起動しておく必要はありませんでした。しかし、8.12 ではローカルから送信されたメールを受け取るために、 sendmailをデーモンとして起動しておく必要があります。 しかし、あまり起動しておきたくはないかもしれません。 デフォルトではMSPはメールをlocalhost宛に送信する ようになっています。submit.mcでのFEATURE(`msp')の 指定で

FEATURE(`msp', `メールサーバ名')
あるいは
FEATURE(`msp', `メールサーバ名', `MSA')
と明示的にメールサーバ名を記述することで、直接目的 のメールサーバに送信できるようにできます。

 なお、デフォルトではMSA用にはIPv4でしかbindして いません。もちろん、MSAもMTAと同様にIPv6でも使用す ることができます。IPv4とIPv6の両方でbindしたい場合 は

DAEMON_OPTIONS(`Port=587, Name=MSA-v6, M=E, Family=inet6')
をsendmail.mcに追加します。

5. Srv_Features

 8.12では、Srv_Featuresという機能が追加されており、 アクセスマップに記述された特定のホストあるいはネッ トワークから接続された場合に、EHLOに対して、 Srv_Features で指定された機能を返さなくできます。 ここで、Srv_Featuresに指定できる機能は表1の通りで す。
表1 Srv_Featuresで指定できる機能
オプション機能
S, sSTARTTLS
V, vTLSハンドシェイク時のクライアントの証明書の要求
A, aSMTP AUTH
P, pPIPELINING
 ここで、大文字で指定するとその機能を無効にし、小 文字で指定するとその機能を有効にします。
 これにより、SMTP AUTHが使いやすくなりました。8.11 では、一旦SMTP AUTHを有効にすると、EHLOに対して必 ず250-AUTHを返しました。250-AUTH PLAINが返ってくる とNetscapeは必ずSMTP AUTHを使用しようとしますので、 パスワードが設定されていないとメールが出せなくなると いう問題がありました*6)
 アクセスマップで250-AUTHを返したくないホストある いはネットワークにAを指定しておくと、上述の問題を 回避できます。例えば、リスト4の例では、example.com ドメイン、IPv6アドレスが3ffe:505:2::/48、および、 IPv4アドレスが202.227.26/24からの接続に対しては 250-AUTHを返さなくなります。
リスト4 /etc/mail/accessの設定例
Srv_Features:example.com	A
Srv_Features:IPv6:3ffe:505:2	A
Srv_Features:202.227.26.32	A
 サイト内など初めからリレーを許可しているホストや ネットワークについては、250-AUTHを返さないように設 定しておくと良いでしょう。
 リスト4でIPv6アドレスを指定する際に、IPv6:を付け ている点に留意下さい。8.12以降ではIPv6アドレスを指 定する際には、アドレスの前にIPv6:を付けることにな りました。
 なお、同一ホストに対して複数のオプションを指定し たい場合には、空白区切りで指定します。リスト5の例 では、example.comに対してSMTP AUTHとSTARTTLSを返さ ないようにしています。
リスト5 複数のオプションを指定する例
Srv_Features:example.com	A S
 リスト6の例ではexample.com内に対してのみ、TLSハンドシェイ ク時にクライアントの証明書を要求しています。この設 定では、example.com以外からの接続ではverify=NOTと なります。example.comからの場合は、クライアントの 証明書を提示しない、あるいは提示された証明書が認証 できなかった場合は、それぞれ、verify=NO、 verify=FAILとなります(表2)。これにより、自ドメイン 内からメールを送信する場合には証明書が必要といった 設定ができるでしょう。
リスト6 特定ドメイン内のみにクライアントの証明書を要求する例
Srv_Features:example.com	v
Srv_Features:			V
表2 認証結果
送信元証明書の提示認証verify=
example.com内×NO
×FAIL
OK
example.com外NOT
 また、Srv_Featuresではありませんが、sendmailがク ライアントとして動作している場合に、
Try_TLS: ホスト名 NO
と設定することで、指定したホストに接続した際に 250-STARTTLSを返してきても、STARTTLSを使用しないよ うにできます。STARTTLSの挙動がおかしいサーバへの対 処として有効でしょう。

6. AuthInfo

 sendmailがクライアントとして動作する場合にSMTP AUTHを使いたい時には、MUAをSMTP AUTHのクライアント として使う場合と同様、サーバにどのように認証しても らうかという情報が必要になります。
 これらの情報は従来はconfDEF_AUTH_INFOで指定され るファイルに記述していましたが、8.12では、アクセス マップに左辺が「AuthInfo:ホスト名」のエントリを書 くことでも指定するように変更になりました。これは、 従来の方法ではMSPでうまく機能しないためです。表3は AuthInfo:の右辺で指定できるタグの一覧です。
表3 AuthInfo:の右辺で指定できるタグ
タグ
UユーザID
I証明書ID
Pパスワード
Rレルム
M認証メカニズム一覧 (空白区切り)
 例えば、図4のような感じで指定します。
図4
AuthInfo:example.net	"U:user" "I:user" "P:secret" "R:example.net" "M:DIGEST-MD5"
 これは、アクセスマップに記述することもできますが、 パスワードなどの情報が含まれるため、別マップに分離 できるように考慮されています。FEATURE(`authinfo') を指定して、そちらを使用する方が良いでしょう。 FEATURE(`authinfo')を指定した際のデフォルトは、 /etc/mail/authinfoとなります。なお、 /etc/mail/authinfoのパーミッションには注意して下さ い。rootのみがアクセスできるようにしておきます。

 もしMSAとMTAの間のやりとりでもSMTP AUTHを有効に したい場合は、submit.mcにFEATURE(`authinfo')を加え ます、この際にMTA側と区別するため、明示的にファイ ル名を指定し、異なったものにしておきます(図5)。そ して、/etc/mail/msp-authinfoに図6のようなエントリ を記述しておきます。マップですので、

makemap hash msp-authinfo < msp-authinfo
を実行してDBに反映するのをお忘れなく。また、 /etc/mail/msp-authinfoと/etc/mail/msp-authinfo.db はパスワードが含まれているため、所有者とグループ以 外がアクセスできないようにしておきます。sendmailは グループsmmspで参照しますので、グループsmmspが参照 できるようにしておきます(図7)。
図5
FEATURE(`authinfo', `hash -o /etc/mail/msp-authinfo')
図6
AuthInfo:localhost	"U:smmsp" "P:secret" "M:DIGEST-MD5"
図7 msp-authinfoのパーミッション
ume@piano:190# ls -l msp-authinfo*
-rw-r-----  1 root  smmsp     57 Nov  7 04:34 msp-authinfo
-rw-r-----  1 root  smmsp  32768 Nov  7 04:36 msp-authinfo.db
 ここで、グループがアクセスできてもsendmailが文句 を言わないように、submit.mcには、
define(`confDONT_BLAME_SENDMAIL', `GroupReadableKeyFile')
も合わせて指定しておきます(リスト7)。
リスト7 submit.mcでのmsp-authinfoの設定例
define(`confDONT_BLAME_SENDMAIL', `GroupReadableKeyFile')
FEATURE(`authinfo', `hash -o /etc/mail/msp-authinfo')

7. DefaultUser

 sendmailはrootの権限が必要ない場合、できる限り実 行権限を落そうとします。従来、この際に使用するユー ザをDefaultUserで指定できるようになっており、ユー ザID 1、グループID 1がデフォルトになっていました。 BSDではこのIDはdaemonを指しています。つまり、root 権限が必要ない場合はdaemonで動作していることになり ます。しかし、LinuxなどではユーザID 1はbinとなって おり、セキュリティ上問題になる可能性がありました。
 そこで、DefaultUserが指定されていない場合、 mailnull、sendmail、daemonの順でユーザが登録されて いるかを検索し、そのうち0でないユーザIDを持つ最初 に見つかったユーザの権限を使用するようになりました。 もしどのユーザも見つからなかった場合は、従来通りユー ザID 1、グループID 1を使用します。
 FreeBSDでは元からdaemonが登録されていますので、 今まで通りdaemon権限、つまり、ユーザID 1、グループ ID 1で動作することになります。
 しかし、できるだけ他のサービスとユーザIDやグルー プIDを共有するのは避ける方が賢明です。mailnullを登 録して運用する方が好ましいでしょう。

8. インタフェースのプローブ

 この機能は8.12に新たに加わったというわけではあり ませんが、たまに聞かれることがありますので、少し触 れてみたいと思います。
 sendmailはデフォルトでは起動時にネットワークイン タフェースを調べてそのアドレスとホスト名をクラス {w}に追加します。クラス{w}は自ホストとして受け取り たいホスト名の一覧を保持しているクラスです。 これにより、メールを受け取るべきホスト名を自動的に 認識することができます。
 しかし、インタフェースが非常に多いホストやDNSの 逆引きができないアドレスが付いているような場合には、 sendmailの起動に非常に時間がかかる場合があります。
define(`confDONT_PROBE_INTERFACES', `True')
を指定すると、インタフェースのプローブをおこなわな くなり、この問題を回避することができます。
 ただし、クラス{w}に値が設定されませんので、例え ば/etc/mail/local-host-namesに書いておくなどして、適切 な値を設定しておく必要があります。

9. MILTERとウィルススキャン

9.1. MILTERとは

 MILTERは実際には8.10.Xから入っていますが、8.12 から正式機能扱いになりましたので、ちょっと紹介した いと思います。
 MILTERは、sendmailが処理中のメールメッセージをサー ドパーティのプログラムからアクセスできるように設計 されたメールフィルタAPIです。これを使用することで、 メールをフィルタリングする機能をアドインできます。

9.2. AMaViS-perlのコンフィギュレーション

 ここでは、メールフィルタの例として、メール用ウィ ルススキャナとして有名なAMaViS-perl*7)を取り上げ ます。
 AMaViS-perl10以前はsendmailのローカルメーラとし て動作するようになっており、AMaViS-perlはウィルス のチェックをおこなった後、新たにsendmailを起動し、 チェック済のメールを送信するようになっていました (図8)。
 このやり方では、受信用と送信用で2つのsendmail.cf を使い分ける必要があり、設定や保守が少し面倒でした。 また、ログが非常に煩雑になっていました。
図8 MILTERを使わない場合
MILTERを使わない場合
 AMaViS-perl11では、以前からのコンフィギュレーショ ンに加え、MILTER対応のコンフィグレーションが追加さ れました(図9)。
図9 MILTERを使う場合
MILTERを使う場合

9.3. sendmailのMILTER機能の有効化

 正式機能になったと言っても、デフォルトで有効になっ ているわけではありません。8.11.X以前ではsendmailを -D_FFR_MILTER=1*8)付で作成する必要がありましたが、 8.12.Xでは-DMILTER付で作成します(リスト8)。
リスト8 devtools/Site/site.config.m4
APPENDDEF(`conf_libmilter_ENVDEF', `-DMILTER')
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
 FreeBSDのports-currentのsendmailは既に8.12.1になっ ていますので、今回はportsからインストールすること にします。SENDMAIL_WITH_MILTER=yesを指定すると、 MILTER対応で作られます(図10)。
図10 portsでのMILTER対応sendmailのインストール
# cd /usr/ports/mail/sendmail
# make install SENDMAIL_WITH_MILTER=yes

9.4. MILTER対応AMaViS-perlの作成

 sendmail側の準備は完了です。では、AMaViS-perl11*9) をMILTER対応で作りましょう。
 8.11ではフィルタプログラムにlibmilter.aと libsmutil.aをリンクしていました。8.12では libmilter.aとlibsm.aをリンクするように変更になって います。AMaViS-perlはまだ8.12には対応していません ので、8.11でのライブラリを仮定しています。8.12でコ ンパイルできるように修正します(リスト9)。
リスト9 8.12対応に変更するパッチ
Index: configure
diff -u configure.orig configure
--- configure.orig      Tue Sep 25 19:59:02 2001
+++ configure   Sat Oct  6 15:42:18 2001
@@ -2763,7 +2763,7 @@
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_save_LIBS="$LIBS"
-LIBS="-lmilter -lsmutil $LIBS"
+LIBS="-lmilter -lsm $LIBS"
 cat > conftest.$ac_ext <<EOF
 #line 2769 "configure"
 #include "confdefs.h"
@@ -2791,7 +2791,7 @@
 fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  LIBS="-lmilter -lsmutil $LIBS"
+  LIBS="-lmilter -lsm $LIBS"
 else
   echo "$ac_t""no" 1>&6
 enable_milter=no
 また、amavisはデフォルトで/usr/local/sbinにイン ストールされますが、/usr/sbinにインストールされる ことを仮定した部分がamavis-milter.cにあり、修正が 必要です(リスト10)。
リスト10 amavis-milter.cに対するパッチ
Index: amavis/amavis-milter.c
diff -u amavis/amavis-milter.c.orig amavis/amavis-milter.c
--- amavis/amavis-milter.c.orig	Fri Nov  2 05:54:54 2001
+++ amavis/amavis-milter.c	Fri Nov  2 05:55:02 2001
@@ -50,7 +50,7 @@
 #endif /* ! TRUE */
 
 #define TEMPLATE "/amavis-milter-XXXXXXXX"
-#define AMAVIS_PERL_PATH "/usr/sbin/amavis"
+#define AMAVIS_PERL_PATH "/usr/local/sbin/amavis"
 #define DEBUG_FILE "/tmp/virdebug"
 
 #ifndef HAVE_STRLCPY
 configure実行時に--enable-milterを指定すると MILTER対応になります。ここで、MILTER関連のインクルー ドファイルを見つけられるよう、 --with-sendmail-sourceでsendmailのソースがあるディ レクトリを指定します。sendmailをportsからインストー ルすると、インクルードファイルは /usr/local/include/libmilterにインストールされてい ますので、/usr/localを指定しておきます。また、 MILTER関連のライブラリは/usr/local/libにインストー ルされていますので、LDFLAGSを指定して実行します(リ スト11)。
リスト11 AMaVis-perl作成時のconfigureの指定
env LDFLAGS=-L/usr/local/lib ./configure \
	--with-virusdir=/var/spool/quarantine \
	--with-runtime-dir=/var/log/amavis \
	--with-logdir=/var/log/amavis \
	--with-sophos-ide=/usr/local/sav \
	--enable-milter \
	--with-sendmail-source=/usr/local

(ディレクトリ構成はports/security/amavis-perlに合わせてあります)
 ちなみに、この例では、ウィルススキャン・エンジン にSophos Sweep*10)を使用していますので、 --with-sophos-ide=/usr/local/savを指定しています。 御使用のエンジンに応じて適宜変更して下さい。
 configureを実行すると、図11のような設定情報が出力 されます。ここでConfigured for use with:が sendmail/libmilterとなっていることを確認しておきま しょう。
図11 configureの出力
** Configuration summary for amavis perl-11 2001-04-07:

  Install amavis as:          /usr/local/sbin/amavis
  Configured for use with:    sendmail/libmilter
  Use virus scanner(s):       Sophos Sweep
  Scanner runs as:            root
  Logging to syslog:          yes
  Quarantine directory:       /var/spool/quarantine
  Max. recursion depth:       20
  Add X-Virus-Scanned header: yes
  Display AMaViS credits:     no 
  Warn sender:                yes
  Reports sent to:            virusalert
  Reports sent by:            postmaster

9.5. .mcへのルールの追加

 sendmail.cf にMILTERのルールを追加します。フィル タの指定は.mcにINPUT_MAIL_FILTERで指定します(リス ト12)。ちなみに、amavis-perl-11/README.milterには _FFR_MILTERを定義するように書いてありますが、8.12 ではMILTERは正式機能ですので、指定する必要はありま せん。
リスト12 .mcでのフィルタの指定例
INPUT_MAIL_FILTER(`milter-amavis',
		  `S=local:/var/log/amavis/amavis.sock, T=S:10m;R:10m;E:10m')
 ここで、S=はフィルタと通信する方法の指定です。こ の例では、UNIXドメインソケットを使用しています。こ こで、
S=inet:ポート番号@ホスト名
と指定すると、IPv4を使用するようにできます。また、 inetの代わりにinet6と指定すると、IPv6を使用するよ うになります。ただし、AMaViS-perlはIPv6対応してい ませんので、IPv6による通信はできません。
 T=は、sendmailとフィルタとの通信時のタイムアウト の設定です。意味を表4に示します。
表4 T=でのタイムアウト指定
文字意味
Cフィルタへの接続時のタイムアウト(0の場合はシステムのタイムアウト値を使用)
SMTAからフィルタへ情報送信時のタイムアウト
Rフィルタからのリプライ受信時のタイムアウト
Eフィルタにend-of-messageを送信するまでの全体にかかるタイムアウト
 また、F=でフィルタとの通信ができなかった場合の動 作を指定できます(表5)。リスト12の例ではF=は指定し ていませんので、何らかの理由でamavis-milterとの通 信ができなかった場合は、フィルタが指定されていない ものとして、ウィルスチェックを行わずにそのままメー ルを配送します。
表5 F=での通信できなかった時の挙動の指定
文字意味
R接続を拒否する
T接続を一時的な失敗として扱う
なしフィルタが指定されてないものとして扱う

9.6. フィルタとsendmailの起動

 MILTER対応のAMaViS-perlは、sendmailとの通信をお こなうamavis-milterというデーモンと、amavis-milter から呼び出され実際にメールを解析するamavisからなり ます。
 一般的に、amavis-milterはsendmailの起動の前に起 動しておく必要があります。/etc/rc.confで sendmail_enable="NO"を指定し、FreeBSD立ち上げ時に /etc/rcから起動されないようにし、 /usr/local/etc/rc.d/sendmail.shを用意しておいた方 が良いでしょう。sendmail.shの例をリスト13に示しま す。
 なお、amavis-milterが起動されていなかった場合の 挙動は、INPUT_MAIL_FILTERのF=の指定に従います。運 用ポリシに依るとは思いますが、F=Rを指定していない のであれば、必ずしもsendmailより先に起動していなく ても、メールを拒否してしまう、あるいは、失ってしま うことはありませんので、従来通り/etc/rcでsendmail を起動し、/usr/local/etc/rc.d/amavis.shで amavis-milterを起動する運用もありかもしれません。
リスト13 /usr/local/etc/rc.d/sendmail.shの例
#!/bin/sh

case "$1" in
start)
	if [ -x /usr/local/sbin/amavis-milter ]; then
		rm -f /var/log/amavis/amavis.sock
		nohup /usr/local/sbin/amavis-milter \
		    -p local:/var/log/amavis/amavis.sock >/dev/null 2>&1 &
		echo -n ' amavis-milter'
		sleep 2
	fi
	if [ -f /etc/mail/sendmail.cf ]; then
		/usr/sbin/sendmail -L sm-mta -bd -q30m
		echo -n ' sm-mta'
	fi
	if [ -f /etc/mail/submit.cf ]; then
		/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m
		echo -n ' sm-msp-queue'
	fi
	;;
stop)
	kill `head -1 /var/run/sendmail.pid`
	kill `head -1 /var/spool/clientmqueue/sm-client.pid`
	killall amavis-milter
	rm -f /var/log/amavis/amavis.sock
	;;
*)
	echo "Usage: `basename $0` {start|stop}" >&2
	;;
esac

exit 0
 なお、AMaViS-perlはウィルスを検知した際に virusalert宛にメールで通知します。 /etc/mail/aliasesにvirusalertのエントリを追加して おくのをお忘れなく。

9.7. フィルタを専用ユーザで動かす

 これまで見てきた設定では、amavis-milterはroot権 限で動作しています。しかし、できるだけroot権限で動 かしたくないかもしれません。
 実は、MILTER対応の場合、フィルタ側は必ずしもroot で動作している必要はありません。専用のユーザを用意 しておき、amavis-milterはそのユーザで起動するよう にしてみましょう。
 まず、amavisという専用のユーザとグループを作成し ます。そして、configure実行時に、
--with-amavisuser=amavis:amavis
を指定します。make installすると、AMaViS-perl関連 のディレクトリが--with-amavisuserで指定したユーザ amavis、グループamavisで作成されます*11)
 そして、amavis-milter起動部分をリスト14のように 変更します。
リスト14 ユーザamavisで起動する例
nohup su -m amavis -c "exec /usr/local/sbin/amavis-milter -p local:/var/log/amavis/amavis.sock" > /dev/null 2>&1 &
 また、AMaViS-perlがウィルスを検知した際に、その メールの発信者およびvirusalert宛にメールで通知しま すが、その際にenvelope fromを設定していますので、 そのままだと、
X-Authentication-Warning: mail.example.com: amavis set sender to postmaster using -f
というワーニングがヘッダに付いてしまいます。これを 回避するには、submit.mcに
define(`confTRUSTED_USERS', `amavis')
を指定し、submit.cfを作り直します。

5. おわりに

 さっとでありますが、sendmail 8.12について説明し ました。8.12では、本稿では触れませんでしたが、LDAP との連携の強化やキューグループなどの機能も追加され ています。これにより、幅の広いメールシステムが構築 できると思われます。
 また、今回は、MILTERの説明に主眼を置きましたので、 AMaViS-perl自体、および、ウィルススキャン・エンジ ンについての説明は敢えておこないませんでした。
 本稿が少しでも8.12導入のお役に立てれば幸いです。


*1) MTA - Mail Transfer Agent
*2) MSP - Mail Submission Program
*3) sendmailがローカルからメールを送信する場合に使用するキューディレクトリ
*4) MUA - Mail User Agent
*5) MSA - Mail Submission Agent
*6) 未確認ですが、~/.netscape/preferences.jsで mail.auth_login = falseにすればSMTP AUTH を使わないようにできるらしいという情報もあります。
*7) http://amavis.org/
*8) FFR - For Future Releaseの略で、 将来のリリースに入る予定の実験的な機能については、 -D_FFR_hogeを指定すれば有効になるようになっています。
*9) http://www.amavis.org/dist/perl/amavis-perl-11.tar.gz
*10) http://www.sophos.com/, http://www.cseltd.co.jp/security/products.htm
FreeBSD版およびLinux版について個人使用の場合 は無料で利用できます。ありがたいことです。
*11) amavis-perl-11/README.postfixにある例ではユーザを指定するとありますが、 グループIDとディレクトリのグループIDが異なると、 amavis-milterの実行時にセキュリティチェックに引っかかり、 エラー終了します。 そのため、ユーザ:グループを指定しています。


All Rights Reserved, Copyright (C) 2001 Hajimu UMEMOTO
Last Modified Dec 18, 2001
ume@mahoroba.org