sendmail関連(sendmail,greylist,dkim,domainkeys,spf,clamav ...)
greylisting機能を提供するsendmail用milter。ライセンスはBSD。
% ./configure % make # make install
/etc/mail/greylist.confを編集します。
こんなスクリプト (
gris2greylist)で、milter-grisの設定を変換します。
% gris2greylist /etc/mail/access >> /etc/mail/greylist.conf
内部からのメールにX-Greylist:ヘッダがつかないように、greylist.confに
report delays
と書いておきます。こうすると、遅延メールにだけX-Greylist:ヘッダがつくようになります。
以下をsendmail.mcに追加しsendmail.cfをつくりなおします。
INPUT_MAIL_FILTER(`milter-greylist',
`S=unix:/var/milter-greylist/milter-greylist.sock, T=C:1m;S:30s;R:6m;E:1m')dnl
rc-bsd.shを参考に以下のように /etc/rc.d/miltergreylistを作成します。
#!/bin/sh
# $Id: rc-bsd.sh.in,v 1.2 2004/07/29 06:53:02 manu Exp $
# PROVIDE: miltergreylist
# REQUIRE: LOGIN
# BEFORE: sendmail
. /etc/rc.subr
name="miltergreylist"
rcvar=$name
command="/usr/local/bin/milter-greylist"
pidfile="/var/run/milter-greylist.pid"
command_args="-P ${pidfile} -u root -p /var/milter-greylist/milter-greylist.sock"
start_precmd="rm -f /var/milter-greylist/milter-greylist.sock"
required_files="/etc/mail/greylist.conf"
load_rc_config ${name}
run_rc_command "$1"
/etc/rc.confに以下を追加します。
miltergreylist=YES
送信者認証技術 SPF/senderIDのsendmail用milterを導入してみます。 http://sendmail.net/sid-milter
NetBSD 3.0rc5上でコンパイルした 0.2.10 は現在動作していないため、NetBSD 2.0.2を使用してコンパイルしたsid-milterを使用います(2005/12/15現在)
正常
以下のエラーを出して起動しません。
_res is not supported for multi-threaded programs.
起動はしますが、ドメインの解決に失敗します。
sender-id=fail (DomainDoesNotExist); spf=fail (DomainDoesNotExist)
以下のエラーを出して起動しません。
_res is not supported for multi-threaded programs.
起動はしますが、ドメインの解決に失敗します。
sender-id=fail (DomainDoesNotExist); spf=fail (DomainDoesNotExist)
受信側でDNS設定例
MXホストからのみ送信を許可する場合(それ以外から送信されたらsoftfail) IN TXT "v=spf1 mx ~all"
% tar zxvf sid-milter-0.2.10.tar.gz % cd sid-milter-0.2.10
devtools/Site/site.config.m4を以下のように作成
define(`confMTLDOPTS', `-lpthread')
そのままBuildして作成すると、実行時に以下のようなメッセージがでます。
_res is not supported for multi-threaded programs
これを回避するために、sid-filter/Makefile.m4を編集し、以下の二行を削除します。
PREPENDDEF(`confINCDIRS', `-I../../libar ') APPENDDEF(`confENVDEF', `-DUSE_ARLIB ')
% ./Build % su # make install
以下NetBSDの設定ファイルでは/var/libのかわりに/var/spoolを使用する
sendmail.mcに以下を追加してsendmail.cfをつくり直す
INPUT_MAIL_FILTER(`sid-filter', `S=inet:8893@localhost')
# mkdir /etc/mail/sid-milter
/etc/mail/sid-milter/peerlistを作成(チェックしないアドレスを登録)
例: 192.168.100.0/24 127.0.0.0
# /usr/bin/sid-filter -l -a /etc/mail/sid-milter/peerlist -p inet:8893@localhost # /etc/init.d/sendmail restart
./INSTALL中に示されているアドレス、sa-test@sendmail.netにテストメイルを送付し、 返送結果を確認します。
以下のようにResult:がGOODになっていればOKです。
Authentication System: Sender ID Result: SID data confirmed GOOD Description: Sending host is authorized for sending domain Reporting host: sendmail.net More information: http://www.microsoft.com/senderid Sendmail milter: http://www.sendmail.net/sid-milter Authentication System: Sender Permitted From (SPF) Result: SPF data confirmed GOOD Description: Sending host is authorized for sending domain Reporting host: sendmail.net More information: http://spf.pobox.com/
返送されたメイルのヘッダに、
Authentication-Results: mail.example.com from=sa-test@sendmail.net; sender-id=neutral; spf=neutral
があれば受信時の設定はOKです。
/etc/rc.confに以下を追加
sidfilter=YES sidfilter_flags="-l -a /etc/mail/sid-milter/peerlist -u sidfilter -P /var/run/sidfilter/sidfilter.pid -p inet:8893@localhost"
/etc/rc.d/sidfilterを作成
#!/bin/sh
# REQUIRE: syslogd
# BEFORE: mail
# KEYWORD: FreeBSD NetBSD
. /etc/rc.subr
name="sidfilter"
rcvar=$name
command="/usr/bin/sid-filter"
pidfile="/var/run/sidfilter/${name}.pid"
load_rc_config $name
run_rc_command "$1"
上記peerlist以外のホストから受信したメールにAuthentication-Results:ヘッダが付くようになる。
Authentication-Results: yyy.example.org from=xxx@example.com; sender-id=softfail; spf=softfail (softfail時) Authentication-Results: yyy.example.org from=xxx@example.com; sender-id=pass; spf=pass (pass時)
これをどう処理するかは別途処理が必要(例: procmail等)
milter-grisと連携できないかな?
送信者認証技術Domain Keysのsendmail milterを導入します。 http://sendmail.net/dk-milter
% tar zxvf dk-milter-0.4.0.tar.gz % cd dk-milter-0.4.0
devtools/Site/site.config.m4を以下のように作成
define(`confMTLDOPTS', `-lpthread')
% ./Build # ./Build install
sendmail.mcに以下を追加してsendmail.cfをつくり直す
INPUT_MAIL_FILTER(`dk-filter', `S=inet:8892@localhost')
SELECTORは識別子となるようです。今回はSELECTORを「mail」とします。 % cd dk-milter-0.4.0/dk-filter % ./gentxt.csh mail
標準出力に
mail._domainkey IN TXT "g=; k=rsa; t=y; p=XXXXXXXYYYYYYYZZZZZZZZ"
のようなものが出力されます。これをDNSに設定します。bindの設定ファイルだったら、このまま張り付ければOKです。 bind等を再起動し mail._domainkey.example.com のTXTエントリがアクセスできることを確認します。
% host -t txt mail._domainkey.example.com mail._domainkey.example.com descriptive text "g=\; k=rsa\; t=y\; p=XXXXXXXYYYYYYYZZZZZZZZ"
このように出力されればOKです。
gentxt.cshを実行すると、mail.public, mail.privateというファイルが生成 されます。mail.privateを適当なディレクトリにコピーします。mail送信時に このファイルを用いてサインされます。 ついでなのでmail.publicもコピーし ておきます。
# mkdir -p /var/db/domainkeys # cp -p mail.private mail.public /var/db/domainkeys
# /usr/bin/dk-filter -l \
-i /etc/mail/dk-milter/ilist \
-p inet:8892@localhost \
-S mail \
-s /var/db/domainkeys/mail.private \
-d example.com,example.org
# /etc/rc.d/sendmail restart
./INSTALL中に示されているアドレス、sa-test@sendmail.netにテストメイルを送付し、 返送結果を確認します。
以下のようにResult:がGOODになっていればOKです。 なお、送付したメイルにはDomainKey?-Signature:ヘッダが付加されていない場合は設定を再確認します。
Authentication System: Domain Keys Result: DK signature confirmed GOOD Description: Signature verified, message arrived intact Reporting host: sendmail.net More information: http://antispam.yahoo.com/domainkeys Sendmail milter: http://www.sendmail.net/dk-milter
返送されたメイルのヘッダに、
DomainKey-Status: good
があれば受信時の設定はOKです。
/etc/rc.confに以下を追加
dkfilter=YES dkfilter_flags="-l -S mail -i /etc/mail/dk-milter/ilist -p inet:8892@localhost -s /var/db/dk-filter/mail.private -d example.org,example.com -u dkfilter -P /var/run/dkfilter/dkfilter.pid"
/etc/rc.d/dkfilterを作成
#!/bin/sh
# REQUIRE: syslogd
# BEFORE: mail
# KEYWORD: FreeBSD NetBSD
. /etc/rc.subr
name="dkfilter"
rcvar=$name
command="/usr/bin/dk-filter"
pidfile="/var/run/dkfilter/${name}.pid"
required_files="/etc/mail/dk-milter/ilist"
load_rc_config $name
run_rc_command "$1"
送信者認証技術 DKIMのsendmail用milterを導入してみます。 http://sourceforge.net/projects/dkim-milter/
% tar zxvf dkim-milter-0.6.3.tar.gz % cd dkim-milter-0.6.3
devtools/Site/site.config.m4を以下のように作成
define(`confMTCCOPTS', `-pthread') define(`confMTLDOPTS', `-pthread')
% ./Build # make install
インストールされるもの↓ /usr/bin/dkim-filter /usr/lib/libar.a
sendmail.mcに以下を追加してsendmail.cfをつくり直す
INPUT_MAIL_FILTER(`dkimfilter', `S=inet:8891@localhost')
セキュリティ上、dkimを実行するためのユーザは分離したほうがいいので、dkimを実行するためのユーザを作成します。
# useradd dkim
SELECTORは識別子となるようです。今回はSELECTORを「lagoon」とします。 % cd dkim-filter % ./gentxt.csh
標準出力に
lagoon._domainkey IN TXT "v=DKIM1; g=; k=rsa; t=y; p=XXXXXXXYYYYYYYZZZZZZZZ"
のようなものが出力されます。これをDNSのzoneファイルに設定します。bindであればこのまま張り付ければOKです。 DNSには以下のようにポリシーも設定します。
_policy._domainkey IN TXT "t=y; o=~"
bind等を再起動し lagoon._domainkey.example.com のTXTエントリがアクセスできることを確認します。
% host -t txt lagoon._domainkey.example.com lagoon._domainkey.example.com descriptive text "v=DKIM1\; g=\; k=rsa\; t=y\; p=XXXXXXXYYYYYYYZZZZZZZZ"
このように出力されればOKです。
gentxt.cshを実行すると、lagoon.public, lagoon.privateというファイルが生成 されます。lagoon.privateを適当なディレクトリにコピーします。mail送信時に このファイルを用いてサインされます。 ついでなのでlagoon.publicもコピーし ておきます。
# mkdir -p /var/db/dkim # cp lagoon.private lagoon.public /var/db/domainkeys # chown -R dkim /var/db/dkim # chmod 500 /var/db/dkim
dkim-filterではサインするかどうかは受信したときの相手のIPアドレスで判定します。 デフォルトでは127.0.0.1のみとなっていますが、自ネットワーク内のアドレスをここに設定します。
# mkdir /etc/mail/dkim # vi /etc/mail/dkim/ilist 192.168.1.0/24 127.0.0.1
# chown -R dkim /etc/mail/dkim # chmod 500 /etc/mail/dkim
# /usr/bin/dkim-filter -l \
-i /etc/mail/dkim/ilist \
-p inet:8891@localhost \
-s lagoon \
-k /var/db/dkim/lagoon.private \
-d example.com,example.org
# /etc/init.d/sendmail restart
上記は0.5.0用。0.2.0ではオプションが異なります
(obsolete: dkim-filter 0.2.0用)
# /usr/bin/dkim-filter -l \
-i /etc/mail/dkim/ilist \
-p inet:8891@localhost \
-S lagoon \
-s /var/db/dkim/lagoon.private \
-d example.com,example.org
# /etc/init.d/sendmail restart
./INSTALL中に示されているアドレス、sa-test@sendmail.netではDKIMのテストができないようです(2005/12/06現在)。そこで、autorespond+dkim@dk.elandsys.comにテストメイルを送付し返送結果を確認します。
2005/12/15現在、sa-test@sendmail.netでも確認できるようです。
以下のように結果がpassになっていればOKです。 なお、送付したメイルにはDKIM-Signature:ヘッダが付加されていない場合は設定を再確認します。
DKIM Test: pass
返送されたメイルのヘッダに、
Authentication-Results: example.com header.From=autorespond@dk.elandsys.com; dkim=pass
があれば受信時の設定はOKです。
/etc/rc.confに以下を追加します。
dkimfilter=YES # for 0.2.0 # dkimfilter_flags="-l -S lagoon -i /etc/mail/dkim/ilist -p inet:8891@localhost -s /var/db/dkim/lagoon.private -d example.org,example.net -u dkim -P /var/run/dkim/dkimfilter.pid" # for 0.5.0 dkimfilter_flags="-l -s lagoon -i /etc/mail/dkim/ilist -p inet:8891@localhost -k /var/db/dkim/lagoon.private -d example.org,example.net -u dkim -P /var/run/dkim/dkimfilter.pid"
/etc/rc.d/dkimfilterを作成します。内容は以下です。
#!/bin/sh
# REQUIRE: syslogd
# BEFORE: mail
# KEYWORD: FreeBSD NetBSD
. /etc/rc.subr
name="dkimfilter"
rcvar=$name
command="/usr/bin/dkim-filter"
pidfile="/var/run/dkim/${name}.pid"
required_files="/etc/mail/dkim/ilist"
load_rc_config $name
run_rc_command "$1"
基本的にはpkgsrcからインストールします。
その前に、milterを使えるように、 /etc/mk.confに以下を追加します。
PKG_OPTIONS.clamav += milter
# cd /usr/pkgsrc/mail/clamav/
自前でインストールしたlibmilter(sendmailのインストール時にインストール しました)を使えるように、Makefileに以下のパッチをあてておきます。
--- Makefile.orig 2005-08-04 09:49:05.000000000 +0900 +++ Makefile 2005-08-17 15:51:42.000000000 +0900 @@ -65,7 +65,7 @@ # to check API compatibility(!), so it must build with as new a version of # libmilter as pkgsrc is capable of providing USE_BUILTIN.libmilter= no -. include "../../mail/libmilter/buildlink3.mk" +# . include "../../mail/libmilter/buildlink3.mk" CONFIGURE_ARGS+= --enable-milter PLIST_SUBST+= MILTER= .else
さて、ここからがインストール本番です。
# make install
# ↓コメントにします #Example
# ↓コメントにします #Example # ↓追加します DatabaseMirror db.jp.clamav.net
freshclamコマンドを実行し、データベースを最新にします。
# freshclam
# mkdir /var/spool/clamav-milter # chown clamav /var/spool/clamav-milter
デーモン起動用スクリプトを所定の場所におきます。
# cd /usr/pkg/share/examples/rc.d # cp -p clamd freshclamd /etc/rc.d/
なお、clamav-milter起動用スクリプトはサンプルが添付されていないため、以下のように作成しました。
/etc/rc.confに以下を追加します。
clamd=YES clamavmilter=YES clamavmilter_flags="--noxheader -loe /var/spool/clamav-milter/socket"
※ メール送信時にもチェックする設定で、かつdk-milterの後にclamav-milterを実行する設定のため、 オプションの--noxheaderをつけないとclamav関連ヘッダがついてしまうためDomainkeysのチェックでNGとなります。
以下のように起動します。
# /etc/rc.d/clamd start # /etc/rc.d/freshclamd start # /etc/rc.d/clamavmilter start
/var/log/clamd.logや /var/log/maillogで問題がないことを確認します。
なお、freshclamdはデーモンとして起動し、デフォルトで1日2回データベースの更新 があるかどうかをチェックするようになります。
以下をsendmail.mcに追加しsendmail.cfを作成します
INPUT_MAIL_FILTER(`clamav-filter',`S=local:/var/spool/clamav-milter/socket, F=, T=S:4m;R:4m')dnl
上述したように、X-Virus-Scanned:ヘッダやX-Virus-Status:ヘッダは付けないように設定していませんが、 もし付けるように設定した場合、以下の方法でこれをいじることができます。
clamav-milterではX-Virus-Scanned:ヘッダが付加されます。このときこのヘッダには、 以下のようにclamav-milterを実行したホスト名が表示されます。
X-Virus-Scanned: ClamAV version 0.86.2, clamav-milter version 0.86 on xxx.example.com X-Virus-Status: Clean
このホスト名をsendmail.cfの%jで設定されたものが使用されるようにソース
を修正します。パッチ(
patch-xx)を
/usr/pkgsrc/mail/clamav/patches/ に置き、distinfoにこのファイルのSHA1
を追加します。
# echo 'SHA1 (patch-xx) = c03147581b61a34c13cdffec3066a2d1a04f3ac5' >> distinfo
ちなみに、これは以下の方法で作成したものです。
# sha1 patch-xx SHA1 (patch-xx) = c03147581b61a34c13cdffec3066a2d1a04f3ac5
sendmail-8.14.0.Alpha2をインストールします。 greylistingやspfが使えるようにmilterも使えるようにしておきます。
cyrus-saslをpkgsrcからインストールします。 cyrus-saslがdb4を使うように/etc/mk.confに以下の設定をします。
SASL_DBTYPE=berkeley
その後、以下のパッケージをインストールします。
cyrus-sasl-2.1.22 cy2-crammd5-2.1.22 cy2-digestmd5-2.1.22
/etc/ld.so.confに以下を追加します。
/usr/pkg/lib /usr/pkg/lib/sasl2
ldconfigコマンドを実行します。
# ldconfig
sasl用ユーザを作成します。
# saslpasswd2 -u example.com testuser
登録を確認します。
# sasldblistusers2 testuser@example.com: userPassword
% tar zxvf sendmail.8.14.0.Alpha2.tar.gz % cd sendmail-8.14.0.Alpha2
devtools/Site/site.config.m4 を作成します。
APPENDDEF(`conf_sendmail_ENVDEF', `-DSASL=2 -DSTARTTLS') APPENDDEF(`conf_sendmail_LIBS', `-lsasl2 -lssl -lcrypto') APPENDDEF(`confLIBDIRS', `-L/usr/pkg/lib') APPENDDEF(`confLIBS', `-ldb4') APPENDDEF(`confINCDIRS', `-I/usr/pkg/include -I/usr/pkg/include/db4')
コンパイルを行います。
% ./Build % su # ./Build install
% cd libmilter % ./Build % su # ./Build install インストールされるもの↓ /usr/include/libmilter/* /usr/lib/libmilter.a
% cd ../cf/cf hogehoge.mc, hogehoge-submit.mcを編集します。 hogehoge.mcでは、greylisting,spf,dkを追加するために、もともとの.mcに以下を追加します。
define(`_FFR_MILTER', `1')dnl
define(`confLOG_LEVEL', `14')dnl
define(`confMILTER_LOG_LEVEL', 14)dnl
define(`confCACERT_PATH', `/etc/mail/certs/')
define(`confCACERT', `/etc/mail/certs/my.cert.pem')
define(`confSERVER_CERT', `/etc/mail/certs/my.cert.pem')
define(`confSERVER_KEY', `/etc/mail/certs/my.key.pem')
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5')
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5')
INPUT_MAIL_FILTER(`dkimfilter', `S=inet:8891@localhost')
INPUT_MAIL_FILTER(`dk-filter', `S=inet:8892@localhost')
INPUT_MAIL_FILTER(`sid-filter', `S=inet:8893@localhost')
INPUT_MAIL_FILTER(`milter-greylist',
`S=unix:/var/milter-greylist/milter-greylist.sock, T=C:1m;S:30s;R:6m;E:1m')dnl
INPUT_MAIL_FILTER(`clamav-filter',`S=local:/var/spool/clamav-milter/socket, F=,
T=S:4m;R:4m')dnl
※この例ではdkimfilter, dk-filter, sid-filter, milter-greylist,clamav-filterの順にフィ ルタが実行されます なお設定値の意味は sendmail/libmilter/docs/installation.html を参照 INPUT_MAIL_FILTER(`filter2', `S=unix:/var/run/f2.sock, F=T, T=S:1s;R:1s;E:5m')
| F= | R | フィルタが利用できない場合はコネクションを拒否する |
| T | フィルタが利用できない場合はコネクションを一時エラーにする | |
| F=を設定しない場合はフィルタが利用できない場合はフィルタなしの動作を行う |
| T= | C | フィルタへの接続のタイムアウト(デフォルト5分) |
| S | MTAからフィルタへの送信タイムアウト(デフォルト10秒) | |
| R | フィルタから応答読み出しタイムアウト(デフォルト10秒) | |
| E | フィルタへメッセージの最後まで送信してから、最終確認を待っている間のタイムアウト(デフォルト5分) |
最後に.cfを作成し所定の場所にインストールします。
% make hogehoge.cf hogehoge-submit.cf # cp hogehoge.cf /etc/mail/sendmail.cf # cp hogehoge-submit.cf /etc/mail/submit.cf
qpopperで作った証明書を利用する。
# cd /etc/mail/certs # chmod g-w . # cp -p signed-req.pem my.cert.pem # cp -p cert.pem my.key.pem # vi my.key.pem 証明書の部分(BEGIN CERTIFICATEからEND CERTIFICATEまで)を削除
wanderlustでSTARTTLS利用時にはstarttlsパッケージが必要です。 ftp://opaopa.org/pub/elisp/starttls-0.10.tar.gz
% tar zxvf starttls-0.10.tar.gz % cd starttls-0.10 % ./configure --prefix=/usr/local % make % su # make install
/.wlなどに以下を追加
; ; SMTP AUTH用 ; (setq wl-smtp-posting-user "testuser@example.com") (setq wl-smtp-authenticate-type "digest-md5") ; ; STARTTLS用 ; (setq wl-smtp-connection-type 'starttls)
sendmailでgreylistingを使う方法の一つです。http://www.milter.info/milter-gris/
上記インストール手順でmilterを使えるようにしたsendmailをインストールします。
http://www.snertsoft.com/download/ から
libsnert-1.52.tar.gz milter-gris-0.12.tar.gz
をダウンロードします。 なお、最近(0.10あたりから)はダウンロードするためにはアカウントを登録す る必要があるようです。
% tar zxvf libsnert-1.52.tar.gz % tar zxvf milter-gris-0.12.tar.gz
NetBSDだとcom/snert/src/lib/sys/Mutex.cのコンパイルに失敗するので以下
のパッチをあてる。
Mutex.c.diff
% cd com/snert/src/lib % CFLAGS=-D__unix__ ./configure --with-db=/usr/pkg % gmake % cd ../milter-gris % CFLAGS=-D__unix__ ./configure --with-db=/usr/pkg % gmake % su # gmake install # mkdir /home/milter # chown milter.milter /home/milter
.mcに以下を追加してsendmail.cfをつくりなおし
define(`_FFR_MILTER', `1')dnl
define(`confLOG_LEVEL', `14')dnl
define(`confMILTER_LOG_LEVEL', 14)dnl
INPUT_MAIL_FILTER(
`milter-gris',
`S=unix:/var/lib/milter-gris/socket, T=C:1m;S:30s;R:6m;E:1m'
)dnl