メールサーバ構築のまとめ(複数のバーチャルドメイン+Postfix+MySQL+Dovecot+procmail+Clam AntiVirus+spamassassin+postfixadmin)

メールサーバ構築のまとめ(複数のバーチャルドメイン+Postfix+MySQL+Dovecot+procmail+Clam AntiVirus+spamassassin+postfixadmin)
  • 2013/02/23追記 dovecot2にアップグレードしたエントリーはこちら
  • 2013/02/22追記 TLS対応。エントリーはこちら
  • 2013/01/15追記 wpの設定を変えたこともあり見難いので随時記事を添削します。
  • 2013/01/13追記 PostfixのMySQL対応はyumで出来るようです。詳しくは該当箇所で
  • 2012/08/31追記 master.cf の設定に漏れがありました。詳しくは該当箇所で
  • 2012/09/05追記 main.cf の設定に追加しました。詳しくは該当箇所で

  • 設定項目などはほぼコピペ。自分用のメモ。
    記事中の各リンク先の通り設定したのではなかなか実現できないので多少アレンジしています。

    ローカルのUNIXユーザーはMairdir/方式でメールを使いたい。
    バーチャルドメイン複数の運用、かつ、Web GUIでメールアカウントを管理したい。
    スパムメールとウィルスもチェックしたい。

    このような要望のもと、メールサーバを立て直した際に以前書いた記事をまとめてみた。
    さすがに長文になったので続きを読むにした。

    • CentOS5.5 i386とする
    • MySQLは設定済み前提
    • ローカルのUNIXユーザはMaildir方式でメールを利用する。
      メールボックスは ~/home/username/Mairdir
    • 複数のドメインをバーチャルドメインで扱う。
      メールボックスは /mail/domain.tld/user@domain.tld
    • PostfixをMTAとしてバーチャルドメインでのメールアカウントはMySQLで管理する。
    • Clam AntiVirusでウィルスチェックを行う。
    • SpamAssassinでスパムチェックを行う。このため各メールボックスへの配送(transport)はprocmailで行う。

    スガラボット (守田 直哉)さんのコメントを参考にすると、メールボックスは /mail/domain.tld/user@domain.tld/Mairdir にしておいた方がdovecot2を使う時に良さそうです。

    MySQL対応版Postfixのインストール

    CentOSの場合はCentOS Plusリポジトリを追加(有効に)することでyumでインストール出来る。

    centosplusリポジトリの有効化
    # vi /etc/yum.repos.d/CentOS-Base.repo
    
    [centosplus]
    name=CentOS-$releasever - Plus
    mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
    #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
    gpgcheck=1
    enabled=1 ←0から1に修正して有効にする
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
    
    Postfixのupdate
    # yum update postfix
    
    ...
    
    
    ===================================================================
     Package           Arch   Version               Repository    Size
    ===================================================================
    Updating:
     postfix           i386   2:2.3.3-2.3.0.1.el5.centos.mysql_pgsql
                                                    centosplus   3.7 M
    
    ...
    mysql対応になっているかの確認

    mysqlと出れば対応している。

    # postconf -m|grep mysql
    mysql

    ※MySQLとPostgreSQLがインストールされていない場合は関連するものがインストールされます。

    PostfixAdmin

    PostfixAdmin
    バーチャルドメインでのメールアカウントの管理はブラウザGUIから管理できるPostfixAdminを利用する。

  • 設定内容はほぼ Postfixによるメールサーバ構築 その2 (MySQLの設定とpostfixadminのインストール) | CentOSサーバ構築術 文具堂 さんのコピペです。
  • 駄記事として postfixadmin +procmailな環境でメールディレクトリの自動作成・削除 も書いてます。
  • 駄記事を見て思い出したのですが、最近のマシンではsudoの設定が必要かも知れません。sudoに文句言われるときは参考にしてみて下さい(2012/2/18追記)
  • postfixadminのインストール

    最新版をチェック
    http://sourceforge.net/projects/postfixadmin/

    # wget http://nchc.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-2.3.2.tar.gz
    # tar zxvf postfixadmin-2.3.2.tar.gz
    # mv postfixadmin-2.3.2/ /var/www/postfixadmin

    postfixadminの設定

    # cd /var/www/postfixadmin
    # cp config.inc.php config.inc.php.copy
    # vi config.inc.php
    
    /*****************************************************************
     *  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     * You have to set $CONF['configured'] = true; before the
     * application will run!
     * Doing this implies you have changed this file as required.
     * i.e. configuring database etc; specifying setup.php password etc.
     */
    //$CONF['configured'] = false;
    $CONF['configured'] = true;       ←修正
    
    // In order to setup Postfixadmin, you MUST specify a hashed password here.
    // To create the hash, visit setup.php in a browser and type a password into the
     field,
    // on submission it will be echoed out to you as a hashed value.
    //$CONF['setup_password'] = 'changeme';
    $CONF['setup_password'] = 'xxxxxxxx';  ←修正 セットアップ用のパスワードを設定
    
    // Postfix Admin Path
    // Set the location of your Postfix Admin installation here.
    // YOU MUST ENTER THE COMPLETE URL e.g. http://domain.tld/postfixadmin
    $CONF['postfix_admin_url'] = '';
    
    // shouldn't need changing.
    $CONF['postfix_admin_path'] = dirname(__FILE__);
    
    // Language config
    // Language files are located in './languages', change as required..
    //$CONF['default_language'] = 'en';
    $CONF['default_language'] = 'ja';       ←修正
    // Database Config
    // mysql = MySQL 3.23 and 4.0, 4.1 or 5
    // mysqli = MySQL 4.1+
    // pgsql = PostgreSQL
    ↓適時修正
    $CONF['database_type'] = 'mysql';
    $CONF['database_host'] = 'localhost';
    $CONF['database_user'] = 'postfix';
    $CONF['database_password'] = 'pass';
    $CONF['database_name'] = 'postfix';
    $CONF['database_prefix'] = '';
    
    // Site Admin
    // Define the Site Admins email address below.
    // This will be used to send emails from to create mailboxes.
    //$CONF['admin_email'] = 'postmaster@change-this-to-your.domain.tld';
    $CONF['admin_email'] = 'postmaster@hoge.jp';       ←修正
    
    // Encrypt
    // In what way do you want the passwords to be crypted?
    // md5crypt = internal postfix admin md5
    // md5 = md5 sum of the password
    // system = whatever you have set as your PHP system default
    // cleartext = clear text passwords (ouch!)
    // mysql_encrypt = useful for PAM integration
    // authlib = support for courier-authlib style passwords
    // dovecot:CRYPT-METHOD = use dovecotpw -s 'CRYPT-METHOD'. Example: dovecot:CRAM-MD5
    //$CONF['encrypt'] = 'md5crypt';
    $CONF['encrypt'] = 'cleartext';       ←修正
    
    // Page Size
    // Set the number of entries that you would like to see
    // in one page.
    //$CONF['page_size'] = '10';
    $CONF['page_size'] = '100';       ←修正
    
    // Mailboxes
    // If you want to store the mailboxes per domain set this to 'YES'.
    // Examples:
    //   YES: /usr/local/virtual/domain.tld/username@domain.tld
    //   NO:  /usr/local/virtual/username@domain.tld
    $CONF['domain_path'] = 'YES';       ←修正
    
    // Default Domain Values
    // Specify your default values below. Quota in MB.
    //$CONF['aliases'] = '10';
    //$CONF['mailboxes'] = '10';
    //$CONF['maxquota'] = '10';
    $CONF['aliases'] = '100';       ←修正
    $CONF['mailboxes'] = '100';
    $CONF['maxquota'] = '300';
    
    // Quota
    // When you want to enforce quota for your mailbox users set this to 'YES'.
    $CONF['quota'] = 'YES';       ←修正
    
    // Backup
    // If you don't want backup tab set this to 'NO';
    $CONF['backup'] = 'YES';
    
    // Send Mail
    // If you don't want sendmail tab set this to 'NO';
    $CONF['sendmail'] = 'YES';
    
    // Fetchmail
    // If you don't want fetchmail tab set this to 'NO';
    $CONF['fetchmail'] = 'YES';

    apacheの設定

    webブラウザでアクセスできるようにする。必要に応じてIP制限、Basic認証などを行う。個人的にはSSL接続推奨。

    postfixadmin用コンフィグを新規作成
    # vi /etc/httpd/conf.d/postfixadmin.conf
    
    Alias /postfixadmin "/var/www/postfixadmin"
    
    
        Order allow,deny
        Allow from all
    
    

    postfixadminのセットアップスクリプト実行

    http://hogehoge/postfixadmin/setup.php
    へアクセスする。

    設定が正しければページの最後にフォームが出る。
    postfixadmin setup
    このフォームに config.inc.php の$CONF['setup_password'] ="xxxxxxxx"; にある値を入力するとハッシュキーが作成される。

    config.inc.php の$CONF['setup_password'] ="xxxxxxxx"; の値を作成されたハッシュキーに変更する。

    If you want to use the password you entered as setup password, edit config.inc.php and set
    $CONF['setup_password'] = 'xxxxxd9ae95306513xxxxxxxxx:71d063841 xxxx38xxxxxdxx06bcexxxx';

    // In order to setup Postfixadmin, you MUST specify a hashed password here.
    // To create the hash, visit setup.php in a browser and type a password into the field,
    // on submission it will be echoed out to you as a hashed value.
    $CONF['setup_password'] = 'xxxxxd9ae95306513xxxxxxxxx:71d063841xxxx38xxxxxdxx06bcexxxx';    ←ここを修正

    postfixadmin管理ユーザーの追加

    設定したセットアップパスワード(ハッシュキーではない)を使って管理ユーザーを設定する。
    ログインを確認できたらセットアップスクリプトを削除する

    # rm -f /var/www/postfixadmin/setup.php
    # rm -f /var/www/postfixadmin/motd*

    MySQLを使うためのPostfixの設定

    メール保存用ルートディレクトリ

    /mail をメール専用アカウントの保存用ルートディレクトリとする。
    各ユーザーのメールボックスは /mail/domain.jp/user@domain.jp とする。

    ##バーチャルドメインで処理するユーザーの作成
    # groupadd -g 10000 vuser
    # useradd -g vuser -u 10000 vuser
    
    ##メール保存用ルートディレクトリの作成
    # mkdir /mail
    # chown vuser:vuser /mail
    # chmod 771 /mail

    postfix用の設定ファイル作成

    MySQLのユーザーとパスワードを適時変更すること
    (サンプルは ユーザー=postfix パスワード=pass)
    /etc/postfix/mysql_virtual_alias_maps.cf
    /etc/postfix/mysql_virtual_domains_maps.cf
    /etc/postfix/mysql_virtual_mailbox_maps.cf
    /etc/postfix/mysql_virtual_mailbox_limit_maps.cf

    # vi /etc/postfix/mysql_virtual_alias_maps.cf
    user = postfix
    password = pass
    hosts = localhost
    dbname = postfix
    table = alias
    select_field = goto
    where_field = address
    
    # vi /etc/postfix/mysql_virtual_domains_maps.cf
    user = postfix
    password = pass
    hosts = localhost
    dbname = postfix
    table = domain
    select_field = domain
    where_field = domain
    additional_conditions = and active = '1'
    
    # vi /etc/postfix/mysql_virtual_mailbox_maps.cf
    user = postfix
    password = pass
    hosts = localhost
    dbname = postfix
    table = mailbox
    select_field = maildir
    where_field = username
    
    # vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
    user = postfix
    password = pass
    hosts = localhost
    dbname = postfix
    table = mailbox
    select_field = quota
    where_field = username
    #additional_conditions = and active = '1'

    生のパスワードが記述されているのでグループをpostfixにしてパーミッションを変更しておく。

    # chown :postfix /etc/postfix/mysql_virtual_*
    # chmod 640 /etc/postfix/mysql_virtual_*

    Postfix設定ファイル main.cf の編集

    元のファイルをコピーしてから編集する。

    # cp /etc/postfix/main.cf /etc/postfix/main.cf.org
    # vi /etc/postfix/main.cf
    
    # INTERNET HOST AND DOMAIN NAMES
    #
    # The myhostname parameter specifies the internet hostname of this
    # mail system. The default is to use the fully-qualified domain name
    # from gethostname(). $myhostname is used as a default value for many
    # other configuration parameters.
    #
    #myhostname = host.domain.tld
    #myhostname = virtual.domain.tld
    myhostname = mail.example.com    ←追加(自FQDN名を指定)
    
    # The mydomain parameter specifies the local internet domain name.
    # The default is to use $myhostname minus the first component.
    # $mydomain is used as a default value for many other configuration
    # parameters.
    #
    #mydomain = domain.tld
    mydomain = example.com ← 追加(自ドメイン名を指定)
    
    # SENDING MAIL
    #
    # The myorigin parameter specifies the domain that locally-posted
    # mail appears to come from. The default is to append $myhostname,
    # which is fine for small sites.  If you run a domain with multiple
    # machines, you should (1) change this to $mydomain and (2) set up
    # a domain-wide alias database that aliases each user to
    # user@that.users.mailhost.
    #
    # For the sake of consistency between sender and recipient addresses,
    # myorigin also specifies the default domain name that is appended
    # to recipient addresses that have no @domain part.
    #
    #myorigin = $myhostname
    #myorigin = $mydomain
    myorigin = $myhostname    ← 追加(ローカルからのメール送信時の送信元メールアドレス@以降にドメイン名を付加)
    
    #inet_interfaces = all
    #inet_interfaces = $myhostname
    #inet_interfaces = $myhostname, localhost
    #inet_interfaces = localhost
    inet_interfaces = all    ←変更(外部からのメール受信を許可)
    
    #mydestination = $myhostname, localhost.$mydomain, localhost
    #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
    #mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
    #       mail.$mydomain, www.$mydomain, ftp.$mydomain
    mydestination = $myhostname, localhost.$mydomain, localhost     ←修正
    
    # NOTE: Postfix will not automatically forward mail for domains that
    # list this system as their primary or backup MX host. See the
    # permit_mx_backup restriction description in postconf(5).
    #
    #relay_domains = $mydestination
    relay_domains = $mydestination     ←コメント削除
    
    # DELIVERY TO MAILBOX
    #
    # The home_mailbox parameter specifies the optional pathname of a
    # mailbox file relative to a user's home directory. The default
    # mailbox file is /var/spool/mail/user or /var/mail/user.  Specify
    # "Maildir/" for qmail-style delivery (the / is required).
    #
    #home_mailbox = Mailbox
    #home_mailbox = Maildir/
    home_mailbox = Maildir/ ← 追加(メールボックス形式をMaildir形式にする)
    
    # SHOW SOFTWARE VERSION OR NOT
    #
    # The smtpd_banner parameter specifies the text that follows the 220
    # code in the SMTP server's greeting banner. Some people like to see
    # the mail version advertised. By default, Postfix shows no version.
    #
    # You MUST specify $myhostname at the start of the text. That is an
    # RFC requirement. Postfix itself does not care.
    #
    #smtpd_banner = $myhostname ESMTP $mail_name
    #smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
    smtpd_banner = $myhostname ESMTP unknown ← 追加(メールサーバーソフト名の隠蔽化)
    
    ----- 以下を最終行に追記
    local_transport = local
    virtual_transport = virtual
    virtual_mailbox_base = /mail
    virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
    virtual_alias_domains = $virtual_alias_maps
    virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
    virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
    virtual_minimum_uid = 10000
    virtual_uid_maps = static:10000
    virtual_gid_maps = static:10000
    
    maximal_backoff_time = 800s
    minimal_backoff_time = 100s
    bounce_queue_lifetime = 60m
    maximal_queue_lifetime = 60m
    
    #mailbox_size_limit = 1024000000
    message_size_limit = 20480000
    
    #virtual_mailbox_limit = 51200000
    virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
    virtual_mailbox_limit_override = yes
    virtual_overquota_bounce = yes
    virtual_mailbox_limit_inbox = yes
    
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_security_options = noanonymous
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    smtpd_sasl_local_domain = $myhostname
    smtpd_recipient_restrictions = permit_mynetworks,  permit_sasl_authenticated, permit_auth_destination, reject_unauth_destination, reject
    
  • 2012-09-05追記
    smtpd_sasl_security_options = noanonymous を追記。
    エンタープライズ:セキュリティ How-To 第6回:メールサーバの不正利用対策(SMTP Authenticationの導入-Postfix編) を参考にさせて頂きました。匿名での接続を拒否する設定にしておく。
    smtpd_recipient_restrictions に関しては 不正中継の可否をチェックする を参考にさせて頂きました。
    最後に reject を追加すると外部からメールが受け取れないのですが、 permit_auth_destination を設定することで mydomain で指定したドメイン名で受信可能になるようです。
  • ローカルユーザーのメールが配信されない(root宛のメールなど)対策として、

    mydestination = $myhostname, localhost.$mydomain, localhost ※ローカル配送の最終到達ドメイン。
    
    relay_domains = $mydestination
    
    local_transport = local

    としている。
    他の対処法としては/etc/aliases に転送先を設定する方法などもある。

    また、LAN(192.168.0.0/16)内の他サーバからのリレーのみ許可するので以下の設定も追加する。

    # Specify "mynetworks_style = host" when Postfix should "trust"
    # only the local machine.
    #
    #mynetworks_style = class
    mynetworks_style = subnet ←追加
    #mynetworks_style = host
    
    # Alternatively, you can specify the mynetworks list by hand, in
    # which case Postfix ignores the mynetworks_style setting.
    #
    # Specify an explicit list of network/netmask patterns, where the
    # mask specifies the number of bits in the network part of a host
    # address.
    #
    # You can also specify the absolute pathname of a pattern file instead
    # of listing the patterns here. Specify type:table for table-based lookups
    # (the value on the table right-hand side is not used).
    #
    #mynetworks = 168.100.189.0/28, 127.0.0.0/8
    #mynetworks = $config_directory/mynetworks
    #mynetworks = hash:/etc/postfix/network_table
    mynetworks = 192.168.0.0/16, 127.0.0.0/8 ←追加

    新規ローカルユーザー対策

    新規ユーザーが追加されたらホームディレクトリに Mairdir/ を自動で作成されるようにする。

    # mkdir -p /etc/skel/Maildir/{new,cur,tmp}
    # chmod -R 700 /etc/skel/Maildir/

    既に運用中で既存ユーザーの対策をする場合はメールサーバー構築(Postfix+Dovecot) - CentOSで自宅サーバー構築の「(3)Maildir形式メールボックス作成 メールデータ移行」を参考に対処する。

    サブミッションポート(587番ポート)を利用する

    master.cfのsubmissionの行のコメントを外すだけ。

    2012/08/31修正
    master.cfのsubmission関連の行のコメントを外すだけ。

    -o smtpd_enforce_tls=yes のコメントを外す場合はTLSを有効にしている必要がある。

    # vi /etc/postfix/master.cf
    # ==========================================================================
    # service type  private unpriv  chroot  wakeup  maxproc command + args
    #               (yes)   (yes)   (yes)   (never) (100)
    # ==========================================================================
    smtp      inet  n       -       n       -       -       smtpd
    
    # ---> コメント削除
    submission inet n       -       n       -       -       smtpd
    #  -o smtpd_enforce_tls=yes  ← TLSの設定をしていないとエラーになるのでとりあえずコメントのままにしておく
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_client_restrictions=permit_sasl_authenticated,reject
    # <--- コメント削除
    

    メールサーバの不正中継のテスト

    第三者による不正中継がされないか以下のページにてチェックする。
    第三者中継チェック RBL.JP

    青い文字で no relays accepted. と出ればOK。
    Relay Checker by RBL.JP

    Dovecotの設定

    Dovecotのインストール

    ※dovecot1.xの設定です。dovecot2に移行したエントリ

    # yum install dovecot

    Dovecotの設定

    # cp /etc/dovecot.conf /etc/dovecot.conf.org
    # vi /etc/dovecot.conf
    
    # Protocols we want to be serving: imap imaps pop3 pop3s
    # If you only want to use dovecot-auth, you can set this to "none".
    #protocols = imap imaps pop3 pop3s
    protocols = imap imaps pop3 pop3s    ←コメント削除
    
    ....
    
    #   mail_location = maildir:~/Maildir
    #   mail_location = mbox:~/mail:INBOX=/var/mail/%u
    #   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
    #
    #
    #
    #mail_location =
    mail_location = maildir:/mail/%d/%u   ←追記
    
    ....
    
    
    # Valid UID range for users, defaults to 500 and above. This is mostly
    # to make sure that users can't log in as daemons or other system users.
    # Note that denying root logins is hardcoded to dovecot binary and can't
    # be done even if first_valid_uid is set to 0.
    #first_valid_uid = 500
    first_valid_uid = 10000   ←追記
    
    # Valid GID range for users, defaults to non-root/wheel. Users having
    # non-valid GID as primary group ID aren't allowed to log in. If user
    # belongs to supplementary groups with non-valid GIDs, those groups are
    # not set.
    #first_valid_gid = 1
    first_valid_gid = 10000   ←追記
    
    
    ....
    
    
      # SQL database
      passdb sql {    ←コメント削除
        # Path for SQL configuration file, see doc/dovecot-sql-example.conf
        #args =
        args = /etc/dovecot-mysql.conf    ←追記
      }    ←コメント削除
    
    
    ....
    
    
      # SQL database
      userdb sql {    ←コメント削除
        # Path for SQL configuration file, see doc/dovecot-sql-example.conf
        #args =
       args = /etc/dovecot-mysql.conf    ←追記
      }    ←コメント削除
    
    ....
    
    
    auth default {
      # Space separated list of wanted authentication mechanisms:
      #   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
      # NOTE: See also disable_plaintext_auth setting.
      #mechanisms = plain  ←コメントアウト
      mechanisms = plain login digest-md5 cram-md5    ←追記
    
    
    ....
    
    
    ##
    ## POP3 specific settings
    ##
    
    protocol pop3 {
      # Login executable location.
      #login_executable = /usr/libexec/dovecot/pop3-login
      〜略〜
      #pop3_uidl_format = %08Xu%08Xv
      pop3_uidl_format = %08Xu%08Xv    ←コメント削除
    }
    
    
    ....
    
    
      # It's possible to export the authentication interface to other programs:
      socket listen {    ←コメント削除
        #master {
          # Master socket provides access to userdb information. It's typically
          # used to give Dovecot's local delivery agent access to userdb so it
          # can find mailbox locations.
          #path = /var/run/dovecot/auth-master
          #mode = 0600
          # Default user/group is the one who started dovecot-auth (root)
          #user =
          #group =
        #}
        client {    ←コメント削除
          # The client socket is generally safe to export to everyone. Typical use
          # is to export it to your SMTP server so it can do SMTP AUTH lookups
          # using it.
          #path = /var/run/dovecot/auth-client
          #mode = 0660
          path = /var/spool/postfix/private/auth    ←追記
          mode = 0660    ←追記
          user = postfix    ←追記
          group = postfix    ←追記
        }    ←コメント削除
      }    ←コメント削除
    
    
    ....
    
    
    ##x86_64環境の場合は以下をコメント削除する。i386の場合は大丈夫。
    # Set max. process size in megabytes. If you don't use
    # login_process_per_connection you might need to grow this.
    login_process_size = 64    ←コメント削除

    /etc/dovecot-mysql.conf を新規作成

    connect項目のhostやuser、passwordは適時変更すること。
    ※ host=/var/lib/mysql/mysql.sock などソケットでも可。

    # vi /etc/dovecot-mysql.conf
    
    driver = mysql
    default_pass_scheme = PLAIN
    connect = dbname=postfix host=localhost user=postfix password=passwd
    password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
    user_query = SELECT concat('/mail/', maildir) as home, 10000 as uid, 10000 as gid FROM mailbox WHERE username = '%u' AND active = '1'

    パーミッションを変更しておく

    # chmod 600 /etc/dovecot-mysql.conf

    認証用ライブラリをインストール

    # yum install cyrus-sasl-plain cyrus-sasl-md5

    saslauthdは利用しないので念のため停止しておく。

    # /etc/rc.d/init.d/saslauthd stop
    # chkconfig saslauthd off

    PostfixとDovecotを起動する

    /var/log/maillogにエラーなどがでていないか確認。
    なお、sendmail等他のMTAで運営していた場合は切り替えが必要。

    #sendmailから切り替える場合
    # /etc/rc.d/init.d/sendmail stop  ←sendmail停止
    sm-client を停止中:                                        [  OK  ]
    sendmail を停止中:                                         [  OK  ]
    
    # chkconfig sendmail off  ←sendmail自動起動off
    # chkconfig --list sendmail  ←自動起動off確認
    sendmail       	0:off	1:off	2:off	3:off	4:off	5:off	6:off
    
    # alternatives --config mta  ←MTA切り替え
    2 プログラムがあり 'mta'を提供します。
    
      選択       コマンド
    -----------------------------------------------
    *+ 1           /usr/sbin/sendmail.sendmail
       2           /usr/sbin/sendmail.postfix
    
    Enterを押して現在の選択[+]を保持するか、選択番号を入力します:2 ←2を選択
    
    # /etc/init.d/dovecot start    ←dovecot起動
    chkconfig dovecot on    ←自動起動設定
    # /etc/init.d/postfix start    ←postfix起動
    chkconfig postfix on    ←自動起動設定

    ルーターの設定

    ファイアウォールなどのフィルタがある場合、25番,110番(popの場合),143番(IMAPの場合),587番ポートを通すように設定する。

    クライアントのメーラーの設定

    クライアントのメーラーの設定でSMTP認証を使う必要がある。(postfixadminで作成したuser@domain.tldと設定したパスワード)
    また、smtpサーバ(メール送信サーバ)のポートを587に指定する必要がある。

    ここまでで、とりあえずのメールサーバ運用はできる。


    ウィルスとスパムメール対策

    つづいてウィルスチェックとスパムチェックを導入する。
    スパムチェックとしてSpamAssassinを導入するが、メール配送(local_transport や virtual_transport)をprocmailで行わないとスパムチェックが有効にならない。
    このため、procmailを導入する。
    バーチャルドメインでのメールアカウントが主に使用するものなので、virtual_transport のみprocmailにまかせ、あまり使わない local_transport はlocalで行う(SpamAssassinは無効)。

    ウィルス対策

    アンチウィルスソフト導入(Clam AntiVirus) – CentOSで自宅サーバー構築を参考にClam AntiVirusをインストールする。

    ウィルススキャンテストまで行い、ウィルススキャン定期自動実行設定は行わない(ウィルススキャン実行スクリプトも作成しない)
    下記スパムメール対策のリンク先にあるが、Clam AntiVirusとPostfixが連携するように設定が必要。

    ウィルス対策2・スパムメール対策

    メールサーバーでウィルス&スパムチェック(Postfix+Clam AntiVirus+SpamAssassin) – CentOSで自宅サーバー構築を参考にClam AntiVirusとPostfixの連携、及び、SpamAssassinの設定を行う。

    SpamAssassinのみを導入する場合

    SpamAssassinのみを導入する場合はこちらも参考になる。スパムメールの学習なども紹介されている。
    SpamAssassinでスパム対策 - Linux で自宅サーバ [ Home Server Technical. ]

    procmailの設定

    /etc/procmailrcを新規作成する。
    バーチャルドメインでのメールアカウント保存ディレクトリは
    /mail/domain.tld/user@domain.tld

    # vi /etc/procmailrc
    
    SHELL=/bin/bash
    PATH=/usr/bin:/bin
    DEFAULT=/mail/$DOMAIN/$USER\@$DOMAIN/
    LOCKFILE=/mail/procmail.lock
    LOGFILE=/mail/procmail.log   # ログ出力先
    #VERBOSE=ON   # 詳細ログ出力
    
    # SpamAssassinによるスパムチェック
    :0fw
    |/usr/bin/spamc

    ログの肥大化を防ぐため、ログローテーション設定ファイル新規作成する。

    # vi /etc/logrotate.d/procmail
    
    /mail/procmail.log {
        missingok
        nocreate
        notifempty
    }

    Postfixとprocmailを連携させる

    main.cfの設定
  • 2012/2/18追記
    コメントを頂いた通り、以前の記事の設定だと同ドメインの違うユーザー名宛のメール(To:user1@hoge.comとcc:user2@hoge.com等)が1通しか配送されません。
    procmail_destination_recipient_limit = 1 を設定すると解消されるようです。
  • 該当箇所のみ更新

    # vi /etc/postfix/main.cf
    
    # virtual_transport = virtual  ←コメントアウト
    virtual_transport = procmail  ←追記
    procmail_destination_recipient_limit = 1 ←追記(2012/2/18追記分)
    
    content_filter=smtp-amavis:[127.0.0.1]:10024 ←最終行に追記
    
    master.cfの設定
    # vi /etc/postfix/master.cf
    
    最終行に追記
    procmail unix - n n - - pipe
      flags=R user=vuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

    Postfixを再起動して設定を有効化

    /etc/rc.d/init.d/postfix restart

    テストする

    メールを配信してみてヘッダ情報を見る。
    spamasassinが有効なら

    X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on xxx.xxxx.jp
    X-Spam-Level:
    X-Spam-Status: No, score=-0.1 required=13.0 tests=AWL,CONTENT_TYPE_PRESENT, ISO2022JP_BODY,ISO2022JP_CHARSET,X_MAILER_PRESENT autolearn=ham version=3.2.5

    Clam AntiVirusが有効なら

    X-Virus-Scanned: amavisd-new at xxxx.jp

    がヘッダ情報に挿入されているはず。

    自動メールボックス作成

    PostfixAdminを使ってバーチャルドメインでメールサーバを運営する場合、procmailを使うと自動でメールボックスが作成されなくなってしまう。

    以前書いたpostfixadmin +procmailな環境でメールディレクトリの作成・削除でメールディレクトリの作成、及び、削除を自動化するスクリプトを作成する。

    PostfixのTLS対応

    別エントリに書いてある通り