【Postfix+Dovecot+SSL】2019年の終わりにあえてメールサーバーを構築する

みなさんメリークリスマス!
私はあまり風邪を引かないと自認しているのですが、それって人と触れ合っていないからじゃない?という風邪より辛い事実に気付いてしまいました。
そんなことより今回は、世の中に解説が溢れかえっているPostfix+Dovecotによるメールサーバーの構築をやってみようかなと思っております。
WEBのインフラは構築したことあるけどメール環境はやったことなかったので、勉強がてらやってみます。
2019年も終わりなのでセキュアな感じにしていきたい。

環境

さくらのVPS CentOS7
ドメイン: example.com
サーバーIP: 123.123.123.123
Postfix 2.10.1
Dovecot 2.2.36 (1f10bfa63)
certbot 1.0.0

sshで接続できていることを前提とします。
rootでの作業が多いのでrootで作業します。

DNSレコードをいじる

  • example.com
    • A
    • 123.123.123.123
  • mail.example.com
    • A
    • 123.123.123.123
  • example.com
    • MX
    • mail.example.com
  • example.com
    • TXT
    • v=spf1 +a +mx ~all

SPFレコードはこの書き方が安定ですな。

Let’s EncryptでSSL証明書を取得!

Let’s Encryptってのは無料のSSL証明書を発行してくれるやつでして、certbot(certbot-auto)はそのクライアントとなります。
これはgitで持ってきます。

# カレントディレクトリはホームフォルダ(/root)
# certbotを取得します
git clone https://github.com/certbot/certbot.git
# /root/certbot
cd certbot

certbotは証明書を取得するために80番ポートを使用します。
そのため80番ポートの解放をしましょう。

# 80番ポート(http)の解放
firewall-cmd --add-service=http --permanent

WEBサーバーなし

WEBサーバーと同居させずにただのメールサーバーとして使用するなら「standaloneモード」で証明書を取得します。
certbotが自身でWEBサーバーを立ててLet’s Encryptのサーバーとやりとりをするようです。

./certbot-auto certonly --standalone -d mail.example.com -m yourmail@gmail.com --agree-tos -n

これでmail.example.comの証明書が取得できます。

WEBサーバーあり

WEBサーバーと同居する場合には「webrootモード」で証明書を取得します。
standaloneと違って既存のWEBサーバーを使用してLet’s Encryptとやりとりをするようです。

./certbot-auto certonly --webroot -w /path/to/document_root -d mail.example.com -m yourmail@gmail.com --agree-tos -n

/path/to/document_root配下に.well-known/acme-challengeというフォルダを作ってなんかやりとりするようですよ。

証明書の所在

ls /etc/letsencrypt/live/mail.example.com/
cert.pem chain.pem fullchain.pem privkey.pem

証明書の更新をcronに登録

Let’s Encryptは確か3ヶ月とかで有効期限が切れてしまいますので、更新処理が必要となります。

# 更新処理
./certbot-auto renew

このコマンドで更新できるので、cronにこれを登録します。
今回は毎月1日の朝4時に更新をするように設定します。
また、更新の際にPostfixとDovecotを再起動します。

# cronを編集
crontab -e
00 04 01 * * /root/certbot/certbot-auto renew -q -- deploy-hook "systemctl restart postfix dovecot"

Postfix

Postfixはメールをサーバー間で配送するアプリケーションです。
巷ではメールを送信するアプリケーションって書いてたりしますが、間違ってないけど言葉足らずと感じます。
まずはインストールですね。デフォルトで入ってることもあるので入ってたら設定の項まで飛んでね。

# Postfixインストール
yum install -y postfix

# Postfixをサービスに登録
systemctl enable postfix

# Postfixをとりあえずスタートさせとく
systemctl start postfix

Postfixの設定

設定ファイルは/etc/postfixにあります。
言及のない項目に関してはデフォルトのままにしておいてください。
いじるのはmain.cfmaster.cfです。

# 設定フォルダに移動
cd /etc/postfix

# main.cfのバックアップを作成
cp main.cf main.cf.backup

# master.cfのバックアップを作成
cp master.cf master.cf.backup

多分以下の項目をセットすれば良いと思われる。
ドメイン名は適宜読み替えてね!

myhostname = mail.example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname,localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)

smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth #dovecotのsaslを使用
smtpd_sasl_type = dovecot #dovecotのsalsを使用
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_session_cache_database = btree:/var/lib/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_use_tls = true
smtpd_recipient_restrictions = 
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination
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=ORIGINATIN

これでとりあえずPostfixはOK!

Dovecot

Dovecotはメールクライアントからのリクエストに応じてメールをサーバーから手元のマシンに配信してくれます。
Dovecotはメールを受信するアプリケーションという説明がよくされていますが、こちらも言葉足らずに感じますね。

# Dovecotインストール
yum install -y dovecot

# Dovecotをサービスに登録
systemctl enable dovecot

# dovecotをとりあえずスタートさせとく
systemctl start dovecot

Dovecotの設定

設定ファイルは/etc/dovecotにあります。
Dovecotは設定ファイルがやたらと多いです。
変更するのは以下のファイルです。

  • dovecot.conf
  • conf.d/10-auth.conf
  • conf.d/10-mail.conf
  • conf.d/10-master.conf
  • conf.d/10-ssl.conf
protocols = imaps pop3s # SSLのみ対応するのでimap pop3は書きません
disable_plaintext_auth = no
auth_mechanisms = plain login
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_cert_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
mail_location = maildir:~/Maildir
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 {
  unix_listener /var/spool/postfix/private/auth {
   mode = 0660
    user = postfix
    group = postfix
  }
}

多分これで良いはず。

メールをうけるユーザーを作る

メールは[ユーザー名]@[ドメイン]という形になります。
info@example.comのメールを受け取るinfoというユーザーを作ってみようと思います。

# ユーザーの作成 メール専用のためnologin
adduser -s /sbin/nologin -d /home/info info

# ユーザーの切り替え
su - info

# パスワード設定
passwd

# メールの実体を保存するディレクトリの作成
mkdir -p ~/info/Makedir/{new,cur,tmp}

設定終わり!ポート開放しましょう。

各種アプリを起動し直して、必要なポートを開放します。
必要なポートは以下

  • imaps: 993/tcp
  • pop3s: 995/tcp
  • smtp: 25/tcp
  • smtps: 465/tcp

今時ならimap: 143/tcp、pop: 110/tcpは開けなくて大丈夫っぽい。
smtp: 25/tcpはメールの配送に使われるから開けとく必要があります。
あと各アプリをリロードして設定ファイルを読み込ませましょう。

# 開放
firewall-cmd --add-service={imaps,pop3,smtp,smtps} --permanent
firewall-cmd --reload

# 各アプリをリロード
systemctl reload postfix
systemctl reload dovecot

メーラーに設定を追加する

メーラーへの登録に必要な情報は以下

  • メールアドレス: info@example.com
  • ユーザー名: info
  • パスワード: infoユーザーのパスワード
  • 受信メールサーバー: mail.example.com
  • 受信メールサーバーのポート: 995(pop3s)
  • 送信メールサーバー: mail.example.com
  • 受信メールサーバーのポート: 465(smtps)

もし登録が突っぱねられたらサーバー側の設定がどこかおかしい可能性があります。その場合は、

# ログチェック
systemctl status postfix -l
systemctl status dovecot -l

のコマンドでログをチェックしてエラーを潰してあげてください。
あとはメールの送受信チェックをして完了となります。

やってみての感想

25番ポートは開けなくて良いと思ってましたが、サーバー間の配送には使用されるんですね。
でも思ったより難しくないですね。バーチャルメールボックスなどの設定をする際は、この状態をベースとしてやってあげると理解が早そうです。

今時はWEB用レンタルサーバーを借りるとメールサービスも含まれているのでそれに甘えてきましたが、ベースとなる技術は抑えておくべきだなと改めて思いましたよ!

まぁ安定感を求めるならメールサーバーサービスを利用した方が良いかとは思いますが、メールをトリガーにするプログラムを書きたい時にはおもろいかもしれませんね!
ではまた来週!