はじめに
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/maillog
でopendkim not authenticated
のようなログが出ているか確認してください。でている場合は何かしら設定がおかしいはずです- Route53 に DKIMのレコードが追加されているか確認してください
/etc/postfix/main.cf
にsmtpd_miltersやnon_smtpd_miltersの設定があるか確認してください- 他のサーバーのアプリケーションからプログラム上でSMTPでメールサーバーと連携している場合、TrustedHostsにアプリケーションのサーバーのPrivateIPアドレスの記述があるか確認してください
- SigningTableに記述しているドメイン名とメールの送信元ドメインが正しいか確認してください
DMARCがPASSにならない
- Route53にDMARCのレコードが追加されているか確認してください
さいごに
自前でメールサーバーを用意するのは大変なので、可能ならはじめからクラウドメール配信のSaaSを利用したり、AWSのSESを利用することをおすすめします