ライン

ポイント:慣れれば簡単に扱えそう

ライン

 はじめに

sendmailを使わない選択

 Linuxから始めたPC UNIX。1994年から触り始めて既に15年を超えました。
その間、MTAを sendmailから始まり、qmail, postfix, exim も使っていましたが、最終的にはsendmailに戻っていました。

 しかし、いつまでもということにはならないと思いますし、思い出すつもりでPostfixを導入設定してみることにしました。

 導入

 portsで導入することにします。

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

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

初期は、PCREのみに選択があります。

今回は、SASL2, DOVECOT, TLS, INST_BASE に選択を行い、導入を進めることにしました。
当初は Dovecot 2で導入してみましたが、どうもいまいち設定が思ったようにいきませんでした。
知っているバージョンで落ち着いているのがいいので、戻してやり直しています。
INST_BASEは、/usr/local/etcに設定ファイルを持つのではなく、/etc/postfixに作成される形となります。
私もFreeBSDでは行ったことのない設定なので、ちょっと楽しみです。
SASL2の選択画面は、表示されたそのままで進めます。

 完了したら、その先に導入を実施します。

# make install clean

ここで、Dovecot の導入も開始されます。
 その後、Postfixの導入が再開されます。

SIEVEは前回利用しなかったので、外して導入をする方針にしました。

今回も、SSL/TLSとAPOPという流れで導入してみたいと思っています。

===>   postfix-base-2.7.2,1 depends on shared library: pcre.0 - found
===>   postfix-base-2.7.2,1 depends on shared library: sasl2.2 - found
===>   Generating temporary packing list
===>  Checking if mail/postfix already installed
Added group "postfix".
Added group "maildrop".
Added user "postfix".
You need user "postfix" added to group "mail".
Would you like me to add it [y]? y
..
..

    Warning: you still need to edit myorigin/mydestination/mynetworks
    parameter settings in /etc/postfix/main.cf.

    See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html
    for information about dialup sites or about sites inside a
    firewalled network.

    BTW: Check your /etc/aliases file and be sure to set up aliases
    that send mail for root and postmaster to a real person, then
    run /usr/bin/newaliases.

install  -o root -g wheel -m 555 /usr/ports/mail/postfix/work/postfix-2.7.2/auxiliary/rmail/rmail /usr/bin/rmail
install  -o root -g wheel -m 555 /usr/ports/mail/postfix/work/postfix-2.7.2/auxiliary/qshape/qshape.pl /usr/bin/qshape
install  -o root -g wheel -m 444 /usr/ports/mail/postfix/work/postfix-2.7.2/man/man1/qshape.1 /usr/share/man/man1
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y

# Fix compressed man pages
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/etc/sasldb* file(s) readable by group mail (this should
be the default for new installs).

If you are upgrading from postfix version prior to 2.0, please see the README
files for recommended changes to your configuration.
===> Installing early rc.d startup script(s)
===>   Compressing manual pages for postfix-base-2.7.2,1
===>   Registering installation for postfix-base-2.7.2,1
===> SECURITY REPORT:
      This port has installed the following binaries which execute with
      increased privileges.
/usr/sbin/postqueue
/usr/sbin/postdrop

      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/libexec/postfix/trivial-rewrite
/usr/libexec/postfix/pipe
/usr/libexec/postfix/discard
/usr/libexec/postfix/virtual
/usr/libexec/postfix/smtp
/usr/libexec/postfix/oqmgr
/usr/libexec/postfix/spawn
/usr/libexec/postfix/local
/usr/libexec/postfix/flush
/usr/libexec/postfix/proxymap
/usr/libexec/postfix/master
/usr/libexec/postfix/lmtp
/usr/libexec/postfix/smtpd
/usr/libexec/postfix/scache
/usr/libexec/postfix/qmgr
/usr/libexec/postfix/pickup
/usr/libexec/postfix/verify
/usr/libexec/postfix/nqmgr
/usr/libexec/postfix/showq
/usr/libexec/postfix/tlsmgr
/usr/libexec/postfix/error
/usr/libexec/postfix/bounce
/usr/libexec/postfix/qmqpd
/usr/libexec/postfix/anvil
/usr/libexec/postfix/cleanup

      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
/etc/rc.d/postfix

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage:
http://www.postfix.org/

===>  Cleaning for pcre-8.11
===>  Cleaning for cyrus-sasl-2.1.23_1
===>  Cleaning for dovecot-1.2.16
===>  Cleaning for postfix-base-2.7.2,1
# 

 導入は完了です。
上記に書かれている通りですが、
(1) /etc/rc.conf に追加

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

を加える。
そして、
(2) /etc/periodic.conf を新規作成し、以下を追加

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

 まずはこれを完了させる。
次に、POP/IMAP用に Dovecotを導入しているので、

dovecot_enable = "YES"

を追加する。

 さて、この後は設定とテストを行うことにしましょう。

 設定

postfix(基本)

 まずはシンプルに、マルチドメインにせず、普通にシングルドメインでの設定を行うことにしました。
(1) main.cf

# cd /etc/postfix/
# ll
total 76
-rw-r--r--  1 root  wheel  11942 Jan  9 20:44 LICENSE
-rw-r--r--  1 root  wheel   1629 Jan  9 20:44 TLS_LICENSE
-rw-r--r--  1 root  wheel   3548 Jan  9 20:44 bounce.cf.default
-rw-r--r--  1 root  wheel  25971 Jan  9 20:44 main.cf
-rw-r--r--  1 root  wheel  23807 Jan  9 20:44 main.cf.default
-rw-r--r--  1 root  wheel   1877 Jan  9 20:44 makedefs.out
-rw-r--r--  1 root  wheel   5433 Jan  9 20:44 master.cf

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

# cp -p main.cf main.cf.orig

 最初にデフォルトのコピーをとっておきました。
まずは、以下2行を加えました。

myhostname = ns.example.co.jp
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases

 これでどのような動きになるかを確認しようと思います。
※私は、この時点で動作中のsendmailをとめておくのを忘れていました。先に停止させておいてください。

# /etc/rc.d/postfix start

 特に問題なく起動できているようです。
 テストメール(ローカル同士)を投げてみました。
失敗1) "mail for localhost:xxx loops back to myself"
失敗2) "fatal: open database /etc/aliases.db: No such file or directory"

 これでなんとかローカルへの配送は問題なし。/home/ユーザ名 以下にMaildir のディレクトリも正常に作成されていました。
徐々に思い出してきた。

# postconf -n

とすると、現在の設定が表示されるんだったよな。
過去の備忘録を再度チェック。なるほど。以前は、JUNK MAIL CONTROLS とかも指定していたんだっけ。
とりあえずは、後回し。

 先に、メールのPOP受信を確認することにします。

Devecot

 設定ファイルは、/usr/local/etc/dovecot.confとして導入されています。

# cp -p dovecot.conf dovecot.conf.orig

 設定ファイルを加工しましょう。
まず、ログのpath設定を変更します。
次に、プロトコル。後でウェブメール等を行う際には、IMAPを加える予定です。
SSL関連は、今回は最初から入れて書くことにします。
今回はAPOPに加え、Becky!もサポートしている CRAM-MD5を加えてみます。

 以下が、追加した内容です。

log_path = /var/log/dovecot.log
protocols = pop3 pop3s
ssl = yes
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
mechanisms = plain login apop cram-md5
mail_location = maildir:~/Maildir

  passdb passwd-file {
    args = /usr/local/etc/dovecot.auth
  }

SSLのためのキーの設定をやっておきます。

# mkdir -p /etc/ssl/private
# mkdir -p /etc/ssl/certs
# cd /usr/ports/mail/dovecot/
# make patch
# cd work/dovecot-*/doc
# 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

後は、/usr/local/etc/dovecot.authを準備さえすれば、起動はできるようになりました。
1.x 系には存在する dovecotpw を使って設定してみることにします。

usage: dovecotpw [-l] [-p plaintext] [-s scheme] [-u user] [-V]
    -l            List known password schemes
    -p plaintext  New password
    -s scheme     Password scheme
    -u user       Username (if scheme uses it)
    -V            Internally verify the hash

# dovecotpw -l
CRYPT MD5 MD5-CRYPT SHA SHA1 SHA256 SMD5 SSHA SSHA256 PLAIN CLEARTEXT CRAM-MD5 HMAC-MD5
 DIGEST-MD5 PLAIN-MD4 PLAIN-MD5 LDAP-MD5 LANMAN NTLM OTP SKEY RPA
# dovecotpw -p panda
{CRAM-MD5}b45d22f1f1e022f169b296fdb5b0b307fc55194556c0f836b2a02b7fc107cf67

/usr/local/etc/dovecot.auth に上記の内容を入れてみます。

foo:{PLAIN}panda
foo:{CRAM-MD5}b45d22f1f1e022f169b296fdb5b0b307fc55194556c0f836b2a02b7fc107cf67

APOPでも、CRAM-MD5でもPOP受信できることが確認できました。

 次に、SSLの受信を試します。
まず、PAMのプレーンテキスト要求をしてみます。

エラーになりました。これは今回そうなるように設定したので正しい動作。
次に、POPSを指定して受信します。
メッセージが変わりました。
上記、設定を入れて再度受信してみることにしました。
Jan 10 09:54:15 pop3-login: Info: Login: user=<bar>, method=PLAIN, rip=192.168.0.50, lip=192.168.1.200, TLS
Jan 10 09:54:15 POP3(bar): Info: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
ログ上も問題なく処理できていることを確認できました。

 POP Before SMTPも前回に同じく設定しようと思ったのですが、折角セキュアなのでやめることにしました。
導入と設定方法は、前回記述しているので、このページの上部にあるリンクで必要な方はご参照ください。

postfix(送信)

 では、次にSMTP認証での送信を確認することにします。
ここでも、MUAはBecky! から実施する前提です。

 Cyrus SASL Ver.2は既に導入済み。
cyrus-sasl2-saslauthd を追加導入するところから始めます。

# cd  /usr/ports/security/cyrus-sasl2-saslauthd
# make install clean

 導入を開始します。

この状態のまま導入を進めます。

比較的すぐに導入は完了します。

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

saslauthd_enable="YES"
#saslauthd_flags="-a pam -n 2"

次に、"pwcheck_method: saslauthd" を記述した以下を作成します。

# cp -p /usr/local/lib/sasl2/Sendmail.conf /usr/local/lib/sasl2/smtpd.conf
# cp -p master.cf master.cf.orig

Postfixの設定ファイルに以下を加えます。(main.cf)

smtpd_recipient_restrictions = permit_mynetworks,
        permit_sasl_authenticated
        reject

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = cyrus
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

master.cf の以下はデフォルトコメント化されていますので、これを外す必要があります。
(設計変更後は、postfixのリスタートを入れます)

#submission inet n       -       n       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       n       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

 "when SASL type is "dovecot", SASL path "smtpd" should be a socket pathname" というエラーが出ていました。
main.cf に "smtpd_sasl_type = cyrus" を加えたら通りました。

 まだ、問題が残りました。送信するたびに、syslog(maillog)上に、"OTP unavailable because can't read/write key database /etc/opiekeys: Permission denied" が残るようになりました。
 これは機知の話のようで、ネット検索すると結構出てきます。 security/cyrus-sasl2 のOTPを外して導入していれば発生しない問題みたいなので、コンパイルし直しました。該当ディレクトリ上で make configして、設定を変更して入れ直せば完了です。
確認しましたが、発生しなくなりました。

 次は、通信のSSL化(TLS)の設定です。
これも前回実施しているのですが、今回も設定を入れます。
 master.cf を再度確認します。

smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

このような感じになっているかを確認。

main.cf 上に、TLSに関する情報を追加。
Dovecotで生成したSSLのキーはそのまま利用することにしました。

smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s

これらを加えて、postfix をrestart。
問題なく、うまく通信できるようになったことを確認できました。

 アンチウィルス、SPAM対策

アンチウィルス

 今回は、ClamSMTP Using with Postfixで導入設定するか、MILTER方式で実施するかなどを検討。
以前作成した環境は前者でした。

 考えた結果、今回はMilter方式でやってみることにしました。milter-managerを入れて楽して設定を試したい予定です。
 まず、portsで導入を開始します。

# cd /usr/ports/security/clamav
# make install clean

milterを指定して導入を行います。

デフォルト表示から、MILTERを追加指定して導入。
関連するportsでも確認画面が表示されます
今回は、IPv6を外して先に進めました。

後は選択画面は表示されることなく終了しました。

===>  Cleaning for python26-2.6.6
===>  Cleaning for libcheck-0.9.8
===>  Cleaning for libltdl-2.2.10
===>  Cleaning for arc-5.21o_1
===>  Cleaning for arj-3.10.22_4
===>  Cleaning for lha-1.14i_6
===>  Cleaning for unzoo-4.4_2
===>  Cleaning for clamav-0.96.5_1

通常と同じように、/etc/rc.conf に必要なものを加えます。

clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamav_milter_enable="YES"

のようにまずは普通に指定。
/usr/local/etc にあるそれぞれの設定ファイルの指定。
clamd.conf を確認。

# grep -v ^# clamd.conf | grep -v ^$
LogFile /var/log/clamav/clamd.log
LogTime yes
LogVerbose 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

freshclam.conf を確認。

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

clamav-milter.conf を確認。

#grep -v ^# /usr/local/etc/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-milter.log
LogTime yes
LogVerbose yes
LogInfected Full

 次に、/etc/rc.conf に更に追加した内容。
この辺りは、milter-managerのページを参照して値を決めています。

clamav_milter_socket_mode="660"
clamav_milter_socket_group="mail"

 clam-milter用にログの準備をしておきます。 

# touch /var/log/clamav-milter.log
# chown clamav:clamav /var/log/clamav-milter.log
# chmod 660 /var/log/clamav-milter.log

 milter managerを導入します。
最新版は 1.6.2ですが、portsでは 1.4.2までの追従のようです。
何かの理由があって追わない?安定版だけど、何か問題でもあるのだろうか。

# cd /usr/ports/mail/milter-manager 
# make install clean
===>  Cleaning for ruby18-glib2-0.90.5
===>  Cleaning for intltool-0.41.1
===>  Cleaning for pkg-config-0.25_1
===>  Cleaning for glib-2.26.1_1
===>  Cleaning for gio-fam-backend-2.26.1
===>  Cleaning for rubygem-pkg-config-1.0.7_1
===>  Cleaning for p5-XML-Parser-2.40
===>  Cleaning for gamin-0.1.10_4
===>  Cleaning for ruby18-gems-1.3.7
===>  Cleaning for rubygem-rake-0.8.7
===>  Cleaning for expat-2.0.1_1
===>  Cleaning for milter-manager-1.4.2

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

miltermanager_enable="YES"

 専用のユーザとグループを必要とするみたいだけど、詳細portsは面倒を見てくれない。
以下のように(適当に)作成してみた。

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

起動し、以下を確認してみる。

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

問題なさそうだ。
更に確認してみる。

# milter-manager -u milter-manager --show-config
package.platform = "freebsd"
package.options = nil

security.privilege_mode = true
security.effective_user = "milter-manager"
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("clamav-milter") do |milter|
  milter.connection_spec = "unix:/var/run/clamav/clmilter.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/clamav-milter"
  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

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 = 150s

いろんなサイトの寄せ集め情報みたいな感じですが。
postfixを再起動。

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

Jan 11 21:11:58 ns postfix/smtpd[99886]: connect from * [*]
Jan 11 21:11:58 ns milter-manager[92950]: [statistics] [session][start](9)
Jan 11 21:11:58 ns milter-manager[92950]: [statistics] [milter][start](10): clamav-milter
Jan 11 21:11:59 ns postfix/smtpd[99886]: setting up TLS connection from *[*]
Jan 11 21:11:59 ns postfix/smtpd[99886]: Anonymous TLS connection established from *[*]: TLSv1 with cipher AES128-SHA (128/128 bits)
Jan 11 21:11:59 ns postfix/smtpd[99886]: 2CBB839830: client=* [*], sasl_method=LOGIN, sasl_username=foo
Jan 11 21:11:59 ns postfix/cleanup[99889]: 2CBB839830: message-id=<20110111211202.DB39.403745C8@example.co.jp>
Jan 11 21:11:59 ns milter-manager[92950]: [statistics] [milter][header][add](10): <X-Virus-Scanned>=<clamav-milter 0.96.5 at ns.example.co.jp>: clamav-milter
Jan 11 21:11:59 ns milter-manager[92950]: [statistics] [milter][header][add](10): <X-Virus-Status>=<Clean>: clamav-milter
Jan 11 21:11:59 ns milter-manager[92950]: [statistics] [session][header][add](9): <X-Virus-Scanned>=< clamav-milter 0.96.5 at ns.example.co.jp>
Jan 11 21:11:59 ns milter-manager[92950]: [statistics] [session][header][add](9): <X-Virus-Status>=< Clean>
Jan 11 21:11:59 ns postfix/qmgr[99851]: 2CBB839830: from=<foo@example.co.jp>, size=691, nrcpt=1 (queue active)
Jan 11 21:11:59 ns postfix/local[99890]: 2CBB839830: to=<bar@example.co.jp>, relay=local, delay=0.43, delays=0.43/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jan 11 21:11:59 ns postfix/qmgr[99851]: 2CBB839830: removed
Jan 11 21:11:59 ns milter-manager[92950]: [statistics] [session][end][end-of-message][accept][0.658568](9)
Jan 11 21:11:59 ns postfix/smtpd[99886]: disconnect from * [*]
Jan 11 21:11:59 ns milter-manager[92950]: [statistics] [milter][end][end-of-message][accept][0.00551026](10): clamav-milter

うまくいっているようです。
ここまでメールログ(syslogのmail.info)に残るのはうるさいけど。
なかなかいいな、milter-manager。もう少しportsを使いやすくしてもらいたいけど。

 設定ファイルは、/usr/local/etc/milter-manager 以下に作成されていました。
なるほど、先ほどの show-configの内容が現時点なので、修正したい場合にはここに記述し直せばいいんだな。

SPAM対策

 今回は、Procmail入れて Bogofilter…みたいなことはせずに、SpamAssassin Milter (mail/spamass-milter) でおおざっぱな判定とフラグを付ける程度にしようと思います。
 自分の通常使っているメールアドレスだったら徹底してやるんでしょうが、他のユーザもいるサイトだと緩和している程度がちょうどいいし。

 早速導入を開始します。詳細は、SpamAssassin Milterメモを参考にどうぞ。

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

関連する選択画面に対応していきます。

GNU Pth?何のツールだろう。
デフォルトで進める
これも、デフォルト。
IPv6を外しただけで、その他はデフォルト値。
これも、デフォルト。
これも、デフォルト。
把握していないで、いろんなものを一緒に入れてしまうのもどうかと思うけど…。
これも、デフォルトで導入を進める。
IPv6を外す。
やっと本題という感じ。
RELAY_COUNTRYを選択。後はデフォルトのまま。
過去にこんな選択画面あっただろうか。とりあえず、デフォルトのままで進めた。

一応正常終了。/etc/rc.conf に追加が必要な物を先に指定する。

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,XXX.YYY.ZZZ.NNN/MM -f -p /var/run/spamass-milter/spamass-milter.sock"
spamass_milter_user="spamd"
spamass_milter_group="spamd"
spamass_milter_socket="/var/run/spamass-milter/spamass-milter.sock"
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/spamss-milter/
# chown spamd:spamd /var/run/spamss-milter

newsyslog.conf とかにも併せていろいろ加えているけど、ここでは割愛。

 さて、起動させるとどこかで見たエラーに再遭遇。

exited or timed out without signaling production of a PID file: exit 255 at /usr/local/bin/spamd line 2588.

この不親切なエラーは前にも出たけど、ページに書かれていないな。
どこかのブログメモにしたんだろうか。

# sa-update

これを入れてから実行すれば後は大丈夫…というやつだったよな。
はい、あがってきました。

spamass_milter側も正常に起動。
 では、前回に続き確認してみます。

# milter-manager -u milter-manager --show-config
failed to create custom configuration directory: /nonexistent/.milter-manager: No such file or directory
package.platform = "freebsd"
package.options = nil

security.privilege_mode = true
security.effective_user = "milter-manager"
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("clamav-milter") do |milter|
  milter.connection_spec = "unix:/var/run/clamav/clmilter.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/clamav-milter"
  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("spamass-milter") do |milter|
  milter.connection_spec = "unix:/var/run/spamass-milter.sock"
  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/spamass-milter"
  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

よさげではないでしょうか。気になるところはあるけれど、それは後でも対応できるので、先に進める。
tlec.linux.or.jpがつながらないね。ウェブサーバのクラッシュ中なんですか。
知りませんでした。
http://www.flcl.org/~yoh/user_prefs
というところにあるんですね。ご本人が喜ばれないと思うので、リンクにはしていませんけど。

# cd /usr/local/etc/mail/spamassassin
# fetch -o local.cf http://www.flcl.org/~yoh/user_prefs

いただきました。ありがとうございます。

 さて、入れたのにうまく動作しないと思ったら、milter-manager のリスタートがいるのですね。

Jan 12 00:14:24 ns postfix/smtpd[87661]: connect from mail-iw0-f176.google.com[209.85.214.176]
Jan 12 00:14:24 ns milter-manager[87659]: [statistics] [session][start](1)
Jan 12 00:14:24 ns milter-manager[87659]: [statistics] [milter][start](2): clamav-milter
Jan 12 00:14:24 ns milter-manager[87659]: [statistics] [milter][start](3): spamass-milter
Jan 12 00:14:25 ns postfix/smtpd[87661]: setting up TLS connection from mail-iw0-f176.google.com[209.85.214.176]
Jan 12 00:14:25 ns postfix/smtpd[87661]: Anonymous TLS connection established from mail-iw0-f176.google.com[209.85.214.176]: TLSv1 with cipher RC4-MD5 (128/128 bits)
Jan 12 00:14:25 ns spamass-milter[87549]: Could not retrieve sendmail macro "i"!.  Please add it to confMILTER_MACROS_ENVFROM for better spamassassin results
Jan 12 00:14:25 ns postfix/smtpd[87661]: 00ED539830: client=mail-iw0-f176.google.com[209.85.214.176]
Jan 12 00:14:26 ns postfix/cleanup[87665]: 00ED539830: message-id=
Jan 12 00:14:26 ns milter-manager[87659]: [statistics] [milter][header][add](2): <X-Virus-Scanned>= <clamav-milter 0.96.5 at ns.example.co.jp>: clamav-milter
Jan 12 00:14:26 ns milter-manager[87659]: [statistics] [milter][header][add](2): <X-Virus-Status>= <Clean>: clamav-milter
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [milter][header][add](3): <X-Spam-Status>= <No, score="1.7" required="13.0" tests="CONTENT_TYPE_PRESENT,
" DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE, ISO2022JP_BODY,MULTIPART_ALTERNATIVE,QENCPTR1,QENCPTR2,
RFC_ABUSE_POST, T_TO_NO_BRKTS_FREEMAIL,UNPARSEABLE_RELAY autolearn="no" version="3.3.1" />: spamass-milter
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [milter][header][add](3):  <X-Spam-Level>=<*>: spamass-milter
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [milter][header][add](3):  <X-Spam-Checker-Version>= <SpamAssassin 3.3.1 (2010-03-16) on ns.example.co.jp>: spamass-milter
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [session][header][add](1): <X-Virus-Scanned>=< clamav-milter 0.96.5 at ns.example.co.jp>
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [session][header][add](1): <X-Virus-Status>=< Clean>
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [session][header][add](1): <X-Spam-Status>=< No, score=1.7 required=13.0 tests=CONTENT_TYPE_PRESENT,
     DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,        ISO2022JP_BODY,MULTIPART_ALTERNATIVE,QENCPTR1,QENCPTR2,
RFC_ABUSE_POST,  T_TO_NO_BRKTS_FREEMAIL,UNPARSEABLE_RELAY autolearn=no version=3.3.1>
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [session][header][add](1): <X-Spam-Level>=< *>
Jan 12 00:14:30 ns milter-manager[87659]: [statistics] [session][header][add](1): <X-Spam-Checker-Version>=< SpamAssassin 3.3.1 (2010-03-16) on ns.example.co.jp>
Jan 12 00:14:30 ns postfix/qmgr[87410]: 00ED539830: from= <example@gmail.com>, size=2125, nrcpt=1 (queue active)
Jan 12 00:14:30 ns postfix/local[87667]: 00ED539830: to= <foo@example.co.jp>, relay=local, delay=4.4, delays=4.4/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Jan 12 00:14:30 ns postfix/qmgr[87410]: 00ED539830: removed
Jan 12 00:15:00 ns postfix/smtpd[87661]: warning: network_biopair_interop: error reading 5 bytes from the network: Connection reset by peer
Jan 12 00:15:00 ns postfix/smtpd[87661]: disconnect from mail-iw0-f176.google.com[209.85.214.176]
Jan 12 00:15:00 ns milter-manager[87659]: [statistics] [session][end][end-of-message][pass][35.3916](1)
Jan 12 00:15:00 ns milter-manager[87659]: [statistics] [milter][end][end-of-message][accept][0.00734544](2): clamav-milter
Jan 12 00:15:00 ns milter-manager[87659]: [statistics] [milter][end][end-of-message][pass][3.77861](3): spamass-milter

ちゃんと判定できました。
"Could not retrieve sendmail macro "i"!. Please add it to confMILTER_MACROS_ENVFROM for better spamassassin results"
については、外国のページで見た内容で対処。
main.cfの最後に、

milter_connect_macros = b i j _ {daemon_name} {if_name} {if_addr}
milter_end_of_data_macros = b i j _ {daemon_name} {if_name} {if_addr} {mail_addr}

の2行を追加。Postfixをリスタート。あれ? 解消できてないケースもあるみたいだ。
良く理解しないで真似しているとセキュリティ上まずかろうだけど。

milter-greylist

 ここまで来ると、一緒に入れてみたくなってきました。
過去に導入して、うまく動作させて成果を確認したことが一度もないのです。
 どんな感じか楽しみになってきました。

 導入を開始します。

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

 毎度で選択画面です。

POSTFIXを指定して導入。MANはデフォルトチェック。

比較的すぐ完了します。/etc/rc.conf に

miltergreylist_enable="YES"
miltergreylist_runas="smmsp:mail"

を追加。
※その後、portupgradeしていたら、エラーに遭遇。
 milter-greylist がバージョンが変わったり、再インストールが必要な際には、chown smmsp:mail /var/milter-greylistを忘れずに。

# mkdir /etc/rc.conf.d/
# chown smmsp:mail /var/milter-greylist
# vi /etc/rc.conf.d/miltergreylist
... ( <http://milter-manager.sourceforge.net/reference/ja/install-to-freebsd.html> 内のスクリプトをペースト) ...
# cp /usr/local/etc/mail/greylist.conf.sample /usr/local/etc/mail/greylist.conf

設定ファイルを作成。お勧めの3行を追加。
スクリプトを起動し、問題なく動作することを確認。

# milter-manager -u milter-manager --show-config

問題なし。milter-manager を再起動。
テストメールも大丈夫でした。これで一連はいけそうな感じです。
greylistは意外にあっさりでした。sendmail側でも入れてみたくなりました。


【改訂履歴】作成:2011/01/10
2011/1/12 milter-greylist の追加を記述。タイトルのミスを訂正。ホームディレクトリの記述を変更など

【参照ページ】

FreeBSDへインストール - milter manager
clamav-milter … COZMIXNGのWebページ

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