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