ライン

ポイント:*

ライン

 はじめに

Postfix

 FreeBSD 2.xから、主な利用サーバはsendmailで生活していましたが、今回Postfixに移り住むことにしました。
qmailは既にPDSになり、eximも一部が利用しているだけ。OpenSMTPdはまだ成長期の前段階にあるように見えるし。
やはり過渡期には、成熟しているPostfixが良いなぁ、と思ったのです。

 過去に、Postfixを導入して利用してきてはいますので、試す…は今回しませんでした。
既に非公開にしている過去のページと公開したままの過去のページをベースに導入設定を開始します。

 今回の環境は、FreeBSD 9.3です。Maildirで利用し、imap/popはDovecotを使用する予定です。
メール関連では、MailManやProcmail、アンチウィルス、アンチスパムなどもありますが、これも既にお試し済みなので徐々にやっていきます。

 導入

 Postfixはportsで導入することにしますが、できる範囲は、pkgで入れていきます。

# cd /usr/ports/mail/postfix 
# make config

選択メニューが表示されます。

上記がデフォルト値です。
DOCSとPCREが選択されている状態です。

 まずは、pkgでこの状態の物を入れます。

#pkg install postfix
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        postfix: 2.11.3_3,1

The process will require 12 MB more space.
1 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching postfix-2.11.3_3,1.txz: 100%    1 MB 223.0k/s    00:09
Checking integrity... done (0 conflicting)
[1/1] Installing postfix-2.11.3_3,1...
===> Creating users and/or groups.
Using existing group 'mail'.
Creating group 'maildrop' with gid '126'.
Creating group 'postfix' with gid '125'.
Creating user 'postfix' with uid '125'.
Adding user 'postfix' to group 'mail'.
[1/1] Extracting postfix-2.11.3_3,1: 100%
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y
Message for postfix-2.11.3_3,1:
 To enable postfix startup script please add postfix_enable="YES" in
your rc.conf

If you not need sendmail anymore, please add in your rc.conf:

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

And you can disable some sendmail specific daily maintenance routines in your
/etc/periodic.conf file:

daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

If /etc/periodic.conf does not exist please create it and add those values.

If you are using SASL, you need to make sure that postfix has access to read
the sasldb file.  This is accomplished by adding postfix to group mail and
making the /usr/local/etc/sasldb* file(s) readable by group mail (this should
be the default for new installs).

If you are upgrading from Postfix 2.6 or earlier, review the RELEASE_NOTES to
familiarize yourself with new features and incompatabilities.

上記の通り、変更を入れてしまいます。
/etc/rc.confに以下を追加。

# Postfix
postfix_enable="YES"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

/etc/periodic.confはまだ未作成でしたので、追加。

daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

のような感じです。

さて、portsに戻って、再導入を行います。
INST_BASE_DESC= Install into /usr and /etc/postfix
これはどうしようと思いましたが、/usr/local以下にあって良いので、付けずに利用することにしました。
Linuxの設定例をそのまま利用できそうで便利そうには思うのですが、自分のメモと一致しない方が面倒そうでした。

結局は以下のように、SPFとTLS、そしてDovecot 2系でいれることにしました。

 では、再度導入を行います。

#make reinstall

途中で、Dovecotの導入選択が来ます。

上記に、LIBWRAPPERを加えてコンパイルを続けます。
コンパイルが終わったら、同様 /etc/rc.confに以下を加えます。

# Dovecot
dovecot_enable="YES"

 ここで一度サーバの再起動して正常に動作することを確認しました。

Jan  4 22:38:36 sh4 postfix/postfix-script[849]: starting the Postfix mail system
Jan  4 22:38:36 sh4 postfix/master[851]: daemon started -- version 2.11.3, configuration /usr/local/etc/postfix

ちゃんと動いていることを確認しました。既に、sendmailは動作していません。
Dovecotの設定は完了していないので、エラーが出ているのはとりあえず後回しにしました。

 設定

Postfix

 今回は、マルチドメインで設定を行ないます。main.cfを編集していきます。

# cd /usr/local/etc/postfix/
# ll
total 96
-rw-r--r--  1 root  wheel  11942 Jan  4 22:31 LICENSE
-rw-r--r--  1 root  wheel   1629 Jan  4 22:31 TLS_LICENSE
-rw-r--r--  1 root  wheel   3547 Jan  4 22:31 bounce.cf.default
-rw-r--r--  1 root  wheel  26309 Jan  4 21:42 main.cf
-rw-r--r--  1 root  wheel  33187 Jan  4 22:31 main.cf.default
-rw-r--r--  1 root  wheel   2253 Jan  4 22:31 makedefs.out
-rw-r--r--  1 root  wheel   6200 Jan  4 21:42 master.cf

 上記のように、設定ファイルは準備されていました。

# cp -p main.cf main.cf.orig
# grep -v "^#" main.cf | grep -v '^$'
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 550
mynetworks_style = host
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
inet_protocols = ipv4

 上記をベースに修正を入れていきます。

myhostname = ns.example.jp
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
        mail.$mydomain
virtual_alias_maps = hash:/usr/local/etc/postfix/virtual
unknown_local_recipient_reject_code = 550
mynetworks_style = host
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
home_mailbox = Maildir/
header_checks = regexp:$config_directory/header_checks
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
inet_protocols = ipv4

/usr/local/etc/postfix/header_checksの設定は、適当に入れました。
virtualは、sendmailの時に作成していたvirtusertableの内容を編集し移行しました。
基本的には、バーチャルで登録しているユーザは、ローカルのユーザに渡すか、nullで吸い込んで消すか、他のメールに転送をするかにより処理しているだけです。

example.jp                               anything
info                                         foo
sales                                        foo@example.com
beginners                                 null

上記の吸い込み用のnullは、/etc/mail/aliasesに登録している内容によります。

bit-bucket: /dev/null
null: bit-bucket

こんな設定を加えています。反映は以下の通りです。

# newaliases
# postmap /usr/local/etc/postfix/virtual
# service postfix reload

これで基本的な設定ができました。
SMTP認証や、SPAM対策、ウィルス対策、RBLチェック、TLS通信、Procmail連動、SPFの連動、MailMan連動など設定する部分は盛りだくさんなのですが、順番にこなしていくしかありません。
 たぶん、Milterで連動することにすると思いますし、のんびりやっていきます。移行もmailboxからmaildirへ移動したり、またMailManのデータやシーケンサの番号も調整が必要になります。

 では、メールが外から送信できないのは困るのでSMTP認証から開始していきます。

Devecot2

 導入は、既にされているので設定をしていきます。
 設定ファイルは、/usr/local/etc/dovecot/以下に設定しますが、現時点はREADMEだけはいったフォルダ。
「Configuration files go to this directory. See example configuration files in /usr/local/share/doc/dovecot/example-config/」と書かれていますので、必要な設定ファイルを持ってくることにします。

drwxr-xr-x  2 root  wheel  1024 Jan  4 22:31 conf.d/
-rw-r--r--  1 root  wheel  1507 Jan  4 22:31 dovecot-dict-auth.conf.ext
-rw-r--r--  1 root  wheel   852 Jan  4 22:31 dovecot-dict-sql.conf.ext
-rw-r--r--  1 root  wheel  5292 Jan  4 22:31 dovecot-ldap.conf.ext
-rw-r--r--  1 root  wheel  5612 Jan  4 22:31 dovecot-sql.conf.ext
-rw-r--r--  1 root  wheel  4410 Jan  4 22:31 dovecot.conf

こんな状態が置かれていました。

# cp /usr/local/share/doc/dovecot/example-config/dovecot.conf /usr/local/etc/dovecot
# cp -rp /usr/local/share/doc/dovecot/example-config/conf.d /usr/local/etc/dovecot/

dovecot.confに必要な設定を加えます。TCP Wrapperなどの設定を入れておきます。

# grep -v "^#" dovecot.conf | grep -v '^$'
protocols = imap pop3 lmtp
service pop3-login {
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
login_access_sockets = tcpwrap
service tcpwrap {
  unix_listener login/tcpwrap {
    group = $default_login_user
    mode = 0600
    user = $default_login_user
  }
}
dict {
}
!include conf.d/*.conf
!include_try local.conf

 conf.d/10-logging.confにはログ位置を記述。

# grep -v "^#" 10-logging.conf | grep -v '^$'
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot_info.log
plugin {
}

 conf.d/10-mail.confを記述。ここは、ローカルユーザ以下のディレクトリにmaildir形式のフォルダを作成する普通のイメージ。

# grep -v ".*#" 10-mail.conf | grep -v '^$'
mail_location = maildir:~/Maildir
namespace inbox {
  inbox = yes
}

 conf.d/10-ssl.confを有効にする記述を開く。

#grep -v ".*#" 10-ssl.conf | grep -v '^$'
ssl = yes
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.pem

 SSLのためのキーの設定の実施をします。
dovecot-openssl.cnfを先に編集したければどうぞ。

# cd /etc/ssl
# mkdir private certs
# cd /usr/local/share/examples/dovecot/
# sh ./mkcert.sh
Generating a 1024 bit RSA private key
..............................++++++
......++++++
writing new private key to '/etc/ssl/private/dovecot.pem'
-----

subject= /OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com
SHA1 Fingerprint=E9:3D:40:D4:8E:2A:64:3C:1F:50:8A:69:00:65:28:AC:59:D8:9D:3E

サービスをあげてみます。

# service dovecot start

特にエラーも表示されず、ログ上も問題なさそうです。
実際に、becky!でPOPs受信してみました。

# tail -f /var/log/dovecot_info.log
Jan 10 15:42:43 pop3-login: Info: Login: user=<foo>, method=PLAIN, rip=-, lip=IP, mpid=51832, TLS, session=<->
Jan 10 15:42:43 pop3(foo): Info: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0

以上のように、認証できました。当然メールは何も届いていない状態なので、空振りしました。
IMAPは、そもそもポートあけていないので、利用できる状態になっていないので、ここではスキップします。
(後日考えます)

 ここで、もうネームサーバをこのサーバに仕向けてしまうことにしました。
MXレコードを変更するだけです。※面倒になってきたので、ここには書かないけど、大丈夫ですよね?

受信テスト

 gmailから早速送信してみました。結果初回失敗。

Jan 10 15:51:44 - postfix/smtpd[]: connect from mail-la0-f44.google.com[209.85.215.44]
Jan 10 15:51:45 - postfix/smtpd[]: NOQUEUE: reject: RCPT from mail-la0-f44.google.com[209.85.215.44]:
 454 4.7.1 <foo@example.com>: Relay access denied; from=<...@gmail.com>
 to=<foo@example.com> proto=ESMTP helo=<mail-la0-f44.google.com>
Jan 10 15:51:45 - postfix/smtpd[]: disconnect from mail-la0-f44.google.com[209.85.215.44]

なんか、Postfixの設定が間違えているな。
このページ上は間違いがあったら、前の記述は直すけど、失敗の記録はそのまま残そう。
うわっ、virtual_alias_maps = hash:/usr/local/etc/postfix/virtualを加えそびれているよ…。
修正してpostfixのreload。5分毎にgmailはリトライしてくれるみたいなので、到着待ち。

Jan 10 16:17:21 - postfix/smtpd[-]: connect from mail-la0-f50.google.com[209.85.215.50]
Jan 10 16:17:22 - postfix/smtpd[-]: 1FB429A0E6A: client=mail-la0-f50.google.com[209.85.215.50]
Jan 10 16:17:22 - postfix/cleanup[-]: 1FB429A0E6A: message-id=<-@mail.gmail.com>
Jan 10 16:17:22 - postfix/qmgr[-]: 1FB429A0E6A: from=<...@gmail.com>, size=2020, nrcpt=1 (queue active)
Jan 10 16:17:22 - postfix/local[-]: 1FB429A0E6A: to=<->, orig_to=<->, relay=local, delay=0.58,
 delays=0.57/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jan 10 16:17:22 - postfix/qmgr[-]: 1FB429A0E6A: removed
Jan 10 16:17:22 - postfix/smtpd[-]: disconnect from mail-la0-f50.google.com[209.85.215.50]

ちゃんとローカルにも渡っているようです。POPでの受信も問題ありません。
その後、最初に失敗していた1通目も到着しました。

送信テスト

 さて、早速失敗です。25番ポートが閉じていても、他は開いているよねぇ?
…というか、Postfixのsubmissionポートでの受信する設定を入れた覚えがない。(以前のページを参考にしたので順番がダメじゃん)
master.cf の設定した覚えが今回ありません。

 今回、以下に追加設定をするこtにします。

# cp -p  master.cf master.cf.orig

master.cf該当箇所に利用できるようにコメントをはずしておきます。

smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

submissionも対応したい方は同様です。

Dovecot側の設定も加えておく必要がありました。
もう過去のことで既に忘れていますが、/usr/local/etc/dovecot/conf.d/10-master.conf に追加します。

# ...略... 
service lmtp {
  ## unix_listener lmtp {
    #mode = 0666
  ## }

  # Create inet listener only if you can't use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    user  = postfix
    group = postfix
    mode  = 0666
  }
# ...略... 
} 

 # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
  }

のようにコメントになっている部分を外し、サービスを再起動してしました。

#service dovecot restart
#ll /var/spool/postfix/private/|grep auth
srw-rw-rw-  1 postfix  wheel  0 Jan 10 17:50 auth=
# service postfix reload

/var/spool/postfix/private/auth= が作成されました。
待機状態になっているかを確認しておきましょう。
※上記submissionの設定をした場合のみです

#netstat -a | grep submission
tcp6       0      0 *.submission           *.*                    LISTEN
tcp4       0      0 *.submission           *.*                    LISTEN

今度は587番ポートを待ち受けていました。再度送信のテストです。

Jan 10 19:03:16 - postfix/submission/smtpd[-]: connect from -[-]
Jan 10 19:03:17 - postfix/submission/smtpd[-]: Anonymous TLS connection established from -[-]:
 TLSv1 with cipher AES256-SHA (256/256 bits)
Jan 10 19:03:17 - postfix/submission/smtpd[-]: 26B279A0E6E: client=-[-], sasl_method=PLAIN, sasl_username=foo
Jan 10 19:03:17 - postfix/cleanup[-]: 26B279A0E6E: message-id=<@>
Jan 10 19:03:17 - postfix/qmgr[-]: 26B279A0E6E: from=<->, size=1110, nrcpt=1 (queue active)
Jan 10 19:03:17 - postfix/submission/smtpd[-]: disconnect from -[-]

無事完了です。

最終的なmain.cfは以下のようにしました。
これまで同様に、そっとRBLも加えてあります。

#grep -v ".*#" main.cf | grep -v '^$'
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
mail_owner = postfix
myhostname = ns.example.jp
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
        mail.$mydomain
virtual_alias_maps = hash:/usr/local/etc/postfix/virtual
unknown_local_recipient_reject_code = 550
mynetworks_style = host
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
home_mailbox = Maildir/
header_checks = regexp:$config_directory/header_checks
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
inet_protocols = ipv4,ipv6
smtpd_tls_auth_only = no
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_session_cache_database = btree:/var/db/postfix/smtpd_tls_scache
smtpd_tls_loglevel = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
message_size_limit = 10240000
mailbox_size_limit = 51200000
virtual_transport = lmtp:unix:private/dovecot-lmtp
smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
allow_percent_hack = yes
swap_bangpath = yes
allow_untrusted_routing = no
smtpd_client_restrictions =
 permit_mynetworks,
 reject_rbl_client all.rbl.jp,
 reject_rbl_client relays.ordb.org,
 reject_rbl_client spamcop.net,
 reject_rbl_client sbl.spamhaus.org,
 permit

これで普通に送受信ができるところまでは設定し、確認することができました。

 アンチウィルス対策、SPAM対策

アンチウィルス対策

 postfix連動も milterで利用することができます。
以前導入設定したように、milter-managerを導入してから、他を入れていきます。

# pkg install milter-manager
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%
The following 12 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        milter-manager: 2.0.4
        ruby: 2.0.0.598,1
        libyaml: 0.1.6_1
        readline: 6.3.8
        libffi: 3.0.13_3
        libexecinfo: 1.1_3
        rubygem-glib2: 2.2.3
        rubygem-pkg-config: 1.1.6
        ruby20-gems: 1.8.29
        glib: 2.42.1
        python27: 2.7.9
        libev: 4.15_1,1

The process will require 135 MB more space.
21 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching milter-manager-2.0.4.txz: 100%  763 kB 195.5k/s    00:04
Fetching ruby-2.0.0.598,1.txz: 100%    6 MB 241.4k/s    00:30
Fetching libyaml-0.1.6_1.txz: 100%   68 kB  70.2k/s    00:01
Fetching readline-6.3.8.txz: 100%  309 kB 158.7k/s    00:02
Fetching libffi-3.0.13_3.txz: 100%   32 kB  33.0k/s    00:01
Fetching libexecinfo-1.1_3.txz: 100%    8 kB   8.5k/s    00:01
Fetching rubygem-glib2-2.2.3.txz: 100%  440 kB 225.3k/s    00:02
Fetching rubygem-pkg-config-1.1.6.txz: 100%   91 kB  93.6k/s    00:01
Fetching ruby20-gems-1.8.29.txz: 100%  501 kB 257.0k/s    00:02
Fetching glib-2.42.1.txz: 100%    2 MB 228.8k/s    00:12
Fetching python27-2.7.9.txz: 100%   10 MB 237.9k/s    00:44
Fetching libev-4.15_1,1.txz: 100%  116 kB 118.9k/s    00:01
Checking integrity... done (0 conflicting)
[1/12] Installing libyaml-0.1.6_1...
[1/12] Extracting libyaml-0.1.6_1: 100%
[2/12] Installing readline-6.3.8...
[2/12] Extracting readline-6.3.8: 100%
[3/12] Installing libffi-3.0.13_3...
[3/12] Extracting libffi-3.0.13_3: 100%
[4/12] Installing libexecinfo-1.1_3...
[4/12] Extracting libexecinfo-1.1_3: 100%
[5/12] Installing ruby-2.0.0.598,1...
[5/12] Extracting ruby-2.0.0.598,1: 100%
[6/12] Installing ruby20-gems-1.8.29...
[6/12] Extracting ruby20-gems-1.8.29: 100%
[7/12] Installing python27-2.7.9...
[7/12] Extracting python27-2.7.9: 100%
[8/12] Installing rubygem-pkg-config-1.1.6...
[8/12] Extracting rubygem-pkg-config-1.1.6: 100%
[9/12] Installing glib-2.42.1...
[9/12] Extracting glib-2.42.1: 100%
No schema files found: doing nothing.
[10/12] Installing rubygem-glib2-2.2.3...
[10/12] Extracting rubygem-glib2-2.2.3: 100%
[11/12] Installing libev-4.15_1,1...
[11/12] Extracting libev-4.15_1,1: 100%
[12/12] Installing milter-manager-2.0.4...
[12/12] Extracting milter-manager-2.0.4: 100%
Message for ruby-2.0.0.598,1:
 ====
Some of the standard commands are provided as separate ports for ease
of upgrading:

        devel/ruby-gems:        gem - RubyGems package manager
        devel/rubygem-rake:     rake - Ruby Make

And some of the standard libraries are provided as separate ports
since they require extra dependencies:

        databases/ruby-gdbm:    GDBM module
        x11-toolkits/ruby-tk:   Tcl/Tk modules
        japanese/ruby-tk:       Tcl/Tk modules for Japanized Tcl/Tk

Install them as occasion demands.
====
Message for python27-2.7.9:
 =====================================================================

Note that some standard Python modules are provided as separate ports
as they require additional dependencies. They are available as:

bsddb           databases/py-bsddb
gdbm            databases/py-gdbm
sqlite3         databases/py-sqlite3
tkinter         x11-toolkits/py-tkinter

=====================================================================

 では、次に ClamAVを導入します。
最初は、clamav-milterから導入します。

# pkg install clamav-milter
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 9 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        clamav-milter: 0.98.5_1
        libxml2: 2.9.2_2
        curl: 7.39.0_1
        ca_root_nss: 3.17.3_1
        libltdl: 2.4.2.418
        unzoo: 4.4_2
        lha: 1.14i_6
        arj: 3.10.22_4
        arc: 5.21p

The process will require 23 MB more space.
6 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching clamav-milter-0.98.5_1.txz: 100%    3 MB 247.4k/s    00:16
Fetching libxml2-2.9.2_2.txz: 100%  746 kB 254.9k/s    00:03
Fetching curl-7.39.0_1.txz: 100%    1 MB 225.8k/s    00:06
Fetching ca_root_nss-3.17.3_1.txz: 100%  315 kB 322.9k/s    00:01
Fetching libltdl-2.4.2.418.txz: 100%   36 kB  37.3k/s    00:01
Fetching unzoo-4.4_2.txz: 100%   14 kB  14.7k/s    00:01
Fetching lha-1.14i_6.txz: 100%   33 kB  33.7k/s    00:01
Fetching arj-3.10.22_4.txz: 100%  214 kB 219.4k/s    00:01
Fetching arc-5.21p.txz: 100%   48 kB  49.8k/s    00:01
Checking integrity... done (0 conflicting)
[1/9] Installing ca_root_nss-3.17.3_1...
[1/9] Extracting ca_root_nss-3.17.3_1: 100%
[2/9] Installing libxml2-2.9.2_2...
[2/9] Extracting libxml2-2.9.2_2: 100%
[3/9] Installing curl-7.39.0_1...
[3/9] Extracting curl-7.39.0_1: 100%
[4/9] Installing libltdl-2.4.2.418...
[4/9] Extracting libltdl-2.4.2.418: 100%
[5/9] Installing unzoo-4.4_2...
[5/9] Extracting unzoo-4.4_2: 100%
[6/9] Installing lha-1.14i_6...
[6/9] Extracting lha-1.14i_6: 100%
[7/9] Installing arj-3.10.22_4...
[7/9] Extracting arj-3.10.22_4: 100%
[8/9] Installing arc-5.21p...
[8/9] Extracting arc-5.21p: 100%
[9/9] Installing clamav-milter-0.98.5_1...
===> Creating users and/or groups.
Creating group 'clamav' with gid '106'.
Using existing group 'mail'.
Creating user 'clamav' with uid '106'.
Adding user 'clamav' to group 'mail'.
[9/9] Extracting clamav-milter-0.98.5_1: 100%

 本体は自動で導入されているので、特に別々に導入しないでも大丈夫です。

/etc/rc.conf に以下を追加します。
チェック時間を細かくしてみました。

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamav_milter_enable="YES"
clamav_milter_socket_mode="660"
clamav_milter_socket_group="mail"
clamav_freshclam_flags="--daemon-notify=/usr/local/etc/clamd.conf --checks=12 --user=clamav"

折角なので、先に設定ファイルを編集しておきます。
/usr/local/etc/freshclam.conf が設定ファイルです。

# grep -v "^#" freshclam.conf | grep -v '^$'
DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogVerbose yes
LogRotate yes
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror database.clamav.net
NotifyClamd /usr/local/etc/clamd.conf
OnUpdateExecute /usr/local/etc/rc.d/clamav-milter.sh restart

次は、本体のClamAV側の設定ファイルです。

#grep -v "^#" clamd.conf | grep -v '^$'
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 2M
LogTime yes
LogVerbose yes
LogRotate yes
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/db/clamav
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket yes
User clamav
AllowSupplementaryGroups yes
ScanMail yes

同様に、clamav-milter.confの編集です。

#grep -v "^#" clamav-milter.conf | grep -v '^$'
MilterSocket /var/run/clamav/clmilter.sock
FixStaleSocket yes
User clamav
AllowSupplementaryGroups yes
PidFile /var/run/clamav/clamav-milter.pid
ClamdSocket unix:/var/run/clamav/clamd.sock
OnInfected Reject
AddHeader Replace
LogFile /var/log/clamav/clamav-milter.log
LogTime yes
LogVerbose yes
LogInfected Full

サービスを動作させます。

# service clamav-freshclam start
# service clamav-clamd start
# service clamav-milter start

ちょっと事後ですけど、clamav-clamd startでエラーになった場合には、以下の2つを先行して実施してください。
・etc/rc.confにmiltermanagaerを追加する部分と、専用ユーザとグループの追加
です。

問題無く動作したのを確認したところで、milter-managerの方もあげておきます。
まず、/etc/rc.confに追加します。

miltermanager_enable="YES"
miltermanager_uid="milter-manager"
miltermanager_gid="milter-manager"

 上記のように専用のユーザとグループを追加します。

# pw groupadd -n milter-manager -g 333
# pw useradd -n milter-manager -u 333 -g milter-manager -G mail -s /usr/sbin/nologin \
 -d /var/run/milter-manager -c "milter manager"
# service milter-manager start

こんな感じで動き出すと思う。

# milter-test-server -s unix:/var/run/milter-manager/milter-manager.sock
status: accept
elapsed-time: 0.023459 seconds

更に確認。

# milter-manager -u milter-manager --show-config
...
# /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:34
define_milter("clamav-milter") do |milter|
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:42
  milter.connection_spec = "unix:/var/run/clamav/clmilter.sock"
  # default
  milter.description = nil
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:35
  milter.enabled = true
  # default
  milter.fallback_status = "accept"
  # default
  milter.evaluation_mode = false
  # default
  milter.applicable_conditions = []
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:37
  milter.command = "/usr/sbin/service"
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:38
  milter.command_options = "clamav-milter start"
  # default
  milter.user_name = nil
  # default
  milter.connection_timeout = 297.0
  # default
  milter.writing_timeout = 7.0
  # default
  milter.reading_timeout = 7.0
  # default
  milter.end_of_message_timeout = 297.0
end

…のような情報が見れたと思います。

これまでに同様、Postfixの設定を加えます。main.cf の最後に以下を追加しました。

milter_protocol = 6
milter_default_action = accept
milter_mail_macros = {auth_author} {auth_type} {auth_authen}
smtpd_milters = unix:/var/run/milter-manager/milter-manager.sock
milter_command_timeout = 90s
milter_connect_timeout = 60s
milter_connect_macros = j {daemon_name} v {if_name} _

そして、postfixを再起動。

# service postfix restart
postfix/postfix-script: stopping the Postfix mail system
postfix/postfix-script: starting the Postfix mail system

試しにメールを送信してみましょう。

Jan 10 23:57:56 - postfix/submission/smtpd[-]: connect from -[-]
Jan 10 23:57:56 - postfix/submission/smtpd[-]: Anonymous TLS connection established from -[-]:
 TLSv1 with cipher AES256-SHA (256/256 bits)
Jan 10 23:57:56 - postfix/submission/smtpd[-]: A25B79A0EB4: client=-[-], sasl_method=PLAIN, sasl_username=foo
Jan 10 23:57:56 - postfix/cleanup[-]: A25B79A0EB4: message-id=<20150110235801.3314.C6E5597@->
Jan 10 23:57:56 - milter-manager[-]: [statistics] [milter][header][add](30):
 <X-Virus-Scanned>=<clamav-milter 0.98.5 at ->: clamav-milter
Jan 10 23:57:56 - milter-manager[-]: [statistics] [milter][header][add](30):
 <X-Virus-Status>=<Clean>: clamav-milter
Jan 10 23:57:56 - milter-manager[-]: [statistics] [session][header][add](29):
 <X-Virus-Scanned>=<clamav-milter 0.98.5 at ->
Jan 10 23:57:56 - milter-manager[-]: [statistics] [session][header][add](29):
 <X-Virus-Status>=<Clean>
Jan 10 23:57:56 - postfix/qmgr[-]: A25B79A0EB4: from=<->, size=449, nrcpt=1 (queue active)
Jan 10 23:57:56 - postfix/local[-]: A25B79A0EB4: to=<->, orig_to=<->, relay=local, delay=0.17,
 delays=0.16/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jan 10 23:57:56 - postfix/qmgr[-]: A25B79A0EB4: removed
Jan 10 23:57:56 - postfix/submission/smtpd[-]: disconnect from -[-]
Jan 10 23:57:56 - milter-manager[-]: [statistics] [session][end][end-of-message][accept][0.296839](29)
Jan 10 23:57:56 - milter-manager[-]: [statistics] [sessions][finished] 15(+1) 0

動作している様子が見て取れます。
メールのヘッダーに付けた情報も確認しておきます。

X-Virus-Scanned: clamav-milter 0.98.5 at -
X-Virus-Status: Clean

動作できていることをここでも確認することができました。

 動作の確認ができましたのでので、他のmilterアプリも続けて入れてしまいましょう。

SPAM対策

 Greylistingから導入します。
pkgでまず追加後に、portsでオプションつけて入れ直しするパターンで入れることにします。

# pkg install milter-greylist
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%   968 B   1.0k/s    00:01
Fetching packagesite.txz: 100%    5 MB 229.4k/s    00:23
Processing entries: 100%
FreeBSD repository update completed. 23759 packages processed
New version of pkg detected; it needs to be installed first.
The following 1 packages will be affected (of 0 checked):

Installed packages to be UPGRADED:
        pkg: 1.4.3 -> 1.4.4

The process will require 34 kB more space.
2 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching pkg-1.4.4.txz: 100%    2 MB 226.1k/s    00:09
Checking integrity... done (0 conflicting)
[1/1] Upgrading pkg from 1.4.3 to 1.4.4...
[1/1] Extracting pkg-1.4.4: 100%
Message for pkg-1.4.4:
 If you are upgrading from the old package format, first run:

  # pkg2ng
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        milter-greylist: 4.4.3_4

The process will require 255 kB more space.
101 kB to be downloaded.

Proceed with this action? [y/N]: y
Fetching milter-greylist-4.4.3_4.txz: 100%  101 kB 103.9k/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing milter-greylist-4.4.3_4...
[1/1] Extracting milter-greylist-4.4.3_4: 100%
Message for milter-greylist-4.4.3_4:
 ===> IMPORTANT NOTE

    A sample configuration file has been installed in /usr/local/etc/mail
    directory. Copy and edit it to suit your needs before launching
    milter-greylist.

    Add following lines

dnl j,{if_addr},{cert_subject},i,{auth_authen} are already enabled by default
define(`confMILTER_MACROS_HELO', confMILTER_MACROS_HELO``, {verify}'')
define(`confMILTER_MACROS_ENVRCPT', confMILTER_MACROS_ENVRCPT``, {greylist}'')
INPUT_MAIL_FILTER(`greylist', `S=local:/var/milter-greylist/milter-greylist.sock, F=T, T=R:30s')

    to your /etc/mail/<your_host>.mc configuration.

    To run milter-greylist from startup, add miltergreylist_enable="YES"
    in your /etc/rc.conf or your /etc/rc.conf.local

    See /usr/local/share/doc/milter-greylist/README for operation details.
# cd /usr/ports/mail/milter-greylist
# make reinstall clean
# pkg lock milter-greylist
milter-greylist-4.4.3_4: lock this package? [y/N]: y
Locking milter-greylist-4.4.3_4

こんな流れで導入します。
以下はportsでの選択画面です。

導入が終わった後には設定ファイルの修正です。

# cd /usr/local/etc/mail
# cp greylist.conf.sample greylist.conf

設定ファイルは、以下のように編集しました。
「milter-greylist: cannot read dumpfile "/var/milter-greylist/greylist.db"」とかサービスの開始の際にいわれるのですが、原因を考えたけどわからず。
基本、必要な時に書き出されるはずなので、放置にします。

#grep -v '^#' greylist.conf|grep -v '^$'
pidfile "/var/run/milter-greylist.pid"
socket "/var/milter-greylist/milter-greylist.sock" 660
dumpfile "/var/milter-greylist/greylist.db" 640
dumpfreq 1
user "mailnull:mail"
stat ">>/var/milter-greylist/greylist.log" \
      "%T{%Y/%m/%d %T} %d [%i] %f -> %r %S (ACL %A) %Xc %Xe %Xm %Xh\n"
quiet
list "my network" addr { 127.0.0.1/8 }
list "my domain" from { \
        /[.@]example\.jp[> ]*$/ \
}
list "broken mta" addr {   \
        12.5.136.141/32    \ # Southwest Airlines (unique sender)
        12.5.136.142/32    \ # Southwest Airlines
        12.5.136.143/32    \ # Southwest Airlines
        12.5.136.144/32    \ # Southwest Airlines
        12.107.209.244/32  \ # kernel.org (unique sender)
        12.107.209.250/32  \ # sourceware.org (unique sender)
        63.82.37.110/32    \ # SLmail
        63.169.44.143/32   \ # Southwest Airlines
        63.169.44.144/32   \ # Southwest Airlines
        64.7.153.18/32     \ # sentex.ca (common pool)
        64.12.136.0/24     \ # AOL (common pool)
        64.12.137.0/24     \ # AOL
        64.12.138.0/24     \ # AOL
        64.124.204.39      \ # moveon.org (unique sender)
        64.125.132.254/32  \ # collab.net (unique sender)
        64.233.160.0/19    \ # Google
        66.94.237.16/28    \ # Yahoo Groups servers (common pool)
        66.94.237.32/28    \ # Yahoo Groups servers (common pool)
        66.94.237.48/30    \ # Yahoo Groups servers (common pool)
        66.100.210.82/32   \ # Groupwise?
        66.135.192.0/19    \ # Ebay
        66.162.216.166/32  \ # Groupwise?
        66.206.22.82/32    \ # Plexor
        66.206.22.83/32    \ # Plexor
        66.206.22.84/32    \ # Plexor
        66.206.22.85/32    \ # Plexor
        66.218.66.0/23     \ # Yahoo Groups servers (common pool)
        66.218.67.0/23     \ # Yahoo Groups servers (common pool)
        66.218.68.0/23     \ # Yahoo Groups servers (common pool)
        66.218.69.0/23     \ # Yahoo Groups servers (common pool)
        66.27.51.218/32    \ # ljbtc.com (Groupwise)
        66.102.0.0/20      \ # Google
        66.249.80.0/20     \ # Google
        72.14.192.0/18     \ # Google
        74.125.0.0/16      \ # Google
        152.163.225.0/24   \ # AOL
        194.245.101.88/32  \ # Joker.com
        195.235.39.19/32   \ # Tid InfoMail Exchanger v2.20
        195.238.2.0/24     \ # skynet.be (wierd retry pattern, common pool)
        195.238.3.0/24     \ # skynet.be
        195.46.220.208/32  \ # mgn.net
        195.46.220.209/32  \ # mgn.net
        195.46.220.210/32  \ # mgn.net
        195.46.220.211/32  \ # mgn.net
        195.46.220.221/32  \ # mgn.net
        195.46.220.222/32  \ # mgn.net
        195.238.2.0/24     \ # skynet.be (wierd retry pattern)
        195.238.3.0/24     \ # skynet.be
        204.107.120.10/32  \ # Ameritrade (no retry)
        205.188.0.0/16     \ # AOL
        205.206.231.0/24   \ # SecurityFocus.com (unique sender)
        207.115.63.0/24    \ # Prodigy - retries continually
        207.171.168.0/24   \ # Amazon.com
        207.171.180.0/24   \ # Amazon.com
        207.171.187.0/24   \ # Amazon.com
        207.171.188.0/24   \ # Amazon.com
        207.171.190.0/24   \ # Amazon.com
        209.132.176.174/32 \ # sourceware.org mailing lists (unique sender)
        209.85.128.0/17    \ # Google
        211.29.132.0/24    \ # optusnet.com.au (wierd retry pattern)
        213.136.52.31/32   \ # Mysql.com (unique sender)
        216.33.244.0/24    \ # Ebay
        216.239.32.0/19    \ # Google
        217.158.50.178/32  \ # AXKit mailing list (unique sender)
}
list "grey users" rcpt {  \
        user1@example.com \
        user2@example.com \
        user3@example.com \
}
racl whitelist list "my network"
racl whitelist list "my domain"
racl whitelist list "broken mta"
racl whitelist addr ::1
racl whitelist addr fe80::/10
racl greylist list "grey users" delay 30m autowhite 3d
extendedregex
subnetmatch /24
greylist 5m
timeout 12h
autowhite 1w
racl whitelist default

/etc.rc.confは以下を加えました。

miltergreylist_enable="YES"
miltergreylist_runas="mailnull:mail"

サービスを開始します。

# service milter-greylist start

これでひとまずは完了です。

 次に、pamass-milterを入れることにします。以下の流れです。

# pkg install spamass-milter
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
Updating database digests format: 100%

milter-greylist-4.4.3_4 is locked and may not be modified
The following 18 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        spamass-milter: 0.4.0
        spamassassin: 3.4.0_17
        p5-HTTP-Date: 6.02_1
        p5-HTML-Parser: 3.71_1
        p5-HTML-Tagset: 3.20_1
        p5-IO-Socket-SSL: 2.008
        p5-Mozilla-CA: 20130114_1
        p5-Net-SSLeay: 1.66_1
        p5-Socket: 2.016_1
        p5-IO-Socket-IP: 0.35
        gnupg1: 1.4.18_2
        p5-NetAddr-IP: 4.069_2
        p5-Net-DNS: 0.81_1
        p5-Digest-HMAC: 1.03_1
        p5-IO-Socket-INET6: 2.72_1
        p5-Socket6: 0.25_2
        re2c: 0.13.6
        p5-Encode-Detect: 1.01_1

The process will require 12 MB more space.
3 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching spamass-milter-0.4.0.txz: 100%   46 kB  47.2k/s    00:01
Fetching spamassassin-3.4.0_17.txz: 100%  945 kB 193.7k/s    00:05
Fetching p5-HTTP-Date-6.02_1.txz: 100%   14 kB  15.2k/s    00:01
Fetching p5-HTML-Parser-3.71_1.txz: 100%   81 kB  83.3k/s    00:01
Fetching p5-HTML-Tagset-3.20_1.txz: 100%    9 kB  10.2k/s    00:01
Fetching p5-IO-Socket-SSL-2.008.txz: 100%  138 kB 141.3k/s    00:01
Fetching p5-Mozilla-CA-20130114_1.txz: 100%  128 kB 132.0k/s    00:01
Fetching p5-Net-SSLeay-1.66_1.txz: 100%  226 kB 231.4k/s    00:01
Fetching p5-Socket-2.016_1.txz: 100%   39 kB  40.1k/s    00:01
Fetching p5-IO-Socket-IP-0.35.txz: 100%   26 kB  27.4k/s    00:01
Fetching gnupg1-1.4.18_2.txz: 100%    1 MB 217.5k/s    00:05
Fetching p5-NetAddr-IP-4.069_2.txz: 100%   80 kB  81.9k/s    00:01
Fetching p5-Net-DNS-0.81_1.txz: 100%  271 kB 278.1k/s    00:01
Fetching p5-Digest-HMAC-1.03_1.txz: 100%    9 kB   9.6k/s    00:01
Fetching p5-IO-Socket-INET6-2.72_1.txz: 100%   17 kB  17.8k/s    00:01
Fetching p5-Socket6-0.25_2.txz: 100%   17 kB  18.1k/s    00:01
Fetching re2c-0.13.6.txz: 100%  162 kB 165.8k/s    00:01
Fetching p5-Encode-Detect-1.01_1.txz: 100%   66 kB  67.6k/s    00:01
Checking integrity... done (0 conflicting)
[1/18] Installing p5-Socket-2.016_1...
[1/18] Extracting p5-Socket-2.016_1: 100%
[2/18] Installing p5-Socket6-0.25_2...
[2/18] Extracting p5-Socket6-0.25_2: 100%
[3/18] Installing p5-HTML-Tagset-3.20_1...
[3/18] Extracting p5-HTML-Tagset-3.20_1: 100%
[4/18] Installing p5-Mozilla-CA-20130114_1...
[4/18] Extracting p5-Mozilla-CA-20130114_1: 100%
[5/18] Installing p5-Net-SSLeay-1.66_1...
[5/18] Extracting p5-Net-SSLeay-1.66_1: 100%
[6/18] Installing p5-IO-Socket-IP-0.35...
[6/18] Extracting p5-IO-Socket-IP-0.35: 100%
[7/18] Installing p5-Digest-HMAC-1.03_1...
[7/18] Extracting p5-Digest-HMAC-1.03_1: 100%
[8/18] Installing p5-IO-Socket-INET6-2.72_1...
[8/18] Extracting p5-IO-Socket-INET6-2.72_1: 100%
[9/18] Installing p5-HTTP-Date-6.02_1...
[9/18] Extracting p5-HTTP-Date-6.02_1: 100%
[10/18] Installing p5-HTML-Parser-3.71_1...
[10/18] Extracting p5-HTML-Parser-3.71_1: 100%
[11/18] Installing p5-IO-Socket-SSL-2.008...
[11/18] Extracting p5-IO-Socket-SSL-2.008: 100%
[12/18] Installing gnupg1-1.4.18_2...
[12/18] Extracting gnupg1-1.4.18_2: 100%
[13/18] Installing p5-NetAddr-IP-4.069_2...
[13/18] Extracting p5-NetAddr-IP-4.069_2: 100%
[14/18] Installing p5-Net-DNS-0.81_1...
[14/18] Extracting p5-Net-DNS-0.81_1: 100%
[15/18] Installing re2c-0.13.6...
[15/18] Extracting re2c-0.13.6: 100%
[16/18] Installing p5-Encode-Detect-1.01_1...
[16/18] Extracting p5-Encode-Detect-1.01_1: 100%
[17/18] Installing spamassassin-3.4.0_17...
===> Creating users and/or groups.
Creating group 'spamd' with gid '58'.
Creating user 'spamd' with uid '58'.
[17/18] Extracting spamassassin-3.4.0_17: 100%
[18/18] Installing spamass-milter-0.4.0...
[18/18] Extracting spamass-milter-0.4.0: 100%
Message for spamassassin-3.4.0_17:
 ==========================================================================

You should complete the following post-installation tasks:

        1) Read /usr/local/share/doc/spamassassin/INSTALL
           and /usr/local/share/doc/spamassassin/UPGRADE
           BEFORE enabling SpamAssassin for important changes

        2) Edit the configuration in /usr/local/etc/mail/spamassassin,
           in particular /usr/local/etc/mail/spamassassin/init.pre
           You may get lots of annoying (but harmless) error messages
           if you skip this step.

        3) To run spamd, add the following to /etc/rc.conf:
           spamd_enable="YES"

        4) Install mail/spamass-rules if you want some third-party
           spam-catching rulesets

SECURITY NOTE:
By default, spamd runs as root (the AS_ROOT option). If you wish
to change this, add the following to /etc/rc.conf:

        spamd_flags="-u spamd -H /var/spool/spamd"

==========================================================================
Message for spamass-milter-0.4.0:
 ------------------------------------------------------------------------
spamass-milter has been installed, but it must be activated manually.
Please refer to...

  /usr/local/share/doc/spamass-milter/activation.txt

...for details.

You may also want to tweak your spamd rc.subr(8) startup flags to
specify a username to switch credentials to when delivering mail, if
applicable.
------------------------------------------------------------------------

/etc/rc.conf を追加します。

# SpamAssassin
spamd_enable="YES"
spamd_flags="-s /var/log/spamd.log -u spamd -H /var/spool/spam"
spamass_milter_enable="YES"
spamass_milter_flags="-i 127.0.0.1/8,160.16.107.185/32 -f -p /var/run/spamass-milter/spamass-milter.sock"
spamass_milter_user="spamd"
spamass_milter_group="spamd"
spamass_milter_socket_owner="spamd"
spamass_milter_socket_group="mail"
spamass_milter_socket_mode="660"
spamass_milter_localflags="-u spamd -- -u spamd"

ディレクトリの作成とオーナーの付与を行います。

# mkdir /var/run/spamass-milter/
# chown spamd:spamd /var/run/spamass-milter

 続いて、事前実行コマンドとサービスの開始。

# sa-update
# cd /usr/local/etc/mail/spamassassin/
# fetch -o local.cf http://www.flcl.org/~yoh/user_prefs
# service sa-spamd start
Starting spamd.

動作を確認しました。では、milter側も開始するのでコマンドを投入。milter-managerは、たまに引っかかるので、止めてから開始。

# service spamass-milter start
# service milter-manager stop
# service milter-manager start

これで完了。

Jan 11 15:48:30 - spamass-milter[-]: Could not retrieve sendmail macro "i"!. 
 Please add it to confMILTER_MACROS_ENVFROM for better spamassassin results

まだこれって出ているんだね。main.cfに入れているmilterの部分を少し直しました。
上記の例の部分には、修正後の姿になっているので大丈夫かと思う。

 さて、実際にテストメールを作成してみたけど判定してくれているようだ。

Jan 11 16:07:47 - milter-manager[-]: [statistics] [session][header][add](5):
 <X-Spam-Status>=<No, score=0.7 required=13.0 tests=CONTENT_TYPE_PRESENT, 
       FREEMAIL_FROM,QENCPTR1,QENCPTR2,UNPARSEABLE_RELAY,UTF8 autolearn=no        autolearn_force=no version=3.4.0>
Jan 11 16:07:47 - milter-manager[-]: [statistics] [session][header][add](5):
 <X-Spam-Checker-Version>=<SpamAssassin 3.4.0 (2014-02-07) on ->

となっていました。メールのヘッダ部分には。

X-Spam-Status: No, score=3.1 required=13.0 tests=ARIN,CONTENT_TYPE_PRESENT, FREEMAIL_FROM,ONLY1HOPDIRECT,
 ONLY1HOPDIRECTARIN,QENCPTR1,QENCPTR2, RCVD_IN_AHBL,RCVD_IN_AHBL_PROXY,RCVD_IN_AHBL_SPAM,
 RCVD_IN_MSPIKE_H2,UTF8 autolearn=no autolearn_force=no version=3.4.0
X-Spam-Level: ***

のようになっていました。local.cfに追記したね…って話はとりあえず、ここではスキップします。

さて、SPAMメールがやってきたので、中身を見てみました。

X-Spam-Flag: YES
X-Spam-Status: Yes, score=49.0 required=10.0 tests=BODY_URI_ONLY,DYN_BRBL, DYN_CBL,DYN_MISSMID,DYN_RNBL,
DYN_URIBL,DYN_URLSBL,FSL_HELO_BARE_IP_2, MISSING_MID,NOTINCONTENTTYPE,OTHER_RBLJIS,RCVD_IN_AHBL,
RCVD_IN_AHBL_PROXY, RCVD_IN_AHBL_SPAM,RCVD_IN_BL_SPAMCOP_NET,RCVD_IN_BRBL_LASTEXT,RCVD_IN_CBL,
 RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5,RCVD_IN_PSBL,RCVD_IN_RP_RNBL,RCVD_IN_XBL, RCVD_NUMERIC_HELO,
RDNS_DYNAMIC,RIPE_NCC,SAMEHELOBY2HOP,TVD_RCVD_IP, TVD_RCVD_IP4,URIBL_BLOCKED,URIBL_DBL_SPAM,
URIBL_JP_SURBL,URIBL_SBL, URIBL_SBL_A,URIBL_SC_SURBL,URIBL_WS_SURBL,URLBL_RBLJP,
URLRBLJP_DYN autolearn=unavailable autolearn_force=no version=3.4.0
X-Spam-Report:  *  0.0 URIBL_BLOCKED ADMINISTRATOR NOTICE: The query to URIBL was blocked. 
*       See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block *      for more information. *
      [URIs: losm.ru] *  2.5 URIBL_DBL_SPAM Contains a spam URL listed in the DBL blocklist *
      [URIs: losm.ru] *  1.5 URLBL_RBLJP Has URI in url.rbl.jp *      [URIs: losm.ru] *
  0.5 RCVD_IN_XBL RBL: Received via a relay in Spamhaus XBL *      [46.174.220.173 listed in zen.spamhaus.org] *
  0.0 TVD_RCVD_IP Message was received from an IP address *  0.0 TVD_RCVD_IP4 Message was received from an IPv4 address *
  1.0 SAMEHELOBY2HOP No description available. *  0.1 RIPE_NCC Mail from RIPE NCC area (Russia, Italy, Spain...) *
  0.9 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO *
  0.1 URIBL_SBL_A Contains URL's A record listed in the SBL blocklist *      [URIs: losm.ru] *
  0.1 URIBL_SBL Contains an URL's NS IP listed in the SBL blocklist *      [URIs: losm.ru] *
  0.5 RCVD_IN_AHBL RBL: AHBL: sender is listed in BlackList / BlockList *      dnsbl.ahbl.org *
      [39.226.59.230 listed in dnsbl.ahbl.org] *  0.2 RCVD_IN_AHBL_PROXY RBL: AHBL: Open Proxy server in BlackList / *
      BlockList dnsbl.ahbl.org *  0.1 RCVD_IN_AHBL_SPAM RBL: AHBL: Spam Source in BlackList / BlockList *
      dnsbl.ahbl.org *  0.1 RCVD_IN_CBL RBL: Received via a relay in cbl.abuseat.org *
      [Blocked - see <http://cbl.abuseat.org/lookup.cgi?ip=46.174.220.173>] *
  1.3 RCVD_IN_RP_RNBL RBL: Relay in RNBL, *      https://senderscore.org/blacklistlookup/ *
      [46.174.220.173 listed in bl.score.senderscore.com] *  0.5 RCVD_IN_BRBL_LASTEXT RBL: No description available. *
      [46.174.220.173 listed in bb.barracudacentral.org] *  1.7 URIBL_WS_SURBL Contains an URL listed in the WS SURBL blocklist *
      [URIs: losm.ru] *  1.9 URIBL_JP_SURBL Contains an URL listed in the JP SURBL blocklist *      [URIs: losm.ru] *
  0.0 URIBL_SC_SURBL Contains an URL listed in the SC SURBL blocklist *      [URIs: losm.ru] *
  0.5 RCVD_IN_PSBL RBL: Received via a relay in PSBL *      [46.174.220.173 listed in psbl.surriel.com] *
  0.1 RCVD_IN_BL_SPAMCOP_NET RBL: Received via a relay in bl.spamcop.net *
      [Blocked - see <http://www.spamcop.net/bl.shtml?46.174.220.173>] *
  4.1 RCVD_IN_MSPIKE_L5 RBL: Very bad reputation (-5) *      [46.174.220.173 listed in bl.mailspike.net] *
  1.0 MISSING_MID Missing Message-Id: header *  0.0 RCVD_IN_MSPIKE_BL Mailspike blacklisted *
  0.4 RDNS_DYNAMIC Delivered to internal network by host with *      dynamic-looking rDNS *
  0.2 NOTINCONTENTTYPE ! There's no Content-Type header *  1.3 FSL_HELO_BARE_IP_2 No description available. *
  0.5 BODY_URI_ONLY Message body is only a URI in one line of text or for *      an image *
  1.5 OTHER_RBLJIS No description available. *  3.5 DYN_URIBL No description available. *
  3.5 DYN_RNBL No description available. *  3.5 DYN_BRBL No description available. *
  3.5 DYN_URLSBL No description available. *  3.5 DYN_CBL No description available. *
  5.5 URLRBLJP_DYN No description available. *  3.5 DYN_MISSMID No description available.
X-Spam-Level: ************************************************
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on -

しっかりと判定できているようです。

 Procmailを使う

まだ便利で棄てられない

 今回折角maildirに変更するのだし、SPAM用フォルダーに移動して受信しないで済む方法にしたい。
今回もそんな理由でProcmailをローカル配信に利用して振り分けをするつもりです。
#しかしながら、mailbox_transport でdovecot-lmtp で配信していたのに併存させるとどっちが勝つのかな

 また、条件に一致するものはスマホなどにも転送して見れるようにしておきたいなども懲りずに加えます。

 とりあえず、いろんな設定入れちゃったので、一度リブートしてみて、継続的に利用できるかを確認しておくことにします。
…問題なしでした。まず、後でややこしくなった時に、切り分けがしやすくなりました。

mailbox_commandで単純に指定する方法(mailbox)

 Postfixでローカル配信するための設定に変えてみます。
Postfixでは、main.cfに

mailbox_command = /usr/local/bin/procmail

を追加するだけの認識なので、

#pkg install procmail
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        procmail: 3.22_8

The process will require 296 kB more space.
136 kB to be downloaded.

Proceed with this action? [y/N]: y
Fetching procmail-3.22_8.txz: 100%  136 kB 139.6k/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing procmail-3.22_8...
[1/1] Extracting procmail-3.22_8: 100%

のように追加しました。そして、上記を加えて postfixもリロード。

# service postfix reload

で反映します。
 試しにと、あっ…。想定外にmailboxに配信されてしまいました。(というか仕様です)
これは単純ではなさそう。でも、こんなの人口多いはずなので、ちょっと検索するだけで答えは出ます。

mailbox_command = /usr/local/bin/procmail -a "$EXTENSION" DEFAULT=$HOME/Maildir/ MAILDIR=$HOME/Maildir

こんなにすればいいそうだ。
なるほど。うまくいくな。

procmailrcに記載する方法

別の方法で

mailbox_command = /usr/local/bin/procmail -a "$EXTENSION"

と書いて、/usr/local/etc/procmailrcというファイルを設置する。
ここでは、

SHELL=/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$MAILDIR/procmail.log

みたく書いておけば良い。こっちだと、配信された際のログが記録できて便利です。
何にしてもユーザごとに.procmailrcで実施するための方法ではないので、併存する方法を検討したいと思う。

単純には、.forwardを使えるようにし、procmailでmaildirに置く方法は古くて確実な方法かと思う。
でも、ユーザごとに配置するのもなぁ、という感じだし。

上記方法で、/usr/local/etc/procmailrcをわざと書かずに、ユーザのディレクトリに .procmailrc を書く方法にしました。
/rootのように、.procmailrcを書かないままにすると、/var/mail/nobodyとして配信されました。
これはまた不幸な結果。せめてrootになってくれるのならいいのに。

Dovecotのlmtpと.procmailrc

 結局、振り出しに戻り、procmailを単純にインストールし、個人のディレクトリに .procmailrcを置く方法に戻しました。
・mailbox_commandはコメント行に戻して、service postfix reload
・/usr/local/etc/procmailrcを削除
・.forwardには、""|exec /usr/local/bin/procmail""とだけ書く。chmod 600 .fowardで保存
・.procmailrc は、通常のレシピ。chmod 600 で .procmailrcを保存。
 …という感じで、思った通りに転送もできるようになりました。
ただし、転送される際には、バーチャルのドメインではなく、リアル側のサーバのアカウントとして転送されたことがヘッダーでわかるようになっていました。(Delivered-Toがそのアカウントに設定されます)

 ちなみに、.procmailrcには、以下のような転送設定を入れています。
special@example.net から来たメールは、自分でも保存しますが、foo@example.org foo@example.gr.jpにも自動転送しています。

SHELL=/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=$MAILDIR/.procmail.log

:0 H
* ^From[ :].*(special@example.net)
{
:0cw
!       foo@example.org foo@example.gr.jp
:0
$DEFAULT
}

全部を転送すると、抜けてきたDMやSPAMなどが到着してしまうのは不愉快なので、うまくレシピを記述するようにしてください。

 OpenDKIMなど

OpenDKIM

 やっと、ここまで来ました。
sendmailなMilterでは設定していたけど、milter-managerによるPostfix側に移行できるのか不明だけど。

#pkg install opendkim
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.

milter-greylist-4.4.3_4 is locked and may not be modified
The following 4 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        opendkim: 2.9.2_6
        lua52: 5.2.3_3
        unbound: 1.5.1_2
        ldns: 1.6.17_3

The process will require 9 MB more space.
2 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching opendkim-2.9.2_6.txz: 100%  327 kB 334.8k/s    00:01
Fetching lua52-5.2.3_3.txz: 100%  156 kB 159.7k/s    00:01
Fetching unbound-1.5.1_2.txz: 100%    1 MB 237.9k/s    00:07
Fetching ldns-1.6.17_3.txz: 100%  537 kB 275.1k/s    00:02
Checking integrity... done (0 conflicting)
[1/4] Installing ldns-1.6.17_3...
[1/4] Extracting ldns-1.6.17_3: 100%
[2/4] Installing lua52-5.2.3_3...
[2/4] Extracting lua52-5.2.3_3: 100%
[3/4] Installing unbound-1.5.1_2...
===> Creating users and/or groups.
Using existing group 'unbound'.
Using existing user 'unbound'.
[3/4] Extracting unbound-1.5.1_2: 100%
[4/4] Installing opendkim-2.9.2_6...
[4/4] Extracting opendkim-2.9.2_6: 100%
Message for opendkim-2.9.2_6:
 ************************************************************************

In order to run this port, write your opendkim.conf and:

if you use sendmail, add the milter socket `socketspec' in
/etc/mail/<your_configuration>.mc:

INPUT_MAIL_FILTER(`dkim-filter', `S=_YOUR_SOCKET_SPEC_, F=T, T=R:2m')

or if you use postfix write your milter socket `socketspec' in
/usr/local/etc/postfix/main.cf:

smtpd_milters = _YOUR_SOCKET_SPEC_


And to run the milter from startup, add milteropendkim_enable="YES" in
your /etc/rc.conf.
Extra options can be found in startup script.

Note: milter sockets must be accessible from postfix/smtpd;
  using inet sockets might be preferred.

************************************************************************

/etc/rc.confに以下を加えます。

# OpenDKIM
milteropendkim_enable="YES"
milteropendkim_uid="mailnull:mail"
milterdkim_flags="-b s"

Postfix版での記述方法も書かれていますが、milter-managerの連動で書きたいのでちょっと調査。
検索では出てくるので、実績はある感じ。

 とりあえず、以前作成したものを持ち込み。/usr/local/etc/mail/opendkim.confの設定ファイルを編集。

#grep -v ^# opendkim.conf | grep -v ^$
Canonicalization     relaxed/simple
Domain                example.jp
KeyTable               refile:/usr/local/etc/mail/opendkim-KeyTable
LogWhy                yes
Mode                    sv
ReportAddress       foo@example.jp
Selector                example.jp
SendReports          yes
SigningTable         refile:/usr/local/etc/mail/opendkim-SigningTable
Socket                  local:/var/run/milteropendkim/socket
SubDomains          Yes
Syslog                  Yes
SyslogSuccess        yes

これまでに同じく作業。

# mkdir /var/db/opendkim
# chmod 700 /var/db/opendkim
# chown mailnull:mail opendkim

ここに前回作成している2つのファイルを置く。

# chown mailnull:mail *

のように、オーナーを変更。

DNSのレコードは既に記述済みなので、今回は作業なし。
opendkim-KeyTable、opendkim-SigningTable、opendkim-TrustedHostsを作成。
これはこれまで作成したものを持ち込み。

サービスをあげてみます。

#service milter-opendkim start

確認を行ってみます。

#opendkim-testkey -vvv -d example.jp -s example.jp -k /var/db/opendkim/example.jp.private
opendkim-testkey: key loaded from /var/db/opendkim/example.jp.private
opendkim-testkey: checking key 'example.jp._domainkey.example.jp'
opendkim-testkey: key not secure
opendkim-testkey: key OK

 では、milter-managerの再起動とpostfixのreloadを行って、動作確認としてのメールの送信をしてみます。

Jan 12 06:55:46 - milter-manager[-]: [1] [children][error][connection] [4] Failed to connect to
 local:/var/run/milteropendkim/socket: Permission denied: milter-opendkim

あれ。パーミッションがダメ?
ミルターマネージャーでどう見えているかを確認します。

#milter-manager -u milter-manager --show-config
...
# /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:34
define_milter("milter-opendkim") do |milter|
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:42
  milter.connection_spec = "local:/var/run/milteropendkim/socket"
  # default
  milter.description = nil
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:35
  milter.enabled = true
  # default
  milter.fallback_status = "accept"
  # default
  milter.evaluation_mode = false
  # default
  milter.applicable_conditions = []
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:37
  milter.command = "/usr/sbin/service"
  # /usr/local/lib/milter-manager/binding/lib/milter/manager/detector.rb:38
  milter.command_options = "milter-opendkim start"
  # default
  milter.user_name = nil
  # default
  milter.connection_timeout = 297.0
  # default
  milter.writing_timeout = 7.0
  # default
  milter.reading_timeout = 7.0
  # default
  milter.end_of_message_timeout = 297.0
end

うむ、良くわからない。
どうせ、milter-manager以外からは参照しないので、オーナーをmilter-managerに変更した。
/etc/rc.conf を

milteropendkim_uid="milter-manager:milter-manager"

に変更し、

# cd /var/db
# chown -R milter-manager:milter-manager opendkim

のように変更してサービスリスタートしてみました。

Jan 12 08:21:59 - opendkim[-]: C02AD9A0E71: DKIM-Signature field added (s=example.jp, d=example.com)
Jan 12 08:21:59 - milter-manager[-]: [statistics] [milter][header][add](39):
 <DKIM-Signature>=< v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
   s=example.jp; t=1421018519;    bh=-;   h=Date:From:To:Subject;
         -       -         ->: milter-opendkim
Jan 12 08:21:59 - milter-manager[-]: [statistics] [session][header][add](36):
 <DKIM-Signature>=< v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
  s=example.jp; t=1421018519;    bh=-;   h=Date:From:To:Subject;
         -      -         ->

…という感じで流れていきました。メールのヘッダーにも、DKIM-Signatureが付与されていることを確認しました。

sid-milter

 同じ流れで導入します。まだsid-milterはpkgで導入できないみたいだ。
portsから導入します。

# cd /usr/ports/mail/sid-milter
# make install clean

/etc/rc.confに

miltersid_enable="YES"

を入れて、サービスを起動させます。

# service milter-sid start
Starting miltersid.

これは予想できていましたが、

Failed to connect to local:/var/run/sid-filter: Permission denied

となっていました。

#cd /var/run
#mkdir milter-sid
#chown milter-manager:milter-manager milter-sid

のように、フォルダを作成し、オーナを付けて、/etc/rc.confにも

# milter-sid
miltersid_enable="YES"
miltersid_socket="local:/var/run/milter-sid/sid-filter"
miltersid_pid="/var/run/milter-sid/sid-filter.pid"
miltersid_flags="-r 0 -t -u milter-manager"

のように、動作できるように変更追加しました。これでサービスを上げ直して完了です。

opendmarc

 最後にDMARCを入れて終わります。

#pkg install opendmarc
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.

milter-greylist-4.4.3_4 is locked and may not be modified
The following 1 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        opendmarc: 1.3.0_1

The process will require 616 kB more space.
146 kB to be downloaded.

Proceed with this action? [y/N]: y
Fetching opendmarc-1.3.0_1.txz: 100%  146 kB 150.3k/s    00:01
Checking integrity... done (0 conflicting)
[1/1] Installing opendmarc-1.3.0_1...
[1/1] Extracting opendmarc-1.3.0_1: 100%

終わり。
もう mailnull:mailじゃなくて、milter-manager:milter-manager でいいよね、って思ってしまう。

# cd /usr/local/etc/mail
# cp opendmarc.conf.sample opendmarc.conf

同内容を編集します。

#grep -v '^#' opendmarc.conf | grep -v '^$'
BaseDirectory   /var/run/milteropendkim/
HistoryFile     /var/run/milteropendkim/opendmarc.dat
SoftwareHeader  true
Syslog  true

必要なディレクトリを準備します。

#cd /var/run
#mkdir milteropendkim
#chown milter-manager:milter-manager milteropendkim

/etc/rc.confには、

# opendmarc
opendmarc_enable="YES"
opendmarc_pidfile="/var/run/milteropendkim/opendmarc.pid"
opendmarc_socketspec="/var/run/milteropendkim/opendmarc-socket"
opendmarc_runas="milter-manager:milter-manager"

のように設定し、サービスを起動します。

#service opendmarc start
Starting opendmarc.

実際に試してみると、gmailでのヘッダーは、

Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of - designates - as permitted sender) smtp.mail=-;
       dkim=pass header.i=@example.com;
       dmarc=pass (p=NONE dis=NONE) header.from=example.com

のようにpassになっていました。

 SPAM判定したメールをMaildirの別フォルダに保存する

 さて、本命にしていたSPAMメールをDISCARDせずに一定期間SPAM判定用フォルダに入れて、一定時間で自動削除するようにしたい。
これに着手します。

 このページが巨大化してきたので、少し気が引けますが、このまま記述していきます。
上記で作成している .procmailrcに以下を加えます。

:0
* ^X-Spam-Status: Yes
$DEFAULT/.SPAM/

SpamAssassinで有罪判決を受けたメールは、.SPAMフォルダ以下に配信されます。

% cd Maildir/.SPAM 
% ll
total 12
drwx------  2 foo  foo  512 Jan 13 05:32 cur/
drwx------  2 foo  foo  512 Jan 14 04:30 new/
drwx------  2 foo  foo  512 Jan 14 04:30 tmp/

このフォルダ以下にあるファイルは、一ヶ月で削除したいので、設定を加えます。
各ユーザが勝手に削除されても困るので、/etc/crontab側を使用し、

### USER AREA ###
0       4       *       *       *       foo /usr/bin/find /home/foo/Maildir/.SPAM/ -mtime +30 -name "*.HOST.example.jp" | xargs rm -f

のようにしました。
もちろん、通常のメールも無限に置かれても困るので、通常側のフォルダにも適用想定です。

現状、milter-greylistですべて入り口で拒絶できているので、SPAMが中に入ってきていません。優秀だな…(S25R)。

 maildir形式の初期ファイル

 maildir形式は何年かぶりなので、メモの残さないと忘れてしまいそうです。
既に非公開になっているページを見て、必要なものだけを追加。

 まず、adduserなどで/home以下に配置されるデフォルトのファイルについてを書きます。
FreeBSDでは、/usr/share/skel/以下にファイルがあります。

#cd /usr/share/skel 
#ll
total 32
-rw-r--r--  1 root  wheel  967 Jul 11  2014 dot.cshrc
-rw-r--r--  1 root  wheel  251 Jul 11  2014 dot.login
-rw-r--r--  1 root  wheel  162 Jul 11  2014 dot.login_conf
-rw-------  1 root  wheel  378 Jul 11  2014 dot.mail_aliases
-rw-r--r--  1 root  wheel  335 Jul 11  2014 dot.mailrc
-rw-r--r--  1 root  wheel  747 Jul 11  2014 dot.profile
-rw-------  1 root  wheel  280 Jul 11  2014 dot.rhosts
-rw-r--r--  1 root  wheel  977 Jul 11  2014 dot.shrc

ここにMaildirのフォルダを準備しておけば良いだけです。

#mkdir Maildir
#chmod 700 Maildir/

のように準備しておきます。
また、今回のように、転送などレシピを追加できるようにdot.procmailrcやdot.forwardも加えておきました。

drwx------  2 root  wheel  512 Jan 12 21:29 Maildir/
-rw-r--r--  1 root  wheel  967 Jul 11  2014 dot.cshrc
-rw-------  1 root  wheel   32 Jan 12 21:31 dot.forward
-rw-r--r--  1 root  wheel  251 Jul 11  2014 dot.login
-rw-r--r--  1 root  wheel  162 Jul 11  2014 dot.login_conf
-rw-------  1 root  wheel  378 Jul 11  2014 dot.mail_aliases
-rw-r--r--  1 root  wheel  335 Jul 11  2014 dot.mailrc
-rw-------  1 root  wheel  289 Jan 12 21:31 dot.procmailrc
-rw-r--r--  1 root  wheel  747 Jul 11  2014 dot.profile
-rw-------  1 root  wheel  280 Jul 11  2014 dot.rhosts
-rw-r--r--  1 root  wheel  977 Jul 11  2014 dot.shrc

 既存のユーザでmailboxにメールが残っているIDは、移行して来なければなりません。
全部削除してもらうか、全部新規扱いになってしまうことをあらかじめ伝えておき、対応するのが良さそうです。

 まず、過去のmailboxのものを変換するためのツールを入れます。

#pkg install mb2md
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.

milter-greylist-4.4.3_4 is locked and may not be modified
The following 2 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        mb2md: 3.20_1
        p5-TimeDate: 2.30_2,1

The process will require 141 kB more space.
49 kB to be downloaded.

Proceed with this action? [y/N]: y
Fetching mb2md-3.20_1.txz: 100%   14 kB  14.7k/s    00:01
Fetching p5-TimeDate-2.30_2,1.txz: 100%   34 kB  35.5k/s    00:01
Checking integrity... done (0 conflicting)
[1/2] Installing p5-TimeDate-2.30_2,1...
[1/2] Extracting p5-TimeDate-2.30_2,1: 100%
[2/2] Installing mb2md-3.20_1...
[2/2] Extracting mb2md-3.20_1: 100%

では、早速使ってみます。

#mb2md -s /var/mail/foo -d /home/foo/Maildir
Converting /var/mail/foo to maildir: /home/foo/Maildir
Source Mbox is /var/mail/foo
Target Maildir is /home/foo/Maildir
50 messages.

Maildir/cur にrootのパーミッションで作成されたので、Maildir/new に移動し、オーナーをfooに変更し、chmod 600に変更します。
また、Maildir 以下の各ディレクトリもオーナーが違うので、chmod -R foo *などで合わせておくようにします。
シンプルな動作で良い感じです。

 IMAP

 やっと週末が来ましたので再開です。
設定は、最初から入っていたので、pf.confなどのフィルタで143なり993を開けます。
WindowsからBecky!で受信するとエラー。

Jan 16 21:53:35 imap-login: Info: access(tcpwrap): Client refused (rip=-)
Jan 16 21:56:34 imap-login: Info: access(tcpwrap): Client refused (rip=-)

確かに。

imap:   .jp : allow
imap: ALL : deny

imaps: .jp : allow
imaps: ALL : deny

のように、限定してあけておくことにしました。海外にお出かけするときには、もうちょい条件を緩やかに加えて使うつもり。

IMAPS接続すると、ちゃんとSPAM用のフォルダが見えていました。
最初からフィルタリングされているので良い感じです。

 その他

Windows Liveメール

むちゃ、嫌いなんですけど、ユーザが多いので対応するしかないんです。
受信はできるのに送信できない…というクレームが何件か。
以下のように表示されるみたいだ。

メッセージを送信できませんでした。電子メールを送信する [SMTP] サーバーを設定する必要があります。
~ のサーバー設定を見つけるには、メール サービス プロバイダーに連絡してください。

件名 'テスト'
サーバー エラー: 554
サーバーの応答: 554 5.7.1 <->: Recipient address rejected: Access denied
サーバー: '-'
Windows Live メール エラー ID: 0x800CCC79
プロトコル: SMTP
ポート: 587
セキュリティ (SSL): はい

 Dovecotで、auth_mechanisms = plain loginのように特別待遇してあげてもダメでどこが原因か検索しまくり。
どこを参照したのかわからなくなったけど。

結局、Postfixに方言的な対応をしてあげていけました。mail.cfで

broken_sasl_auth_clients = yes

を加えてあげて、

# service postfix reload

でいけました。マイクロソフトのための設定を毎回気にしなければならないのが、なんともむかつきます。

Procmailのログファイルが肥大化するのを以下のうちに考慮したいと思います。
/etc/newsyslog.conf.dのディレクトリに、procmaillogというファイルを置きました。

#       logfilename     [owner:group]   mode    count   size    when    flags   [/pid_file]     [sig_num]
/home/*/Maildir/.procmail.log   600     4       100     $W0D12  Z

のようにしてみました。こんな感じでうまくいくのか試してみようと思っています。


【改訂履歴】

作成:2015/01/04 更新日: 2015/01/25


【参照ページ】

Maildir形式で運用する2つの方法
Procmail - setup with postfix/Installing and Setting up Procmail
milter managerリファレンスマニュアル FreeBSDへインストール - milter manager

How to run Postfix with OpenDKIM on FreeBSD 9.0
いろいろな覚え書き ENMA, dkim-milter, milter manager で DKIM

 
Copyright © 1996,1997-2006,2007- by F.Kimura,