メールサーバ構築メモ【CentOS6.5+Postfix+Dovecot TLS/SSL】

Linux
Linux
スポンサーリンク

メールサーバ構築メモです。送信メールサーバは定番の Postfix(ポストフィックス)受信メールサーバは Dovecot (ダブコット)バージョン2を採用、Dovecotの設定方法がバージョン1から大幅に変ったため少し苦労しました。

また、送信受信メールサーバともに TLS/SSLを使うように設定することで、ユーザ名、パスワードの送出段階から以降すべての通信が暗号化されるため、安全性の高いメール通信ができます。

◎メールサーバ設定概要
 サーバアドレス:mail.apar.jp
 サーバOS:CentOS6.5
 送信サーバ:Postfix(SMTP-Auth over SSL)
 受信サーバ:Dovecot(IMAPS,POP3S)

サーバOSが CentOS7系の方は「SSLメールサーバ構築メモ(CentOS7.2)」をご参照ください。細かい部分で設定が変わっています。

MXレコードをDNSサーバに登録

メールアドレスに使用するドメイン名を、DNSサーバのMXレコードに登録しておきます。今回は「apar.jp」ドメイン名での設定になりますので、ご自分の環境に読替えてください。

Postfix と Dovecot のインストール

※バージョンは 2014年10月17日のものです。

・Postfix(2.6.6-6)

yum -y install postfix

CentOS6.5には標準でPostfixがインストールされていますので、「Package 2:postfix-2.6.6-6.el6_5.x86_64 already installed and latest version」のような表示がされればOKです。

・Dovecot(2.0.9-7)

yum -y install dovecot

サーバー用秘密鍵・自己証明書の作成(TLS/SSL用)

Postfix Dovecot 共通で使うサーバ証明書を作成します。今回は自己証明書を使って設定しますが、正規の認証局から取得するのが望ましいです。

・作成用ディレクトリに移動します
cd /etc/pki/tls/certs/

・オリジナルのMakeファイルをバックアップします
cp -ip Makefile Makefile.org

・サーバー用証明書有効期限を1年から10年に変更します
sed -i 's/365/3650/g' Makefile

・サーバー用秘密鍵・自己証明書の作成
make mail.apar.jp.crt

---(以下を入力)---------------------------
Enter pass phrase:1234(←表示されません)
Verifying – Enter pass phrase:1234(←表示されません)
Enter pass phrase for server.key:1234(←表示されません)
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:<空エンター>
Locality Name (eg, city) [Newbury]:<空エンター>
Organization Name (eg, company) [My Company Ltd]:<空エンター>
Organizational Unit Name (eg, section) []:<空エンター>
Common Name (eg, your name or your server’s hostname) []:mail.apar.jp
Email Address []:<空エンター>

・サーバー用秘密鍵からパスワード削除
openssl rsa -in mail.apar.jp.key -out mail.apar.jp.key

---(以下を入力)---------------------------
Enter pass phrase for server.key:1234(←表示されません)

・サーバー用秘密鍵の場所を変更
mv /etc/pki/tls/certs/mail.apar.jp.key /etc/pki/tls/private/

postconf コマンド

Postfixを設定するにあたって、postconf コマンドでパラメータを確認しながら進めていくのがよいでしょう。

Postfixの設定パラメータは main.cf に記述されている以外にも多数あります。全ての設定パラメータを確認するには postconf コマンドを実行します。

# postconf
2bounce_notice_recipient = postmaster
access_map_defer_code = 450
access_map_reject_code = 554
address_verify_default_transport = $default_transport
address_verify_local_transport = $local_transport
address_verify_map =
(以下省略)

postconf <パラメータ名> とすれば特定の設定のみを表示できます。

# postconf readme_directory
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

また、postconfに「-d」オプションをつけるデフォルト値が表示され、「-n」オプションをつけるとデフォルト値と異なるパラメータだけが表示されます。

# postconf -d readme_directory
readme_directory = no

# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
(以下省略)

Postfix の設定

Postfixで SMTP-Authを設定するには、SASLライブラリが必要になります。デフォルトでインストールされている Cyrus-SASL を使うことが多いのですが、今回は Dovecot SASLライブラリを使います。この Dovecot SASLライブラリを使うことで、受信アカウントのパスワードとSMTP-Authのパスワードが一元管理できます。

・念のため、元の設定ファイルをキープしておきます.
cp -ip /etc/postfix/main.cf /etc/postfix/main.cf.org

・Postfixの設定ファイルを編集(なかなか沢山あります)
vi /etc/postfix/main.cf

# このメールサーバのホスト名(FQDN)を指定
#myhostname = host.domain.tld
 ↓
myhostname = mail.apar.jp

# このメールサーバのドメイン名を指定
#mydomain = domain.tld
 ↓
mydomain = apar.jp

# メールアドレスを「ユーザ名@ドメイン名」の形式にする
#myorigin = $mydomain
 ↓
myorigin = $mydomain

# 全てのホストからメールを受信する
inet_interfaces = localhost
 ↓
inet_interfaces = all

# ipv6を無効にする
inet_protocols = all
 ↓
inet_protocols = ipv4

# mydomain = で指定したドメイン宛のメールを受信する
mydestination = $myhostname, localhost.$mydomain, localhost
 ↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 存在しないメールアドレス(ユーザ)宛のメールの受信を拒否する
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
 ↓
local_recipient_maps = proxy:unix:passwd.byname $alias_maps

# 中継を許可する宛先ドメインを指定
#relay_domains = $mydestination
 ↓
relay_domains = $mydestination

# 転送サーバを使わない
#relayhost = [an.ip.add.ress]
 ↓
relayhost =

# メールの格納フォーマットの指定
#home_mailbox = Maildir/
 ↓
home_mailbox = Maildir/

# 不要な情報を公開しない
#smtpd_banner = $myhostname ESMTP $mail_name
 ↓
smtpd_banner = $myhostname ESMTP


---(下記を最終行に追加)---------------------------
# VRFYコマンドの使用を禁止する
disable_vrfy_command = yes

# MailBoxの最大サイズの指定
# メールボックスがMaildir形式のためこの設定は無視されますが「message_size_limit」との兼ね合いのため設定しておきます
mailbox_size_limit = 204800000

# 受信メールサイズの制限「mailbox_size_limit」より少ない値を設定してください
message_size_limit = 5120000

# 接続元の制限(スパムメール対策)
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-Auth関連 ##########
# SASL認証を有効化
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/mail.apar.jp.crt
smtpd_tls_key_file = /etc/pki/tls/private/mail.apar.jp.key

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

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

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

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

# 認証を通過したものはリレーを許可する(permit_sasl_authenticated)
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

(2017年9月17日追記)RBL.JP が 2017年9月末日を持って終了されるため(これまで本当にありがとうございました!)、接続元の制限(smtpd_client_restrictions)の「reject_rbl_client all.rbl.jp」を削除いたしました。

・smtps(SMTP-Auth over SSL)を有効化
vi /etc/postfix/master.cf

---(下記を変更)---------------------------
#smtps     inet  n       -       n       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
 ↓
smtps     inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

・ルックアップテーブルの作成
postmap /etc/postfix/access

・設定に誤りがないかチェック(なにも表示されなければOKです)
postfix check

・Postfixを再起動
service postfix restart

・自動起動の設定
chkconfig postfix on

Dovecot(Version2)の設定

バージョン1では設定ファイは1つでしたが、Dovecotバージョン2では /etc/dovecot/conf.d/ 以下に設定ファイルが分かれているのが特徴です。これには賛否がありそうですね(^^;)

・受信プロトコルの設定
vi /etc/dovecot/dovecot.conf

#protocols = imap pop3 lmtp
 ↓
protocols = imap pop3

バージョン1では protocols に「imaps」や「pop3s」と書けましたが、TLS/SSLを使うか否かは次の「10-master.conf」で設定します。

vi /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    #port = 143
	 ↓
    port = 0
  }
  inet_listener imaps {
    #port = 993
    #ssl = yes
	 ↓
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    #port = 110
	 ↓
    port = 0
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
	 ↓
    port = 995
    ssl = yes
  }
}

暗号化をしない imap と pop3 を使えないようにするため「port = 0」と設定するのがミソです。なかなかのセンスですね。

・Dovecot SASL ライブラリの認証ソケットファイルを指定
vi /etc/dovecot/conf.d/10-master.conf (場所が分かりづらいかも87行目あたりです)

service auth {
 (略)
  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}
 ↓
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix        
  }
}

この設定がなかなか分からず難儀しました。こんなときは公式サイトです。
▽ Postfix and Dovecot SASL
http://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL

・認証方式の設定 
vi /etc/dovecot/conf.d/10-auth.conf

#disable_plaintext_auth = yes
 ↓
disable_plaintext_auth = no

auth_mechanisms = plain
 ↓
auth_mechanisms = plain login

※平文パスワードを許可していますが、TLS/SSLで暗号化されますので問題ありません。

・TLS/SSLの有効化とサーバ証明書と秘密鍵を指定
vi /etc/dovecot/conf.d/10-ssl.conf

#ssl = yes
 ↓
ssl = yes

#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem
 ↓
ssl_cert = </etc/pki/tls/certs/mail.apar.jp.crt
ssl_key = </etc/pki/tls/private/mail.apar.jp.key

・メールボックスの場所を指定
vi /etc/dovecot/conf.d/10-mail.conf

#mail_location = 
 ↓
mail_location = maildir:~/Maildir

・ログの出力先を変更
vi /etc/dovecot/conf.d/10-logging.conf

#log_path = syslog
 ↓
log_path = /var/log/dovecot/dovecot.log

・ログの出力先作成しておきます
mkdir /var/log/dovecot

・Dovecotを起動
service dovecot start

・自動起動の設定
chkconfig dovecot on

・認証ソケットファイルが作成されているのを確認します
ls -F /var/spool/postfix/private/auth

---(下記表示があればOK)---------------------------
/var/spool/postfix/private/auth =

ログのローテーション設定

ログの設定は必須ではありませんが、メールサーバの運用ではログを参照することが多かと思いますので、運用しやすいように設定しておくのをお勧めします。

下の設定では1日ごとにログファイルを分けて、ファイル名に日付が付くように設定しています。ログファイルの保存期間は60日としていますが、運用ルールに合わせて設定してください。

Postfixログの設定

・出力先ディレクトリ作成
mkdir /var/log/mail

・出力先の変更
vi /etc/rsyslog.conf

mail.*                                                  -/var/log/maillog
                       ↓
mail.*                                                  -/var/log/mail/maillog

・syslog再起動
service rsyslog restart

・不要なログを削除
rm -f /var/log/maillog*

・ログローテーション設定
vi /etc/logrotate.d/syslog

---(下記を削除)---------------------------
/var/log/maillog
------------------------------

vi /etc/logrotate.d/maillog

---(下記を追加)---------------------------
/var/log/mail/maillog {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

・確認します
logrotate -dv /etc/logrotate.d/maillog
 ↓下記のような表示であればOKです

rotating pattern: /var/log/mail/maillog  after 1 days (60 rotations)
empty log files are rotated, old logs are removed

 

Dovecotログの設定

vi /etc/logrotate.d/dovecot

---(下記を追加)---------------------------
/var/log/dovecot/dovecot.log {
    daily
    missingok
    dateext
    rotate 60
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/dovecot/master.pid 2>/dev/null` 2> /dev/null || true
    endscript
}

・確認します
logrotate -dv /etc/logrotate.d/dovecot
 ↓下記のような表示であればOKです

rotating pattern: /var/log/dovecot/dovecot.log  after 1 days (60 rotations)
empty log files are rotated, old logs are removed

メールアカウントの作成

メールアカウントの作成は普通に UNIXユーザを作成するだけでOK、Cyrus SASL本当に便利です。

下記はメールアカウント「sample@apar.jp」を作成しています。シェルは「/sbin/nologin」としておくのがよいでしょう。

useradd -s /sbin/nologin sample
passwd sample
ユーザー sample のパスワードを変更。
新しいパスワード: <←パスワードを入力>
新しいパスワードを再入力してください: <←パスワードを入力>
passwd: 全ての認証トークンが正しく更新できました。

メールクライアント(Thunderbird)設定

手動設定でメールサーバを設定し「完了」ボタンをクリックします。※「再テスト」をクリックしても自己証明書を使っているためエラーとなります。
メールクライアント(Thunderbird)の設定画面

 

自己証明書をつかっているため、下のような警告が表示されます。「セキュリティ例外を承認」をクリックします。また、はじめてメールを送信するときにも同じような警告が表示されます。
自己証明書利用の警告表示

第三者中継チェック

メールサーバが誰にでも送信に使われてしまうと、迷惑メールやフィッシングメールの温床になります。メール送信サーバ(Postfix)の設定が終わったら必ず第三者中継チェックを行いましょう。

メールサーバ以外のホストから、telnet コマンドでメールサーバの25番ポート(SMTP)に接続します。※ほとんどの家庭向けプロバイダはOP25B規制(迷惑メール対策のため25番ポートへの接続を禁止)を実施していますので、OP25B規制のない企業向けプロバイダもしくは別のサーバから接続する必要があります。

telnet mail.apar.jp 25

(CentOS7 などで telnet コマンドがインストールされていない場合は、「yum -y install telnet」でインストールできます)

接続ができたら青文字の部分を入力し、メールサーバに設定したドメイン名(mydomain)以外のメールアドレスに送信できないことを確認します。

Trying 192.0.2.1...
Connected to mail.apar.jp.
Escape character is '^]'.
220 mail.apar.jp. ESMTP
 
mail from: sample@apar.jp ←送信元メールアドレス
 
250 2.1.0 Ok
 
rcpt to: test@example.org ←送信先の別ドメインのメールアドレス
 
454 4.7.1 <test@example.org>: Relay access denied ←この表示がされればOKです、第三者中継が拒否されています。
 
quit ← 接続終了
 

送信ドメイン認証の設定(SPF/DKIM)

今や必須になりつつある送信ドメイン認証の SPF と DKIM の設定もあわせて行うことをおすすめします。

▽ SPFレコードを Amazon Route 53 に登録する
https://blog.apar.jp/linux/737/

▽ Postfix SPF 認証 設定メモ(postfix-policyd-spf-python)
https://blog.apar.jp/linux/766/

▽ Postfix DKIM 認証 設定メモ(CentOS6.5+OpenDKIM)
https://blog.apar.jp/linux/856/

コメント

  1. ConoHaでメールサーバを構築する | テトシスの備忘録 より:

    […] 参考にしたのはこちらとこちらとこちら […]

タイトルとURLをコピーしました