よろずな情報屋

Postfix SMTPサーバ

標準実装のPostfixを使ったメールサーバーのまとめです。

1. Postfix の基本設定

# vi /etc/postfix/main.cf
myhostname = mail.hoge.com ← 自ホスト名
mydomain = hoge.com ← 自ドメイン名
myorigin = $mydomain ← 省略時補完ドメイン名
inet_interfaces = all ← 待受けインターフェイス
mydestination = $myhostname, localhost.$mydomain, localhost ← ローカル配送ドメイン名
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 ← 自ネットワーク
home_mailbox = Maildir/ ← メールボックス形式
smtpd_banner = $myhostname ESMTP ← バナー文字列
message_size_limit = 10485760 ← 送受信メールサイズを10Mに制限
mailbox_size_limit = 1073741824 ← メールボックスサイズを1Gに制限

2. スパム対策の設定

# vi /etc/postfix/main.cf
# HELOコマンドを要求
smtpd_helo_required = yes

# AレコードまたはMXレコードがない場合に、要求を拒否
# FQDN 形式でない場合に要求を拒否
smtpd_helo_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    check_helo_access hash:/etc/postfix/helo_access,
    check_helo_access hash:/etc/postfix/access,
    reject_invalid_hostname,
    reject_non_fqdn_hostname,
    reject_unknown_hostname,
    permit

# PTRレコードが無い(逆引きできない)ホストの接続を拒否する
# DNSBLを利用してブラックリストチェック
smtpd_client_restrictions =
    permit_mynetworks,
    check_client_access hash:/etc/postfix/access,
    reject_unknown_client,
    reject_rbl_client all.rbl.jp,  ※2017年9月末日 rbl.jp 運用停止の為、行削除
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client q.mail-abuse.com,
    reject_rbl_client b.barracudacentral.org,
    reject_rbl_client sbl-xbl.spamhaus.org,
    permit

# MAIL FROMアドレスが
# FQDN 形式でない場合に要求を拒否
smtpd_sender_restrictions =
    permit_mynetworks,
    check_sender_access hash:/etc/postfix/access,
    reject_unknown_sender_domain,
    reject_non_fqdn_sender

# RCPT TOアドレスが
# FQDN 形式でない場合に要求を拒否
smtpd_recipient_restrictions =
    permit_mynetworks,
    check_recipient_access hash:/etc/postfix/access,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unauth_destination,
    permit_auth_destination,
    reject

spamassassin設定

# vi /etc/postfix/master.cf
procmail unix - n n - - pipe
 flags=R user=mailuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc
policy-spf unix - n n - 0 spawn
 user=nobody argv=/usr/libexec/postfix/policyd-spf

# vi /etc/procmailrc
 SHELL=/bin/bash
 PATH=/usr/bin:/bin
 MAILDIR=/home/mail/virtual/$DOMAIN/$USER/Maildir
 DEFAULT=$MAILDIR/
 LOCKFILE=/home/mail/virtual/procmail.lock
 LOGFILE=/home/mail/virtual/procmail.log
 # ヘッダーに「X-Spam-***」がない場合、spamassassinを起動
 :0fw: spamassassin.lock
 *!^X-Spam-Status.*
 | /usr/bin/spamc
# vi /etc/mail/spamassassin/init.pre
 enable_compat welcomelist_blocklist
 loadplugin Mail::SpamAssassin::Plugin::RelayCountry
 loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
 loadplugin Mail::SpamAssassin::Plugin::SPF
# vi /etc/mail/spamassassin/v310.pre
 loadplugin Mail::SpamAssassin::Plugin::Pyzor
 loadplugin Mail::SpamAssassin::Plugin::Razor2
 loadplugin Mail::SpamAssassin::Plugin::SpamCop
 loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
 loadplugin Mail::SpamAssassin::Plugin::TextCat
 loadplugin Mail::SpamAssassin::Plugin::WelcomeListSubject
 loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
 loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
# vi /etc/mail/spamassassin/local.cf
 required_score 4.5  ← 要調整
 allow_user_rules 1
 report_safe 0
 rewrite_header Subject ***SPAM***
 normalize_charset 1
 include private_prefs
 2006-10-28 OSC2006 Tokyo/Fall 日本SpamAssassinユーザ会 配布資料を参考に以下のように設定
 ### 特定の国を経由したメッセージにスコアを付ける場合
 # この例では中国(CN)のホストを経由する場合
 header RELAYCOUNTRY_CN X-Relay-Countries =~ /CN/
 describe RELAYCOUNTRY_CN Relayed via China
 score RELAYCOUNTRY_CN 3.5

 header RELAYCOUNTRY_US X-Relay-Countries =~ /US/
 describe RELAYCOUNTRY_US Relayed via USA
 score RELAYCOUNTRY_US 3.5

 header RELAYCOUNTRY_AT X-Relay-Countries =~ /AT/
 describe RELAYCOUNTRY_AT Relayed via Austria
 score RELAYCOUNTRY_AT 3.5

 ### 信頼できる国を経由していない場合
 # まず、信頼できる国を経由しているかを調べる
 # この例では日本(JP)のホストを経由しているかどうかを調べる
 header __RELAYCOUNTRY_JP X-Relay-Countries =~ /JP/
 # 信頼できる国を経由していない場合を否定演算子を用いて記述する
 meta RELAYCOUNTRY_UNTRUSTED !__RELAYCOUNTRY_JP
 describe RELAYCOUNTRY_UNTRUSTED Relayed via untrusted country
 score RELAYCOUNTRY_UNTRUSTED 4.0
 ### メッセージにヘッダを追加する場合
 # 追加するヘッダの例) X-Spam-Relay-Countries: CN
 add_header all Relay-Countries _RELAYCOUNTRY

 ### 日本語だけが欲しい場合
 ok_languages ja
 ### scoreの再割り当て
 # 判定ミスの場合の影響が大きいのでスコアを小さくする
 score UNWANTED_LANGUAGE_BODY 1.0
 # Shift_JISを許容するためスコアを0にする
 score BODY_8BITS 0.0
 ### メッセージにヘッダを追加する場合
 # 追加するヘッダの例) X-Spam-Language: ja.iso-2022-jp
 add_header all Language _LANGUAGES

3. マルチドメイン対応

複数のドメインで別々のメールボックスを持てるように設定します。

# vi /etc/postfix/main.cf
 #
 # バーチャルメールボックスの設定
 #
 virtual_mailbox_domains = /etc/postfix/virtual-domains
 virtual_mailbox_maps = hash:/etc/postfix/virtual-mailbox
 virtual_uid_maps = static:10000
 virtual_gid_maps = static:10000
 virtual_mailbox_base = /home/mailbox/virtual
 #
 # バーチャルドメイン(virtualdomain)での1つのメールボックスの最大容量
 # 100M (Default 50M)
 virtual_mailbox_limit = 104857600
 
 メールボックスのディレクトリを作成
 # mkdir /home/mailbox/virtual
 # chown 10000:10000 /home/mailbox/virtual

バーチャルドメインの設定
# vi /etc/postfix/virtual-domains
 hoge.hoge.com
 hoge1.hoge.com

バーチャルドメインのユーザーの配送先(メールボックス)を設定
# vi /etc/postfix/virtual-mailbox
 joe@hoge.hoge.com hoge.hoge.com/joe/Maildir/
 maria@hoge.hoge.com hoge.hoge.com/maria/Maildir/
  ・
  ・
  ・
 joe@hoge1.hoge.com hoge1.hoge.com/joe/Maildir/
 maria@hoge1.hoge.com hoge1.hoge.com/maria/Maildir/

# postmap /etc/postfix/virtual-mailbox
# systemctl restart postfix

4. 暗号化対応

サーバーとクライアント間の通信を暗号化します、但しサーバー間は暗号化されません。

# vi /etc/postfix/main.cf
 # 通信内容を暗号化
 smtpd_tls_security_level = may
 smtpd_tls_cert_file = /etc/letsencrypt/live/domain/cert.pem
 smtpd_tls_key_file = /etc/letsencrypt/live/domain/privkey.pem
 smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache
 #
 # POODLE SSL無効化(TLSのみにする)
 smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
 smtp_tls_protocols = !SSLv2, !SSLv3
 smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
 smtpd_tls_protocols = !SSLv2, !SSLv3

# systemctl restart postfix

5. SMTP認証

外部から接続してくるクライアントは認証が必要とし、認証されたクライアントのみリレーする

# vi /etc/postfix/main.cf
 # SMTP-Auth用 dovecot
 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

# vi /etc/postfix/master.cf
smtps inet n - y - - smtpd
 -o syslog_name=postfix/smtps
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes

6. OpenDKIM で迷惑メール判定を回避する

# apt -y install opendkim opendkim-tools
# vi /etc/opendkim.conf
 Mode sv
 Domain [youre domain name]
 SendReports yes
 SoftwareHeader yes
 MinimumKeyBits 1024
 KeyTable /etc/opendkim/KeyTable
 SigningTable refile:/etc/opendkim/SigningTable
 ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
 InternalHosts refile:/etc/opendkim/TrustedHosts

# opendkim-genkey --directory=/etc/opendkim/keys --domain=[youre domain name] --verbose
 opendkim-genkey: generating private key
 opendkim-genkey: private key written to default.private
 opendkim-genkey: extracting public key
 opendkim-genkey: DNS TXT record written to default.txt

# chown -R opendkim:opendkim /etc/opendkim/keys/*

Postfixの設定

# vi /etc/postfix/main.cf
 smtpd_milters = inet:127.0.0.1:8891
 non_smtpd_milters = $smtpd_milters
 milter_default_action = accept
 owner_request_special = no

DNSの設定

ドメインのゾーンファイルにレコードを追加します。
公開鍵レコードを記述
# cat /etc/opendkim/keys/[youre domain name]/default.txt
 default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
  "p=XXXXXXXXXXXXX........XXXXXXXXXXXXXXXXX" ) ; ----- DKIM key default for [youre domain name]

ADSP レコードを記述
 dsp._domainkey.[youre domain name]. IN TXT "dkim=unknown"

正しく設定できているか確認してみましょう!
「Domain Name」にドメインを、「Selector」に default を指定して「DKIM Lookup」ボタンを押下。
MXToolBox DKIM Record Lookup

Dovecot POP3,IMAPサーバー

PostfixはSMTPサーバーですのでメールの送受信を担います。
DovecotはSMTPサーバーのメールボックスから受信と、クライアントからのメール送信を担います。

1. Dovecot をインストール

# yum -y install dovecot

2. Postfix に SASL 機能が提供できるよう Dovecot を設定

# vi /etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp

listen = * ← IPv6を使用しない場合
listen = *, :: ← IPv6を使用する場合

# vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no ← プレーンテキスト認証も許可する
auth_mechanisms = cram-md5 plain login
!include auth-passwdfile.conf.ext
!include auth-static.conf.ext

# vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/mailbox/virtual/%d/%n/Maildir

# vi /etc/dovecot/conf.d/10-master.conf
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

# vi /etc/dovecot/conf.d/10-ssl.conf
ssl = yes

ssl_cert = </etc/letsencrypt/live/domain/cert.pem
ssl_key = </etc/letsencrypt/live/domain/privkey.pem

# vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
driver = passwd-file
args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
}

# /etc/dovecot/conf.d/auth-static.conf.ext
userdb {
driver = static
args = uid=10000 gid=10000 home=/home/mailbox/virtual/%d/%u
}

3. ユーザー認証情報ファイルの作成

/etc/dovecot/passwd ファイルを作成します。
フォーマットは「アカウント:パスワード」
CRAM-MD5パスワードは以下のようなコマンドで作成します。

doveadm pw -s CRAM-MD5 -p hoge
{CRAM-MD5}7aeefbe3e5e957c63e328c53ffa563c26bc08dcd58f605076679216cb4aff6d1
パスワード「hoge」の{CRAM-MD5}が作成できますのでこれを貼り付けます。

# vi /etc/dovecot/passwd
joe@hoge.hoge.com:{CRAM-MD5}7aeefbe3e5e957c63e328c53ffa563c26bc08dcd58f605076679216cb4aff6d1

# systemctl start dovecot
# systemctl enable dovecot

4. バーチャルドメインのユーザー追加

postfix側の設定
「/etc/postfix/virtual-mailbox」にバーチャルドメインのユーザーの配送先(メールボックス)を設定
jones@hoge1.hoge.com hoge1.hoge.com/jones/Maildir/

設定の反映の為再起動が必要
# postmap /etc/postfix/virtual-mailbox
# systemctl restart postfix

dovecot側の設定
# doveadm pw -s CRAM-MD -p plantext
{CRAM-MD5}ハッシュ値

# vi /etc/dovecot/passwd
ユーザー名@ドメイン名:{CRAM-MD5}ハッシュ値

デーモンの再起動は必要ありません