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の動作
|
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, s | STARTTLS |
| V, v | TLSハンドシェイク時のクライアントの証明書の要求 |
| A, a | SMTP AUTH |
| P, p | PIPELINING |
ここで、大文字で指定するとその機能を無効にし、小
文字で指定するとその機能を有効にします。
これにより、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を使わない場合
|
AMaViS-perl11では、以前からのコンフィギュレーショ
ンに加え、MILTER対応のコンフィグレーションが追加さ
れました(図9)。
図9 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の場合はシステムのタイムアウト値を使用) |
| S | MTAからフィルタへ情報送信時のタイムアウト |
| 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