がじぇ

お金と家電とプログラミングのブログ

【AWS】EC2(CentOS6)からメールを送信できるようにするためにやったこと

こんにちわ

がじぇったー (@hackmylife7) | Twitter

です。

AWS環境上でEC2に入れたPostfixからEmailを送信する手順についてまとめます。 AWS環境のメール送信って一体何が正解なんですかね。 SESも東京リージョンにないし、迷惑メールフィルタに引っかかりやすいし。。

f:id:gadgeterkun:20200516112150j:plain

手順

ECからメールを送信するためには以下スライドの28Pの作業が必要 https://www.slideshare.net/AmazonWebServicesJapan/aws-30934799

EC2にPostfixの送信設定を行う

  • viコマンドでPostfixの設定ファイルを修正します。
  • メール送信ドメインは例として "stg.hogehoge.com"とします。
vi main.cf

他のEC2インスタンスが送信元の場合、mynetworksはVPCのCidrを指定しましょう

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = localhost
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases


debug_peer_level = 2
debugger_command =
     PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
     ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.6.6/samples
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES

# add
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = all
inet_protocols = ipv4

myhostname = ip-10-40-20-44
mydomain = stg.hogehoge.com
myorigin = $mydomain

virtual_alias_maps = hash:/etc/postfix/virtual

送信メールアカウントの発行

  • アプリケーションからメールを送信するためにPostfix用のUserを作成します
  • "sendmailuser"とします
# useradd sendmailuser
# passwd sendmailuser
Changing password for user contact.

メールアカウントの設定

  • postmapコマンドでPostfixが参照するDBを作成していきます
# vi /etc/postfix/virtual

# tail -n 1 /etc/postfix/virtual
sendmailuser@stg.hogehoge.com sendmailuser


# postmap hash:/etc/postfix/virtual
# /etc/init.d/postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]
#

サービス登録

# chkconfig --add postfix
# chkconfig  postfix on
# chkconfig --list postfix
postfix                0:off        1:off        2:on        3:on        4:on        5:on        6:off

他サーバから疎通確認

  • メールの送信元が他のアカウントの場合はtelnetコマンドで確認しましょう
  • 220が出ればOKです
# telnet 10.40.20.44 25
Trying 10.40.20.44...
Connected to 10.40.20.44.
Escape character is '^]'.
220 

DKIMの設定

DKIMの設定とSMTPSの設定は飛ばしても大丈夫ですが、自分が参考にした質の高い記事を貼っておきます。 DKIMは送信側で電子メールに電子署名を付加し、受信側でその電子署名を照合するという方法で送信者のドメインの認証を行うものです。スパム判定されにくくなるのでこれはやった方が良いです。

https://www.rem-system.com/dkim-postfix04/

DKIMを設定した場合Route53にDKIM用のレコードを二つ登録することになると思いますが、その際のレコードの意味は下記の記事が参考になります。

DKIM (Domainkeys Identified Mail) : 迷惑メール対策委員会

SMTPSの設定

https://www.rem-system.com/mail-postfix03/ 証明書にLet's encryptを使う場合は証明書の自動更新の設定もやっておいた方が良いでしょう。 Let's Encryptを使ってSSL証明書を自動更新する(AWS/Amazon Linux/Apache) - Qiita

他サーバからSMTPSで接続できるか確認するコマンドはopenssl s_clientコマンドでやると良いです。

openssl s_client で SMTP STARTTLS と SMTP AUTH を動作確認する | 技術メモの壁

Route53にTXT/SPFレコードの登録

  • スパムメールと判別されないためにRoute53にTXTレコードとSPFレコードを登録する必要があります。
  • 対象ドメインのホストゾーンを選択し、「レコードセットの作成」ボタンを押し、以下の通り入力します。
  • 名前: 空欄
  • タイプ: TXT
  • エイリアス: いいえ
  • TTL:任意の値(移行時は300程度で良い)
  • 値: 下記の通り
"v=spf1 +ip4:EIPのアドレス ~all"

同様の内容をTXTをSPFに変えて登録しましょう。(SPFかTXTレコードのどちらかが定義されていれば動作しますが、RFCの推奨設定としては両方のレコードを登録することが推奨されています)

DMARCの設定

送信ドメイン認証を設定します。 * 対象ドメインのホストゾーンを選択し、「レコードセットの作成」ボタンを押し、以下の通り入力します。 * 名前: 空欄 * タイプ: TXT * エイリアス: いいえ * TTL:任意の値(移行時は300程度で良い) * 値: 下記の通り

"v=DMARC1;p=none;rua=mailto:dmarc@stg.hogehoge.com;ruf=mailto:dmarc@stg.hogehoge.com;rf=afrf;pct=100"

How to Add DMARC Record to AWS's DNS-Route 53 - EasyDMARC

マネコンのサポートからメール送信制限解除申請

制限解除時に記載するメッセージですが、余計なやりとりをなくすために * メール送信の目的 * スパムと判定されないためにとる対策 を書きましょう。 例

The Use-case for sending mail from EC2,  for example, to send a membership or purchase confirmation email to a user

I'm going to use SPF records and DKIM to make sure it doesn't get judged as spam.

ドメイン移行時などは逆引き設定はできず、送信制限解除申請しか出せないと思います。その場合は先に送信制限解除申請のみ申請し、ドメイン移行が完了したら逆引き申請もだしましょう。

メール送信テスト

  • 以下のコマンドでメールを送信してみましょう。おそらく迷惑メールに 振り分けられると思います。
sendmail hoge@gmail.com

続けて以下を入力(最後のピリオドを打つと送信されます)

From:stg.hogehoge.com
To:hoge@gmail.com
Subject:test
This is test.
.

https://www.amazon.co.jp/b/ref=adbl_JP_as_0068?ie=UTF8&node=5816607051&tag=takahirono70e-22/

参考

SPF + DKIMを設定して、Postfixでメールを送信(CentOS)

Postfix 設定パラメータ

AWS での メールサーバ設定 [いかたこのたこつぼ]

SendGrid 新人成長記 第九回 メールサーバを立ててメール送信してみた | SendGridブログ