GreenSnap TECH BLOG

GreenSnapのエンジニアチームの取り組みや使っている技術を紹介します

AmazonLinux2にメールサーバーを構築する(SPF,DKIM,DMARC,TLS対応)

はじめに

2024年2月より、Googleのメール送信者のガイドラインが変更になります。
Gmailアカウントに1日あたり5,000件を超えるメールを送信する送信者は、送信ドメインにSPFレコード・DKIM署名・DMARCメール認証の設定が必要になりました。
support.google.com

1日あたり5,000件を超えるという条件に入っていなくとも、迷惑メールとして受信される確率を減らすために対応しておいたほうが良いでしょう。
この記事では、クラウドメール配信のSaaSが使用できない方向けに、AWSのEC2インスタンス上でSPF、DKIM、DMARC、TLSに対応したメールサーバーを構築する方法を紹介します。

やることのフローとしては以下の項目になります。

  • メールサーバー用のEC2インスタンスの立ち上げ
  • 逆引きレコードの設定
  • postfixのインストール
  • SPFレコードの設定
  • DKIMの設定
  • DMARCの設定
  • Let's EncryptでTLS化
  • 設定がうまくいってるか確認
  • トラブルシューティング

EC2インスタンスを立ち上げる

まずはじめにメールサーバーとして稼働させるEC2インスタンスをAWSのコンソールから立ち上げてください。
本記事ではAmazonLinux2、インスタンスタイプを「c5.large」を前提に進めます。
メールサーバーの負荷に応じてインスタンスのサイズは変更してください。

逆引きレコードの設定

メールサーバーに逆引きレコードを設定するため、Elastic IPを割り当てます。

次に、Route53からメールのFromドメインとなるホストゾーンを作成します。本記事ではホストゾーンの記述を「xxxxx.xxx」にしているので環境に合わせて変更してください。
作成したホストゾーンにAレコードを追加します。

レコード名にサンプルとして「mail」値にはElastic IPのPublicIPアドレスを入力してください。

再びElastic IPの設定画面へ行き、先程EC2インスタンスに関連付けたElastic IPの
「逆引きDNSを更新」をします。
Route53の反映に時間がかかるかもしれませんが、成功すれば「逆引きレコードDNSレコード」の項目が入力されます。

postfixのインストール

これより以下に登場するコマンドはすべてrootユーザーで実行することを想定しています。
以下のコマンドを実行し、Postfixをインストールします。Amazon Linux 2では通常、Postfixがプリインストールされていますので必要ないかもしれません。

yum update
yum install postfix
systemctl start postfix
systemctl enable postfix

/etc/postfix/main.cfの編集

Postfixの初期設定を行います。最低限以下の部分を設定してください。

myhostname = mail.xxxxx.xxx(逆引きDNS名)
mydomain = xxxxx.xxx(Route53のホストゾーンのドメイン名)
mydestination = $myhostname, localhost
mynetworks = 127.0.0.0/8, XXX.XXX.XXX.XXX(メールサーバーと連携するEC2インスタンスなどがあればそのIPアドレスやVPCのCIDRなど)

SPFレコードの追加

Route53のホストゾーンにTXTレコードを以下のように追加します。SPFの対応はこれだけで完了です。

DKIMの設定

opendikmを利用して、秘密鍵と公開鍵を作成します。

amazon-linux-extras install epel -y
yum install opendkim opendkim-tools -y
systemctl start opendikm
systemctl enable opendkim
鍵を作成するディレクトリを作成
mkdir /etc/opendkim/keys/xxxxx.xxx
cd /etc/opendkim/keys/xxxxx.xxx

鍵を作成
opendkim-genkey -d xxxxx.xxx -s mail
オーナー変更
chown -R opendkim:opendkim /etc/opendkim/keys

/etc/opendkim/keys/xxxxx.xxx/ ディレクトリにdefault.privateとdefault.txtが作成されていれば成功です。

/etc/opendkim.confの編集

Mode    sv ← svに変更

#KeyfileではなくKeyTableを利用する。
#KeyFile        /etc/opendkim/keys/default.private   ←コメントアウト
KeyTable        refile:/etc/opendkim/KeyTable   ←コメントイン

#署名するドメインの指定を可能とする。
SigningTable    refile:/etc/opendkim/SigningTable   ←コメントイン

#外部ホストの特定
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts   ←コメントイン

#内部ホストの特定
InternalHosts   refile:/etc/opendkim/TrustedHosts   ←コメントイン

/etc/opendkim/KeyTableファイルの編集

# OPENDKIM KEY TABLE
# To use this file, uncomment the #KeyTable option in /etc/opendkim.conf,
# then uncomment the following line and replace example.com with your domain
# name, then restart OpenDKIM. Additional keys may be added on separate lines.

mail._domainkey.xxxxx.xxx xxxxx.xxx:mail:/etc/opendkim/keys/xxxxx.xxx/mail.private

/etc/opendkim/SigningTableファイルの編集

SigningTableには電子署名を行う送信元アドレスを指定します。

*@xxxxx.xxx mail._domainkey.xxxxx.xxx ←追加

/etc/opendkim/TrustedHostsファイルを必要に応じて編集

メールサーバー自身がメールを送信する場合は編集不要です。
他サーバーからSMTPでメールを送信する場合は必要です。

# OPENDKIM TRUSTED HOSTS
# To use this file, uncomment the #ExternalIgnoreList and/or the #InternalHosts
# option in /etc/opendkim.conf then restart OpenDKIM. Additional hosts
# may be added on separate lines (IP addresses, hostnames, or CIDR ranges).
# The localhost IP (127.0.0.1) should always be the first entry in this file.
127.0.0.1
#メール送信を受け付ける他のEC2インスタンスのホストやVPCのCIDRなど必要に応じて追加してください
xxx.xxx.xxx.xxx
::1
#host.example.com
#192.168.1.0/24

opendkim再起動

systemctl reload opendkim

/etc/postfix/main.cfの編集

/etc/postfix/main.cfに以下を追加

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:localhost:8891
milter_default_action = accept

postfixの再起動

systemctl reload postfix

Route53にDKIMのレコード追加

DKIMのkeyを確認
cat /etc/opendkim/keys/xxxxx.xxx/default.txt

以下のようなテキストがあるのでカッコの中身をRoute53に追加

mail._domainkey  IN  TXT ( "v=DKIM1; k=rsa; "
      "p=*********************************" )  ; ----- DKIM key default for xxxxx.xxx

DMARCの設定

Route53にレコードをTXTレコードを追加するだけです。

DMARCレコードは、以下の要素で構成されます:

  • バージョン(v): DMARCのバージョンを指定します。通常は "DMARC1" と記載されます。
  • ポリシー(p): ドメインのメールがDMARC検証に合格しなかった場合の取扱いを指定します。「none」、「quarantine」、「reject」のいずれかを設定できます。
  • SPFとDKIMの両方に合格する必要性(adkim、aspf): これらのタグは、SPFとDKIMがどの程度厳密にチェックされるべきかを指定します。通常は "r"(リラックス)または "s"(ストリクト)で指定されます。
  • サブドメインポリシー(sp): メインドメインとは異なるポリシーをサブドメインに適用する場合に使用します。
  • パーセンテージ(pct): ポリシーを適用するメールの割合を指定します。
  • レポートの送信先(rua、ruf): DMARC集計レポートと失敗レポートの受信先をメールアドレスで指定します。

Let's EncryptでTLS化

メールをTLS化します。
必要に応じて、セキュリティグループから80 と 443 ポートを許可してください。 もしかしたら環境によっては工夫が必要なところかもしれませんが何とかして発行します。

yum install certbot
certbot certonly --standalone -d xxxxx.xxx

成功すれば2つのファイルが作成されます。 - /etc/letsencrypt/live/xxxxx.xxx/fullchain.pem - /etc/letsencrypt/live/xxxxx.xxx/privkey.pem

/etc/postfix/main.cfの編集

以下を追加する

smtpd_tls_cert_file = /etc/letsencrypt/live/xxxxx.xxx/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/xxxxx.xxx/privkey.pem
smtpd_use_tls = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may

postfixの再起動

systemctl reload postfix

設定がうまくいっているか確認

ここまで駆け足で設定して来ましたが最後に実際にメールをメールサーバー経由で送信して設定がうまくいっているか確認します。 実際にメールサーバー経由で送信されたメールを試しにGmailアカウントへ送信し、受信したメールのソースを確認します。
SPF、DKIM、DMARCがそれぞれPASSになっていれば成功です。 また暗号化のアイコンが 灰色(TLS - 標準的な暗号化)TLS(標準的な暗号化)になっていること確認します。 送受信時のメールの暗号化 - Gmail ヘルプ

トラブルシューティング

メールが送信されない

  • /var/log/maillog を確認してエラーが出ていないか確認してください。エラー内容に沿って修正してください
  • ps aux | grep postfix でpostfixのプロセスがあるか確認してください。postfixを起動してください
  • 他のサーバーのアプリケーションからプログラム上でSMTPでメールサーバーと連携している場合、mynetworksにそのアプリケーションのサーバーのプライベートIPアドレスの記述があるか確認してください

SPFがPASSにならない

  • Route53にSPFレコードが追加されているか確認してください

DKIMがPASSにならない

  • /var/log/maillogopendkim not authenticated のようなログが出ているか確認してください。でている場合は何かしら設定がおかしいはずです
  • Route53 に DKIMのレコードが追加されているか確認してください
  • /etc/postfix/main.cf にsmtpd_miltersやnon_smtpd_miltersの設定があるか確認してください
  • 他のサーバーのアプリケーションからプログラム上でSMTPでメールサーバーと連携している場合、TrustedHostsにアプリケーションのサーバーのPrivateIPアドレスの記述があるか確認してください
  • SigningTableに記述しているドメイン名とメールの送信元ドメインが正しいか確認してください

DMARCがPASSにならない

  • Route53にDMARCのレコードが追加されているか確認してください

さいごに

自前でメールサーバーを用意するのは大変なので、可能ならはじめからクラウドメール配信のSaaSを利用したり、AWSのSESを利用することをおすすめします

参考資料

www.rem-system.com

qiita.com