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
-
# 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
spamassassin設定
複数のドメインで別々のメールボックスを持てるように設定します。
サーバーとクライアント間の通信を暗号化します、但しサーバー間は暗号化されません。
外部から接続してくるクライアントは認証が必要とし、認証されたクライアントのみリレーする
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}ハッシュ値
デーモンの再起動は必要ありません
Dovecot POP3,IMAPサーバー
PostfixはSMTPサーバーですのでメールの送受信を担います。DovecotはSMTPサーバーのメールボックスから受信と、クライアントからのメール送信を担います。