Help us understand the problem. What is going on with this article?

Let's Encryptを使ったセキュアなメールサーバの構築(Cent OS7 + Postfix + Dovecot)

More than 3 years have passed since last update.

はじめに

自分のドメインを利用したメールサーバの構築方法は、インターネットを探せばいくらでも転がっています。
しかしながら、

  • OSのバージョンなどを理由とした情報の古さ
  • Let's Encryptとサービスの連携自体がまだ多く見られない

→自分で記事を作ってしまおう
というおはなしに。

この記事では表題通りの運用が最低限可能というレベルを前提としていますので、もしプラスアルファの設定が必要な場合は別途各自で追加するようにしてください。

前提条件

  • CentOS 7にsudo権限のあるユーザが発行されていること
  • DNSレコードをA、MXともに適切に設定済みであること(今回の例ではA:example.com, MX:mail.example.com)
  • SELinuxやFirewalldの設定は既に済んでいること

おもにやること

  • SSL証明書の取得
  • 送信メールサーバ(Postfix)の導入と設定
  • 受信メールサーバ(Dovecot)の導入と設定

1. Let's Encryptでラクラク証明書発行

Let's Encryptはmozilla、Akamai、Cisco、Google、Facebookなどををはじめとした大手IT企業の支援を受けて2014年に創設されたプロジェクトで、個人でも信頼されたサーバ証明書を無料で発行することができます。

※導入前に、自分のサーバーでWebサーバが動いている場合は落とします。

sudo yum list installed gitとしてgitが入ってるかを確認
無ければsudo yum -y install gitとしてインストールします。
続けて、

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/
./letsencrypt-auto --help

これで鍵作成の準備はOKです。
必要に応じてsudo用のパスワードを要求されるので入れてあげましょう。

./letsencrypt-auto certonly --standalone \
-d mail.example.com \
-m 管理用メールアドレス@example.com \
--agree-tos

と入力すれば自動で鍵作成のセットアップが始まります。
-d以下は自分が取得したドメインに合わせて変更してください。
セットアップ終了後、/etc/letsencrypt/live/cloud.example.jp/fullchain.pemのような形でファイルが作成されます。

2. Postfixを入れよう

sudo yum -y install postfixするだけ。
といってもCentOSの場合デフォで入ってると思います!

設定ファイルを以下のように編集します

/etc/postfix/main.cf
#myhostname = host.domain.tld
 ↓
myhostname = mail.example.com

#mydomain = domain.tld
 ↓
mydomain = example.com

#myorigin = $mydomain
 ↓
myorigin = $mydomain

inet_interfaces = localhost
 ↓
inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, localhost
 ↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain


#home_mailbox = Maildir/
 ↓
home_mailbox = Maildir/

#smtpd_banner = $myhostname ESMTP $mail_name
 ↓
smtpd_banner = $myhostname ESMTP


以下をファイルの最後に追記

smtpd_sasl_auth_enable = yes

smtpd_sasl_type = dovecot

smtpd_sasl_path = private/auth

smtpd_use_tls = yes

smtp_tls_security_level = may

smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

smtpd_tls_loglevel = 1

smtpd_tls_received_header = yes

smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

smtpd_tls_session_cache_timeout = 3600s

smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

続いて、

/etc/postfix/master.cf
#smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
 ↓
smtps     inet  n       -       n       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

以上を変更した後に、以下コマンドを入力

postmap /etc/postfix/access
postfix check

何もエラーが表示されなければ

systemctl start postfix
systemctl enable postfix

これでpostfixの設定は終了。

3. Dovecotを入れよう

まずはsudo yum -y install dovecotでインストールしてから各種設定ファイルをガリガリいじっていきます。

/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
  }
}
/etc/dovecot/conf.d/10-master.conf
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        
  }
}
/etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = yes
 ↓
disable_plaintext_auth = no

auth_mechanisms = plain
 ↓
auth_mechanisms = plain login
/etc/dovecot/conf.d/10-ssl.conf
ssl = required
 ↓
ssl = yes

#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
#ssl_key = </etc/pki/dovecot/private/dovecot.pem
 ↓
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
/etc/dovecot/conf.d/10-mail.conf
#mail_location = 
 ↓
mail_location = maildir:~/Maildir

最後にDovecotを起動させましょう。

systemctl start dovecot
systemctl enable dovecot

受信サーバはこれだけ。

3. 最後にアカウントの配布

useradd -s /sbin/nologin user
passwd user

4. クライアントでの設定

Thunderbirdを例に...

be899293f9f3b7ed4c1a5a86a599cd05.png

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away