CentOS 7 メールサーバーのまとめ

標準実装のPostfixを使ったメールサーバーのまとめです。
最終的にはPostfix + Clamav + Amavisdの形

1. スパム対策の設定

 ⇒ HELOコマンドを要求
 ⇒ HELOホスト名がFQDN 形式でないまたはAレコードがない場合拒否
 ⇒ PTRレコードが無い(逆引きできない)ホストの接続を拒否
 ⇒ DNSBLを利用してブラックリストチェック
 ⇒ MAIL FROMアドレスがFQDN 形式でないか正規ドメインでない場合拒否
 ⇒ RCPT TOアドレスがFQDN 形式でないか正規ドメインでない場合拒否
 ⇒ 一通当たりの送受信メールサイズを制限

2. Anti-Virusの設定

 ⇒ Sophos Antivirus for Linux free edition
 ⇒ Clam AntiVirus

3. マルチドメイン対応

 ⇒ 複数のドメインで別々のメールボックスを持つ設定

4. 暗号化対応

 ⇒ サーバーとクライアント間を暗号化(サーバー間は暗号化されない)
 ⇒ POODLE対応

5. SMTP認証設定

 ⇒ オープンリレーとならないよう、クライアントが送信するには認証が必要とします

6. Dovecot(POPサーバー)の導入

 ⇒ 暗号化対応(POP3s,imaps)

1. スパム対策の設定

/etc/postfix/main.cf で設定してpostfixを再起動します。
設定例
2017年9月末日 rbl.jp 運用停止の為、all.rbl.jp行を削除

# 最終行へ追記
# 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,
       permit_sasl_authenticated,
       check_client_access hash:/etc/postfix/access,
       reject_unknown_client,
       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

# 送受信メールサイズを100Mに制限
message_size_limit = 104857600
# メールボックスサイズを1Gに制限
mailbox_size_limit = 1073741824

 # systemctl restart postfix 

2. Anti-Virusの設定

1. Sophos Antivirus for Linux free editionのインストールはこちら

⇒ 何故かサーバー負荷が高くなってしまったので現在停止中

2. アンチウィルスソフトウェア Clam AntiVirus をインストール

⇒ EPEL からインストール

# yum --enablerepo=epel -y install clamav clamav-update
# sed -i -e "s/^Example/#Example/" /etc/freshclam.conf
# freshclam

3. Amavisd および Clamav Server をインストール

⇒ EPEL からインストール

# yum --enablerepo=epel -y install amavisd-new clamav-scanner clamav-scanner-systemd

# vi /etc/clamd.d/scan.conf
# 8行目:コメントにする
#Example
# 14行目:コメント解除
LogFile /var/log/clamd.scan

# 66行目:コメント解除
PidFile /var/run/clamd.scan/clamd.pid

# 70行目:コメント解除
TemporaryDirectory /var/tmp

# 85行目:コメント解除
LocalSocket /var/run/clamd.scan/clamd.sock

# 101行目:コメント解除
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 
# 20行目:自ドメイン名に変更
$mydomain = 'hoge.com';

# 152行目:自ホスト名に変更
$myhostname = 'mail.hoge.com';

# 154行目:コメント解除
$notify_method = 'smtp:[127.0.0.1]:10025';
$forward_method = 'smtp:[127.0.0.1]:10025';

# 384行目:変更
\&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

これでエラーなく配送される様になりました。

4. 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 

3. マルチドメイン対応

複数のドメインで別々のメールボックスを持てるように設定します。
/etc/postfix/main.cf で設定してpostfixを再起動します。
設定例

#
# バーチャルメールボックスの設定
#
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

バーチャルドメインの定義

# vi /etc/postfix/virtual-domains
hoge.hoge.com
hoge1.hoge.com

メールボックスのディレクトリを作成

# mkdir /home/mailbox/virtual
# chown 10000:10000 /home/mailbox/virtual

バーチャルドメインのアカウント配送先を設定

# 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
# postmap /etc/postfix/virtual-mailbox
# systemctl restart postfix 

4. 暗号化対応

サーバーとクライアント間の通信を暗号化します、但しサーバー間は暗号化されません。
/etc/postfix/main.cf で設定してpostfixを再起動します。
設定例

# 通信内容を暗号化
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_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject

# systemctl restart postfix

6. Dovecotのマルチドメイン&暗号化対応

1. Dovecot をインストール

# yum -y install dovecot 

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

# vi /etc/dovecot/dovecot.conf
# 24行目:コメント解除
protocols = imap pop3 lmtp

# 30行目:コメント解除し変更 ( IPv6を使用しない場合の設定 )
listen = *
# 30行目:コメント解除し変更 ( IPv6を使用する場合の設定 )
listen = *, ::
# vi /etc/dovecot/conf.d/10-auth.conf
# 10行目:コメント解除し変更(プレーンテキスト認証も許可する)
disable_plaintext_auth = no

# 100行目:追記
auth_mechanisms = cram-md5 plain login
# vi /etc/dovecot/conf.d/10-mail.conf
# 30行目:コメント解除して追記
mail_location = maildir:/home/mailbox/virtual/%d/%n/Maildir
# vi /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
}
# vi /etc/dovecot/conf.d/10-ssl.conf
# 8行目:変更(SSLを要求)
ssl = yes

# 16-17行目:変更
ssl_cert = </etc/letsencrypt/live/domain/cert.pem
ssl_key = </etc/letsencrypt/live/domain/privkey.pem
# vi /etc/dovecot/conf.d/auth-static.conf.ext
# 21-24行目:変更
userdb {
  driver = static
  args = uid=10000 gid=10000 home=/home/mailbox/virtual/%d/%u
}
# vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext
passdb {
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/passwd
  driver = passwd-file
}

3. ユーザー認証情報ファイルの作成
/etc/dovecot/passwd ファイルを作成します。
フォーマットは「アカウント:パスワード:uid:gid::ディレクトリ位置」
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

7. マルチドメインのprocmail対応

マルチドメインでは.forward .procmailがそのままでは使えません、
そこでprocmailに渡して実行できるようにします。
ログには(delivered to maildir)から(delivered via procmail service)と記録されるように変わります。

# vi /etc/postfix/main.cf
virtual_transport = procmail
# 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
# vi /etc/procmailrc
SHELL=/bin/bash
PATH=/usr/bin:/bin
MAILDIR=/home/mailuser/virtual/$DOMAIN/$USER/Maildir
DEFAULT=$MAILDIR/
LOCKFILE=/home/mailuser/virtual/procmail.lock
LOGFILE=/home/mailuser/virtual/procmail.log

:0
* ? test -e "$MAILDIR/.procmailrc"
| /usr/bin/procmail -t -m USER=$USER DOMAIN=$DOMAIN $MAILDIR/.procmailrc
# vi /home/mailuser/virtual/[domain]/reg/Maildir/.procmailrc
SHELL=/bin/bash
PATH=/usr/bin:/bin
MAILDIR=/home/mailuser/virtual/$DOMAIN/$USER/Maildir
DEFAULT=$MAILDIR/
LOCKFILE=$MAILDIR/procmail.lock
LOGFILE=$MAILDIR/procmail.log

:0
| /usr/bin/php /home/test/test.php
# vi /etc/postfix/virtual-mailbox
reg@[domain]   [domain]/reg/Maildir/
# postmap /etc/postfix/virtual-mailbox
# postfix reload