UNIXCentOSMailサーバー Postfix

メールサーバー(Postfix+Dovecot) 構築

更新日:2017年12月29日

メールサーバー構築

メールサーバーはインターネットを通じて電子メールを送受信するためのサーバーアプリケーションプログラム:Message Transfer Agent (MTA)です。
MTAは、Sendmail, Postfix, QMail, Microsoft Exchange Server がありますが、Linuxで最も一般的で現在も開発が盛んな Postfix とセキュリティが強固な 受信サーバー Dovecot をインストールしましょう。

Postfix インストール

postfix が CentOS にあらかじめインストールされていないか確認しましょう。インストールされていなければ出力されません。

# rpm -qa | grep postfix

インストールされていなければインストールしましょう。

# yum -y install postfix

設定ファイルを編集しましょう。
メール送信を暗号化する場合は、秘密鍵・公開鍵ファイル(TLS/SSL関連)も設定しましょう。
ファイルの作成方法については セキュリティ証明 OpenSSL に記載しています。

# vi /etc/postfix/main.cf
...
# メールサーバーFQN名を追加
myhostname = mail.kentokyo.com
...
# メールサーバードメイン名を追加
mydomain = kentokyo.com
...
# ローカルユーザーからのメールを外部に配送する場合は@とドメイン名を追加
myorigin = $mydomain
...
# 外部からのメール受信を許可に変更
inet_interfaces = all
#inet_interfaces = localhost
...
# $mydomain宛てのメールを受信
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
...
# 存在しないメールアドレス(ユーザ)宛のメールの受信を拒否
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
...
# メールボックスの形式をMaildirに変更
home_mailbox = Maildir/
...
# 接続されたときにメールサーバーソフト名を表示させないように
smtpd_banner = $myhostname ESMTP unknown
...
# VRFYコマンドの使用を禁止
disable_vrfy_command = yes
# 接続元の制限(スパムメール対策)
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/access
reject_rbl_client zen.spamhaus.org
reject_non_fqdn_sender
reject_unknown_sender_domain

# エンベロープアドレス(MAIL FROM)による制限(スパムメール対策)
smtpd_sender_restrictions =
reject_rhsbl_sender zen.spamhaus.org
reject_unknown_sender_domain

# SMTP認証設定有効に
smtpd_sasl_auth_enable = yes

# Dovecot SASL ライブラリを指定
smtpd_sasl_type = dovecot

# Dovecot SASL ライブラリの認証ソケットファイル /var/spool/postfix/ からの相対パスで記述
smtpd_sasl_path = private/auth

# 古いバージョンの AUTH コマンド (RFC 2554) を実装した SMTP クライアントとの相互運用性を有効にする
broken_sasl_auth_clients = yes

########## TLS/SSL関連 ##########
# TLSを有効化
smtpd_use_tls = yes

# 宛先のメールサーバがTLSに対応していれば、通信を暗号化する
smtp_tls_security_level = may

# サーバ証明書と秘密鍵を指定
smtpd_tls_cert_file = /etc/pki/tls/certs/newcert.pem
smtpd_tls_key_file = /etc/pki/tls/private/newkey.pem

# TLSログレベルの設定
# 0:出力しない 1:TLSハンドシェイクと証明書情報 2:TLSネゴシエーションの全て
smtpd_tls_loglevel = 1

# 暗号に関する情報を "Received:" メッセージヘッダに含める
smtpd_tls_received_header = yes

# 接続キャッシュファイルの指定
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

# キャッシュの保持時間の指定
smtpd_tls_session_cache_timeout = 3600s

# 認証を通過したものはリレーを許可する(permit_sasl_authenticated)
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
# vi /etc/postfix/master.cf
...
# SUBMISSIONポート、SMTPSを有効にします
submission inet n - n - - smtpd
# SUBMISSIONポートでSMTP認証を有効にします" -o"の前に
# 必ず一つ以上の半角スペースを入れておいてください。入れないと起動でエラーになります。
-o smtpd_sasl_auth_enable=yes
...
smtps inet n - n - - smtpd
...
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

メールボックスの形式をMaildir にしたので既存のユーザーと新規ユーザーのメールボックスを変更しましょう。
作成するときにそのユーザーがオーナーとして、パーミッションは700でないと配信されません。
まず、root ユーザーのメールボックスを作成します。

# mkdir -p /root/Maildir/{cur,new,tmp}
# chown root:root -R /root/Maildir
# chmod 700 /root/Maildir

既存ユーザーのメールボックスを作成します。

# mkdir -p /home/ken/Maildir/{cur,new,tmp}
# chown ken:ken -R /home/ken/Maildir
# chmod 700 /home/ken/Maildir

新規ユーザーに対しては/etc/skel配下にひな形のメールボックスを作成しておけば、ユーザーを作成した際に自動で配置されます。

# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/

SMTP認証設定

メールを正しく配送するための設定が必要になります。
設定例では以下の条件で作成しています。

SMTP認証アプリケーションインストール

cyrus-saslをインストールします。

# yum -y install cyrus-sasl

saslを起動し、自動起動まで設定します。
CentOS 7 の場合

# systemctl start saslauthd
# systemctl enable saslauthd

CentOS 6 の場合

# /etc/rc.d/init.d/saslauthd start
# chkconfig saslauthd on

存在しないユーザーへのメールは一旦メールキューに溜まってしまい、サーバーに負荷を掛けるため破棄するようにしましょう。

# vi /etc/postfix/main.cf
...
# 以下を最終行へ追加して、存在しないユーザー宛メールを unknown_user へ配送します。
local_recipient_maps =
luser_relay = unknown_user@localhost

unknown_user に配送されたメールを破棄するように /etc/aliases に追加して設定を反映します。

# echo unknown_user: /dev/null >> /etc/aliases
# newaliases

メールサーバー起動

Postfix サーバーを起動し、自動起動を有効にしましょう。
CentOS 7 の場合は

# systemctl start postfix.service
# systemctl enable postfix.service

CentOS 6 の場合は

# /etc/rc.d/init.d/postfix start
# chkconfig postfix on

もし、Postfix サーバーを起動出来なかった場合は、状態を確認しエラーの箇所を修正します。

# systemctl status postfix.service
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2017-11-29 21:09:20 JST; 6s ago
Process: 2314 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Process: 2310 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
Process: 2300 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
Main PID: 2385 (master)
CGroup: /system.slice/postfix.service
...

メールサーバー公開

メールサーバーをインターネット上で公開しましょう。
また、ファイアーウォールが開いていないなら、smtpポートを開きます。
ルータのポートも開いておいてください。

# /sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# /sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# /sbin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# /sbin/iptables -A INPUT -p tcp --dport 465 -j ACCEPT
# /sbin/iptables -A INPUT -p tcp --dport 587 -j ACCEPT
# /sbin/iptables -A INPUT -p tcp --dport 993 -j ACCEPT
# /sbin/iptables -A INPUT -p tcp --dport 995 -j ACCEPT
# firewall-cmd --add-service=smtp
# firewall-cmd --add-service=pop3 --permanent
# firewall-cmd --add-port=143/tcp --permanent
# firewall-cmd --add-port=465/tcp --permanent
# firewall-cmd --add-port=587/tcp --permanent
# firewall-cmd --add-port=993/tcp --permanent
# firewall-cmd --add-port=995/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-ports
25/tcp 587/tcp 465/tcp 993/tcp 995/tcp

Dovecot のインストール

インストール

POP/IMAP サーバー Dovecot をインストールしましょう。

# yum -y install dovecot

設定

受信プロトコルを POP/IMAP 両方に対応できるように設定ファイルを編集しましょう。

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

暗号化通信 imaps と pop3s を有効にし、imap と pop3 を無効化しましょう。
また、Dovecot に SASL ライブラリの認証ソケットファイルを指定しましょう。
平文で受信する pop3 と imap を使用しないのであれば、それぞれの port = 0 とします。

# vi /etc/dovecot/conf.d/10-master.conf
...
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
...
service auth {
...
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}

認証方式を設定しましょう。

# vi /etc/dovecot/conf.d/10-auth.conf
...
disable_plaintext_auth = no
...
auth_mechanisms = plain login
...

SSL/TLS を有効化してサーバ証明書と秘密鍵を指定しましょう。
ファイルの作成方法については セキュリティ証明 OpenSSL に記載しています。

# vi /etc/dovecot/conf.d/10-ssl.conf
...
ssl = yes
...
ssl_cert = </etc/pki/tls/certs/newcert.pem
ssl_key = </etc/pki/tls/private/newkey.pem
...

メールボックスを設定しましょう。

# vi /etc/dovecot/conf.d/10-mail.conf
...
mail_location = maildir:~/Maildir
...

メールログを設定しましょう。

# vi /etc/dovecot/conf.d/10-logging.conf
...
log_path = /var/log/dovecot.log
...