せっかくメールサーバを構築したので、後々のためにブログに残しておくことにしました。

基本的な流れを追って、シリアスな(?)ところは省いたりしています。この設定でも十分実用的だとは思うのですが。

メールサーバを構築する

メールサーバの構成を決める

メールサーバをどのような形で守っていこうかを決めておきましょう。
特に、スパムメールの対処法とパスワード認証ですかね。全体的な構成を以下のようにします。

  • SpamAssassin(スパムアサシン)でスパムフィルタリング。
  • そのために、Procmailが必要。
  • IMAP / POP3 サーバは、Dovecot(ダヴコット)を使い、IMAPに設定します。
  • SMTPサーバは、Postfixです。
  • SMTPの認証は、saslauthdでプレインテキストまたはmd5ログイン認証とします。

必要なものをインストール

# yum install postfix dovecot spamassassin
# yum install cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain

※ Procmail はおそらくインストール済みと思います。

設定の大まかな流れ

dovecot 設定手順
  1. 各設定ファイルを編集する
    • /etc/dovecot/dovecot.conf
    • /etc/dovecot/conf.d/10-auth.conf
    • /etc/dovecot/conf.d/10-mail.conf
    • /etc/dovecot/conf.d/10-master.conf
    • /etc/dovecot/conf.d/10-ssl.conf
  2. サービス実行
    • systemctl start dovecot.service
  3. システム起動時にサービスを自動実行
    • systemctl enable dovecot.service
spamassasin 設定手順
  1. SpamAssassin用のユーザの作成
  2. SpamAssassin設定ファイル最新化スクリプトの作成
    • /etc/cron.daily/spamassassin-update
  3. SpamAssassin学習スクリプト作成
    • /etc/cron.hourly/spamassassin-learn
  4. procmail 設定ファイル作成
    • /etc/procmailrc
    • /etc/logrotate.d/procmail
  5. スパム専用メールボックス作成
    • 既存ユーザ用
    • 新規ユーザ用
postfix 設定手順
  1. Postfix 設定ファイル編集
    • /etc/postfix/main.cf
    • /etc/postfix/master.cf
  2. sendmail をやめて、postfix に切り替える

  3. postfix、saslauthd、spamassassinの実行およびシステム起動時の自動実行

設定の詳細

各設定ファイルの内容を中心に記録しておくことにします。

dovecot 設定

以前は一つのファイルで設定していたと思うのですが、設定内容ごとにファイルに分けられています。

/etc/dovecot/dovecot.conf
  # 24行: コメントを外し変更(複数記述できますが、そのポートが開きます)
  protocols = imap
  # 30行: IPv6を使わないときは、コメントを外し変更する
  listen = *
/etc/dovecot/conf.d/10-auth.conf
  # 10行: プレインテキスト認証の時には、コメントを外して変更する
  disable_plaintext_auth = no
  # 100行: 追加
  auth_mechanisms = plain login
/etc/dovecot/conf.d/10-mail.conf
  # 30行: コメントを外して追加
  mail_location = maildir:~/Maildir
/etc/dovecot/conf.d/10-master.conf
  # 96-98行: コメントを外して追加
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
      mode = 0666
      user = postfix # 追加
      group = postfix # 追加
  }
/etc/dovecot/conf.d/10-ssl.conf
  # 8行: SSLを使わないので変更
  ssl = no
spamassasin 設定
SpamAssassin用のユーザの作成
 # groupadd spamd
 # useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
 # chown spamd:spamd /var/log/spamassassin
SpamAssassin設定ファイル最新化スクリプトの作成と実行
  • spamassassin-update を作成する。

    #!/bin/bash
    # SpamAssassin設定ファイル最新版ダウンロード
    cd /etc/mail/spamassassin
    wget -qN http://www.flcl.org/~yoh/user_prefs
    
    # 設定ファイル更新時のみSpamAssassin再起動
    diff user_prefs user_prefs.org > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    cp user_prefs local.cf
    
    # スパム判断したメールを添付形式にしないように設定
    echo "report_safe 0" >> local.cf
    
    #ベイジアンフィルタを有効にする最低のham数(defaultは200)
    echo "bayes_min_ham_num 1" >> local.cf
    
    #ベイジアンフィルタを有効にする最低のspam数(defaultは200)
    echo "bayes_min_spam_num 1" >> local.cf
    
    # スパム判断したメールの件名に「***SPAM***」を付加するように設定
    echo "rewrite_header Subject ***SPAM***" >> local.cf
    
    # SpamAssassin再起動
    /etc/rc.d/init.d/spamassassin restart > /dev/null
    fi
    cp user_prefs user_prefs.org
  • SpamAssassin設定ファイルを最新にする。

    # chmod +x spamassassin-update
    # ./spamassassin-update
  • 毎日自動実行させる。

    # mv spamassassin-update /etc/cron.daily/
SpamAssassin学習スクリプト作成
  • spamassassin-learn

    #!/bin/bash
    PATH=/usr/sbin:/usr/bin:/bin
    
    for user in `ls /home/`
    do
    # 正常メール
    hammail=/home/$user/Maildir/cur
    
    # 正常メール学習
    if [ -d "$hammail" ]; then
        # 正常メールをSpamAssassinに学習させる
        su $user -s "/bin/bash" -c "sa-learn --ham $hammail | \
        logger -p mail.info -t 'sa-learn for $user'"
    fi
    
    # スパムメール
    spammail=/home/$user/Maildir/.Spam/cur
    
    # スパムメール学習
    if [ -d "$spammail" ]; then
       # スパムメールをSpamAssassinに学習させる
       su $user -s "/bin/bash" -c "sa-learn --spam $spammail | \
       logger -p mail.info -t 'sa-learn for $user'"
    
       # 受信後一ヶ月経過したスパムメールを削除
       tmpwatch -m 720 $spammail
    fi
    done
  • スクリプトを1時間ごとに実行

    # chmod +x spamassassin-learn
    # mv spamassassin-learn /etc/cron.hourly/
procmail 設定ファイル作成
  • /etc/procmailrc

    SHELL=/bin/bash
    PATH=/usr/bin:/bin
    DROPPRIVS=yes
    MAILDIR=$HOME/Maildir
    DEFAULT=$MAILDIR/
    SPAM=$MAILDIR/.Spam/
    LOGFILE=$MAILDIR/.procmail.log # ログ出力先
    #VERBOSE=ON # 詳細ログ出力
    
    # SpamAssassinによるスパムチェック
    :0fw
    |/usr/bin/spamc
    
    # SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送
    :0
    *^X-Spam-Flag: YES
    $SPAM
  • procmailログローテーション設定ファイル作成
    /etc/logrotate.d/procmail
    /home/*/Maildir/.procmail.log {
    missingok
    nocreate
    notifempty
    }
スパム専用メールボックス作成
  • 既存ユーザ用
    スパム専用メールボックス作成スクリプトを作成し実行する
    spamfolder-create

    #!/bin/bash
    
    for user in `ls /home`
    do
    id -u $user > /dev/null 2>&1
    if [ $? -eq 0 ] && [ ! -d /home/$user/Maildir/.Spam/new ]; then
        mkdir -p /home/$user/Maildir/.Spam/new
        mkdir -p /home/$user/Maildir/.Spam/cur
        mkdir -p /home/$user/Maildir/.Spam/tmp
        chmod -R 700 /home/$user/Maildir/.Spam
        chown -R $user. /home/$user/Maildir/.Spam
        echo $user
    fi
    done
  • 新規ユーザ用
    新規ユーザ追加時に自動でスパム専用メールボックス作成

    # mkdir -p /etc/skel/Maildir/.Spam/{new,cur,tmp}
    # chmod -R 700 /etc/skel/Maildir/.Spam
postfix 設定

全体をまとめるような感じで設定していきます。

Postfix 設定ファイル編集
  • /etc/postfix/main.cf
    コメント行が多いので、有効にした行と有効になっていた行を集めてみました。
    行頭がスペースで始まると、上の行の続きになります。コピーするときには注意してください。
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
mydomain = 【メールサーバにするドメイン】# example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
mail_spool_directory = /var/mail
mailbox_command = /usr/bin/procmail
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/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.2/samples
readme_directory = /usr/share/doc/postfix-2.10.2/README_FILES

 ##################################################
 # ここから下は追加
 #

smtpd_client_restrictions =
  permit_mynetworks,
  reject_unknown_client,
  permit

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous

smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_auth_destination,
  permit_sasl_authenticated,
  # reject_non_fqdn_recipient,
  # reject_unauth_destination,
  reject

mailbox_size_limit = 1000000000

message_size_limit = 20000000

smtpd_recipient_limit = 50
  • /etc/postfix/master.cf
    該当行のコメントを外して、編集します。

    smtp      inet  n       -       n       -       -       smtpd
      -o content_filter=spamassassin
    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

    最後に付け加えます。

    spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc
      -e /usr/sbin/sendmail
      -oi -f ${sender} ${recipient}
sendmail をやめて、postfix に切り替える
 # systemctl stop sendmail.service
 # systemctl disable sendmail.service
 # alternatives --config mta
postfix、saslauthd、spamassassinの実行およびシステム起動時の自動実行
 # systemctl start postfix.service
 # systemctl enable postfix.service
 # systemctl start saslauthd.service
 # systemctl enable saslauthd.service
 # systemctl start spamassassin.service
 # systemctl enable spamassassin.service

以上で終了です。

コメントを残す