目的
MTA で SPF 検証 と DKIM 署名・検証を行う。※ほかに DNS で DKIM 署名とポリシーの設定が必要。
環境
OS FreeBSD 8.1-RELEASE
MTA Postfix 2.7.1
インストールするもの
- dkim-milter
DKIM の署名と検証を行う。検証は ENMA でできるので、署名機能だけ使用。 - ENMA
SPF, Sender ID, DKIM の検証を行う。 - milter manager
Postfix での milter はそれぞれのメールの条件で有効にしたり無効にしたりといった制御ができないので、それを行うためのデーモン。Postfix からは milter manager だけを参照し、プロキシのように動作する。
すべて ports からインストールしたものとする。
dkim-milter 2.8.3 (mail/dkim-milter)
署名の鍵を作成# mkdir /var/db/dkim
# dkim-genkey -d <domain name> -D /var/db/dkim -s <selector name>
# chown -R mailnull:mail /var/db/dkim/
selector name はなんでもいい。どの鍵で署名したかが分かるようにするぐらいの意味。
/etc/rc.conf
milterdkim_enable="YES"
milterdkim_flags="-b s"
-b で署名と検証のどちらを有効にするかを指定できる。デフォルトは両方とも有効。
/usr/local/etc/mail/dkim-filter.conf
Domain <domain name>
SubDomains Yes
KeyFile /var/db/dkim/<selector name>.private
InternalHosts /usr/local/etc/mail/internal.conf
Selector <selector name>
Socket local:/var/run/milterdkim/dkim-milter.sock
Canonicalization relaxed/simple
Canonicalization をこのように指定しないと、dkim-milter で署名したメールを ENMA で検証したときに fail していた。ほか詳細は dkim-filter.conf.sample を参照。
/usr/local/etc/mail/internal.conf
127.0.0.1
192.168.1.1/24
この IP アドレスから来て From が dkim-filter.conf の Domain パラメータと一致するメールに DKIM の署名をする。
ENMA 1.1.0 (mail/enma)
/etc/rc.conf
milterenma_enable="YES"
/usr/local/etc/enma.conf
milter.postfix: true
enma.conf.sample をコピーし、上記のところだけ変更する。
milter.socket を unix socket にしたら milter manager から呼ばれなくなるので、これは変更しない。おそらく socket のオーナーが root:wheel になるため。ソースでは socket を作ってから setuid/gid していた。
milter manager 1.4.2 (mail/milter-manager)
/etc/rc.conf
miltermanager_enable="YES"
/usr/local/etc/milter-manager/milter-manager.local.conf
define_milter("milter-dkim") do |milter|
milter.connection_spec = "unix:/var/run/milterdkim/dkim-milter.sock"
end
dkim-milter の connection_spec は自動認識できなかったので、設定を手書き。
/usr/local/etc/postfix/main.cf
smtpd_milters = unix:/var/run/milter-manager/milter-manager.sock
milter_default_action = accept # milter がこけたら通すように
↓こんな結果になれば OK
% /usr/local/sbin/milter-manager --show-config
package.platform = "freebsd"
package.options = nil
security.privilege_mode = false
security.effective_user = "mailnull"
security.effective_group = nil
manager.connection_spec = "unix:/var/run/milter-manager/milter-manager.sock"
manager.unix_socket_mode = 0660
manager.unix_socket_group = nil
manager.remove_unix_socket_on_create = true
manager.remove_unix_socket_on_close = true
manager.daemon = false
manager.pid_file = nil
manager.maintenance_interval = 100
manager.suspend_time_on_unacceptable = 5
manager.max_connections = 0
manager.max_file_descriptors = 0
manager.custom_configuration_directory = nil
controller.connection_spec = "unix:/var/run/milter-manager/milter-manager-controller.sock"
controller.unix_socket_mode = 0660
controller.unix_socket_group = nil
controller.remove_unix_socket_on_create = true
controller.remove_unix_socket_on_close = true
define_applicable_condition("S25R") do |condition|
condition.description = "Selective SMTP Rejection"
end
define_applicable_condition("Remote Network") do |condition|
condition.description = "Apply milter only if connected from remote network"
end
define_applicable_condition("Sendmail Compatible") do |condition|
condition.description = "Make a milter depends on Sendmail workable with Postfix"
end
define_applicable_condition("Authenticated") do |condition|
condition.description = "Apply a milter only when sender is authorized"
end
define_applicable_condition("Unauthenticated") do |condition|
condition.description = "Apply a milter only when sender is not authorized"
end
define_milter("milter-enma") do |milter|
milter.connection_spec = "inet:10025@127.0.0.1"
milter.description = nil
milter.enabled = true
milter.fallback_status = "accept"
milter.evaluation_mode = false
milter.applicable_conditions = ["Remote Network", "Unauthenticated"]
milter.command = "/usr/local/etc/rc.d/milter-enma"
milter.command_options = "start"
milter.user_name = nil
milter.connection_timeout = 300.0
milter.writing_timeout = 10.0
milter.reading_timeout = 10.0
milter.end_of_message_timeout = 300.0
end
define_milter("milter-dkim") do |milter|
milter.connection_spec = "unix:/var/run/milterdkim/dkim-milter.sock"
milter.description = nil
milter.enabled = true
milter.fallback_status = "accept"
milter.evaluation_mode = false
milter.applicable_conditions = []
milter.command = "/usr/local/etc/rc.d/milter-dkim"
milter.command_options = "start"
milter.user_name = nil
milter.connection_timeout = 300.0
milter.writing_timeout = 10.0
milter.reading_timeout = 10.0
milter.end_of_message_timeout = 300.0
end
0 件のコメント:
コメントを投稿