2010年8月18日水曜日

ENMA, dkim-milter, milter manager で DKIM

目的

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 だけを参照し、プロキシのように動作する。
もともと SPF/DKIM の検証が優先だったため、このような構成となった。

すべて 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

2010年8月14日土曜日

VMware ESXi と SATARAID4P-PCI

VMware ESXi で 玄人志向の SATARAID4P-PCI が使えるという話を見たので、試してみた。

確かに認識はしたのだけど、RAID アレイはそれぞれ単独のディスクにしか見えない。考えてみればこんな安価なカードが HW RAID として使えるわけがないのだけど、ネット上にはどう見えるかという話はないので書いておく。

バージョンは VMware ESXi 4.1 ビルド 260247。