Postfix SMTPサーバ

Postfix + Clamav + Amavisd
標準実装のPostfixを使ったメールサーバーのまとめです。
Postfix は「Minimal Install」デフォルトでインストールされます。
1. Postfix の基本設定
# vi /etc/postfix/main.cf
myhostname = mail.hoge.com ← 自ホスト名
mydomain = hoge.com ← 自ドメイン名
myorigin = $mydomain ← 省略時補完ドメイン名
inet_interfaces = all ← 待受けインターフェイス
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
 ← ローカル配送ドメイン名
mynetworks = 127.0.0.0/8, 10.0.0.0/24 ← 自ネットワーク
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/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

# systemctl restart postfix
3. Anti-Virusの設定
1. アンチウィルスソフトウェア Clam AntiVirus をインストール
⇒ EPEL からインストール
# yum --enablerepo=epel -y install clamav clamav-update
# sed -i -e "s/^Example/#Example/" /etc/freshclam.conf
# freshclam

2. Amavisd および Clamav Server をインストール
⇒ EPEL からインストール
# yum --enablerepo=epel -y install amavisd-new clamav-scanner clamav-scanner-systemd

# vi /etc/clamd.d/scan.conf
#Example
LogFile /var/log/clamd.scan
PidFile /var/run/clamd.scan/clamd.pid
TemporaryDirectory /var/tmp
LocalSocket /var/run/clamd.scan/clamd.sock
TCPSocket 3310

# touch /var/log/clamd.scan
# chown clamscan. /var/log/clamd.scan
# systemctl start clamd@scan
# systemctl enable clamd@scan

# vi /etc/amavisd/amavisd.conf
$mydomain = 'hoge.com'; ← 自ドメイン名
$myhostname = 'mail.hoge'; ← 自ホスト名
$notify_method = 'smtp:[127.0.0.1]:10025';
$forward_method = 'smtp:[127.0.0.1]:10025';
# LocalSocket変更
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamd.scan/clamd.sock"],

# chmod 755 /var/run/clamd.scan
# systemctl start amavisd spamassassin
# systemctl enable amavisd spamassassin

ログにエラーが出て配送に失敗していた!!
(!)connect to /var/run/clamd.scan/clamd.sock failed, attempt #1: Can't connect to a UNIX socket /var/run/clamd.scan/clamd.sock: Permission denied

(!)ClamAV-clamd av-scanner FAILED: CODE(0xd13808) unexpected , output="/var/spool/amavisd/tmp/amavis-yyyymmddssss-xxxxxx-xxxxxx/parts: lstat() failed: Permission denied.

どうやらamavisとclamdで上手くいっていない模様
そこで以下の様な対策しました。
# vi /etc/group
clamscan:x:nnn:clamscan,amavis
amavis:x:nnn:amavis,clamscan

# systemctl restart clamd@scan clamd@amavisd amavisd
これでエラーなく配送される様になりました。

3. Postfix の設定
# vi /etc/postfix/main.cf
# 最終行に追記
content_filter=smtp-amavis:[127.0.0.1]:10024

# vi /etc/postfix/master.cf
# 最終行に追記
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000

# systemctl restart postfix
4. マルチドメイン対応

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

# 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
5. 暗号化対応

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

# 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
6. 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

# systemctl restart postfix

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}ハッシュ値

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

↑先頭