0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EC2でPostfix+Dovecotメールサーバを構築しSPF/DKIM/DMARCまで設定する

0
Posted at

EC2でPostfix+Dovecotによるメールサーバ構築

はじめに

先日からAWSの勉強もかねてEC2でいろいろ遊んでいるのでその一環として、PostfixとDovecotを使用してメールサーバを構築&SPF・DKIM・DMARCの設定までの手順をまとめました。(SESを使うほうがおそらく簡単だとは思うのですが・・・)

構成概要

本記事で構築するメールサーバの構成は以下の通りです。

  • MTA(Mail Transfer Agent): Postfix
    • メールの送受信や配送を担当
  • MDA/IMAP・POPサーバー(Mail Delivery Agent): Dovecot
    • メールの保存と取り出しを担当
  • 暗号化: SSL/TLS証明書(Let's Encrypt)
  • 認証: SASL認証(Dovecot経由)
  • 送信認証: SPF、DKIM、DMARC

前提条件

  • EC2インスタンスを使用(Amazon Linux 2023・t4g.microを想定)
    • EC2はパブリックサブネットに配置・NATゲートウェイ・NLBなどは使用していません。
  • 独自ドメインを取得済み(ここではexample.jpとする。)
  • Route53でDNS管理を行っている

構築手順

1. Elastic IPと逆引きDNSの設定

Elastic IPの払い出し

EC2インスタンスに固定IPアドレスを割り当てます。

  1. EC2コンソール → Elastic IP → Elastic IPアドレスを割り当て
  2. インスタンスに関連付け

逆引きDNSの設定

逆引きDNSレコード(PTRレコード)を設定することで、メールサーバの信頼性が向上します。

  1. Route53でAレコードを作成
    • レコード名: mail.example.jp
    • 値: Elastic IPアドレス
  2. EC2コンソール → Elastic IP → アクション → 逆引きDNSレコードを更新
    • Elastic IPアドレス: 払い出したElastic IP
    • 逆引きDNS: mail.example.jp

2. EC2のメール送信制限について

AWSではスパム対策のため、デフォルトでEC2からの25番ポート(SMTP)送信が制限されています。

25番ポート制限解除の申請

このURLから申請可能です。

注意点:

  • 利用実績が少ないアカウントの場合、申請が却下される可能性があります。私自身1度目の申請では却下され、翌日に利用用途を詳しく書いて再申請したら承認されました。
    Pasted image 20260301151652.png

3. hostnameの設定

cloud-initによるhostname上書きを防ぐため、ホスト名を変更

sudo vim /etc/cloud/cloud.cfg
# 以下の行を変更
preserve_hostname: false

preserve_hostname: true

hostnameを設定します。

sudo hostnamectl set-hostname mail.example.jp

4. SSL/TLS証明書の取得

Let's Encryptを使用してSSL/TLS証明書を取得します。

# Nginxが起動している場合は一時的に停止
sudo systemctl stop nginx

# 証明書を取得
sudo certbot certonly --standalone -d mail.example.jp

証明書は以下のパスに保存されます。

/etc/letsencrypt/live/mail.example.jp/fullchain.pem
/etc/letsencrypt/live/mail.example.jp/privkey.pem

証明書の自動更新設定

cronで証明書の自動更新を設定します。

sudo crontab -e

以下を追加します。

0 0 1 * * /usr/bin/certbot renew --quiet && systemctl reload postfix && systemctl reload dovecot

5. Postfixのインストールと設定

インストール

sudo dnf install postfix -y

main.cfの設定

/etc/postfix/main.cf を編集します。

sudo vim /etc/postfix/main.cf

以下の内容を追記・変更します。

mail_owner = postfix
myhostname = mail.example.jp
mydomain = mail.example.jp
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
mynetworks_style = subnet
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop

# TLS/SSL設定
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.jp/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.jp/privkey.pem
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1

# SASL認証設定
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

# アクセス制限
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# ログ設定
maillog_file = /var/log/mail/maillog

master.cfの設定

/etc/postfix/master.cf に以下を追記します。

sudo vim /etc/postfix/master.cf
smtps     inet  n       -       y       -       -       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_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

エイリアスの再構築と起動

# エイリアスの再構築(おそらく今回は実行しなくても問題ない)
sudo newaliases

# 設定のチェック(書き方におかしいところがあればエラーとして出てくる)
sudo postfix check

# ログディレクトリの作成
sudo mkdir -p /var/log/mail
sudo touch /var/log/mail/maillog
sudo chmod 640 /var/log/mail/maillog

# 起動
sudo systemctl start postfix
sudo systemctl enable postfix

6. Dovecotのインストールと設定

インストール

sudo dnf install dovecot -y

dovecot.confの設定

/etc/dovecot/dovecot.conf を編集します。

sudo vim /etc/dovecot/dovecot.conf
protocols = imap

10-master.confの設定

/etc/dovecot/conf.d/10-master.conf を編集します。

sudo vim /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 = 0
  }
}

service submission-login {
  inet_listener submission {
    port = 0
  }
  inet_listener submissions {
    port = 0
  }
}

# Postfix SASL認証用のソケット
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
}

10-auth.confの設定

sudo vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login

10-ssl.confの設定

sudo vim /etc/dovecot/conf.d/10-ssl.conf

DHパラメータを生成します(5分くらいかかりました。)

sudo openssl dhparam 4096 > /etc/dovecot/dh.pem
ssl = yes
ssl_cert = </etc/letsencrypt/live/mail.example.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.jp/privkey.pem
ssl_dh = </etc/dovecot/dh.pem
ssl_min_protocol = TLSv1.2

10-mail.confの設定

sudo vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

10-logging.confの設定

sudo vim /etc/dovecot/conf.d/10-logging.conf
log_path = /var/log/dovecot/dovecot.log
info_log_path = /var/log/dovecot/dovecot.log

ログディレクトリの作成と起動

# ログディレクトリ作成
sudo mkdir /var/log/dovecot

# 起動
sudo systemctl start dovecot
sudo systemctl enable dovecot

7. メール受信用のユーザ作成

メールアドレスは ユーザ名@ドメイン名 の形式になります。

# ユーザ作成
sudo useradd mailuser
sudo passwd mailuser

# Maildirディレクトリ作成
sudo mkdir -p /home/mailuser/Maildir/{new,cur,tmp}
sudo chown -R mailuser:mailuser /home/mailuser/Maildir

8. DNS設定(SPF/DKIM/DMARC)

メール送信の信頼性を高めるため、SPF、DKIM、DMARCレコードを設定します。

SPFレコードの設定

Route53でTXTレコードを追加します。

  • レコード名: mail.example.jp
  • レコードタイプ: TXT
  • 値: v=spf1 ip4:割り振られたElasticIPアドレス/32 -all

DKIMの設定

OpenDKIMをインストールして鍵を生成します。

# インストール
sudo dnf install -y opendkim opendkim-tools

# ディレクトリ作成
sudo mkdir -p /etc/opendkim/keys/mail.example.jp

# 鍵生成
sudo opendkim-genkey -D /etc/opendkim/keys/mail.example.jp/ \
  -d mail.example.jp -s 20260301

# 権限設定
sudo chown -R opendkim:opendkim /etc/opendkim/keys/mail.example.jp/

生成された公開鍵をDNSに登録します。

cat /etc/opendkim/keys/mail.example.jp/20260301.txt

Route53でTXTレコードを追加します。

  • レコード名: 20260301._domainkey.mail.example.jp
  • レコードタイプ: TXT
  • 値: 上記コマンドで表示された内容

OpenDKIM設定ファイルを編集します。

sudo vim /etc/opendkim.conf
Mode sv
KeyFile /etc/opendkim/KeyTable
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
SoftwareHeader no
Socket inet:8891@localhost

KeyTableを設定します。

sudo vim /etc/opendkim/KeyTable
20260301._domainkey.mail.example.jp mail.example.jp:20260301:/etc/opendkim/keys/mail.example.jp/20260301.private

SigningTableを設定します。

sudo vim /etc/opendkim/SigningTable
*@mail.example.jp 20260301._domainkey.mail.example.jp

TrustedHostsを設定します。

sudo vim /etc/opendkim/TrustedHosts
127.0.0.1
::1

Postfixに設定を追加します。

sudo vim /etc/postfix/main.cf
# 以下を追加
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

OpenDKIMを起動します。

sudo systemctl start opendkim
sudo systemctl enable opendkim
sudo systemctl restart postfix

DMARCレコードの設定

Route53でTXTレコードを追加します。

  • レコード名: _dmarc.mail.example.jp
  • レコードタイプ: TXT
  • 値: v=DMARC1; p=none; sp=reject; adkim=s; aspf=s; rua=mailto:mailuser@mail.example.jp

9. セキュリティグループ設定

EC2のセキュリティグループで以下のポートを開放します。

ポート プロトコル 用途
25 TCP SMTP(受信用)
465 TCP SMTPS(送信用)
993 TCP IMAPS(受信メール取得用)

Route53に登録するDNSレコード一覧

  • example.jpに対するMXレコード
    • レコードの内容:mail.example.jp
  • mail.example.jpのAレコード
    • レコードの内容:EC2に割り当てられたElasticIP
  • mail.example.jpのTXTレコード(SPFレコード)
    • レコードの内容:v=spf1 ip4:[割り振られたElasticIP]/32 -all

SPF・DKIM・DMARCの動作チェック

  • テストもかねて今回構築したメールサーバからGmailあてにメールを送信してみました。
    • 以下のようにすべてpassしていることを確認できました。
      Pasted image 20260303000907.png

今後の方針

  • fail2banなどの利用によるセキュリティ強化

まとめ

EC2上でPostfixとDovecotを使用してメールサーバを構築する手順を解説しました。
やはり実際に触ることで理解度がかなり向上しますね。特にSPF・DKIM・DMARCや通信の流れなどは構築する中で動作のイメージがより鮮明にできたような気がします。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?