プロフィール
しらせ(HN)
プロフィール
とあるIT企業のインフラエンジニア。プライベートでは開発もちょっとやります。
※本ブログの内容はすべて個人の見解であり、所属する企業とは関連ありません。
カテゴリ別
内部リンク
相互リンク
Twitter
来訪
450759 [合計]
200 [今日]
1016 [昨日]
Powered by
Powered by AWS Cloud Computing

ByProduct - FukuSanButsu

ふくさんぶつBlog

社内インフラエンジニアの自宅からはじまるIT
自宅のPCに向き合いながら気づいたことや個人的な体験をまとめいます


【メール】EC2でPostfixとDovecotを使って作るメールサーバ入門

Date:2021/12/12
Update:2021/12/12

Category:インフラ


お疲れ様です。
しらせです。

普段はYahoo! JAPANやGoogleのフリーメールをメインで使っていますが、B向けのクラウドサービスなんかを使う際には独自ドメインのメールアドレスが必要になることがあります。

せっかく独自ドメインを持っているのであれば勉強がてらメールサーバくらい自分で作れば?
ということで、昨年5月(2020年)にAWSのEC2環境を使ってメールサーバを構築していました。

今回はメールシステムでも一般的なPostfixとDovecotを利用してみました。

(記事を書いていたと思い込んでいて忘れていました。)

★ご注意★
ここで紹介している内容はメールサーバとして稼働する最低限の設定のみとなっています。
必要な個所のみ参考としていただき、設定を参考にされる場合はプロトコルや設定仕様をよくご確認の上ご判断ください。

もくじ

全体構成と設計

まずは全体的な構成です。

電子メールの仕組みを1からちゃんと勉強したいのでEC2インスタンスを1つ立ててPostfixとDovecotを稼働させることにしました。

テスト的な利用に近いということもあって冗長化もバックアップもしない構成となっています。

自宅PCや外出先からはSMTPS/IMAPSで送受信ができるようにします。

その分、設定ミスや意図しないセキュリティホールを作らないように注意が必要です。

事前準備

EC2インスタンスの用意

まずはメールサーバとして利用するEC2インスタンスを用意します。

OSはPostfixとDovecotを稼働させるためAmazon Linux2(CentOS)を利用します。

1日1通送るかどうかなので最低スペック(t2.nano)で行きます。

メールサーバとして稼働するためにグローバルIPアドレスが1つ必要になりますので事前に取得の上、メールサーバのインスタンスに紐づけを行います。

セキュリティグループは外部メールサーバとの送受信用に25/TCPを、メールアクセス用に993/TCPと465/TCPをそれぞれ許可しておきます。

ドメインのTXTレコード設定(SPF)

一部のメールサーバやMXではDKIMやSPFのチェックを行っている場合があります。

証明書の設定はちょっと手間なので一旦はSPFに対応するためDNSサーバのTXTレコードを修正します。

私の環境のDNSはRoute53ではなくValueDomainを利用しているため、以下のような設定を個別に指定しています。

txt @ v=spf1 ip4:***.***.***.*** -all

***.***.***.***にはメールサーバ(EC2インスタンス)に設定した送受信用のグローバルIPアドレスを指定します。

ValueDomainのDNS設定における「@」はドメイン自身を指しますが、メールアドレスで別のサブドメインの場合はサブドメイン名を指定します。

メールサーバの構築が終わった後の確認になりますが、TXTレコードを登録していない場合と登録している場合のヤフーメールでのSPFチェックのステータスをヘッダー情報から確認してみました。

TXTレコード無し

Received-SPF: none (***.***.jp: domain of myaccount@***.jp does not designate permitted sender hosts)

TXTレコードあり

Received-SPF: pass (***.***.jp: domain of myaccount@***.jp designates ***.***.***.*** as permitted sender)

TXTレコードの設定が通っているとSPFがpassとなっていることが確認できます。

構築

VPCから25/TCP通信の許可申請

今回、送受信を行うメールサーバはEC2で構築します。

そのため送信元IPアドレスはAWSが管理しているものになり、VPCからインターネットへの25/TCP通信を行う必要があります。

AWSでは既定でインターネットへの25/TCP通信がブロックされており、AWSに申請を行って個別に通信を許可してもらう必要があります。

以下のようにWebフォームから申請が可能です。
他のブログでも同様の報告がありますが、1,2回AWS側からメールサーバの設定や用途について確認が入ります。

スパム目的じゃないよな?スパムメール対策とかやってるよな?
というような確認だった気がします。


(参考/引用)Request to remove email sending limitations - console.aws.amazon.com
https://console.aws.amazon.com/support/contacts?#/rdns-limits

この申請が通ることで25/tcp通信が可能になるだけでなく、IPアドレスの逆引きでも指定したメールサーバのドメイン名に変更されます。

※「ping -a」や「dig -x」などでIPアドレスを引っかけて、EC2インスタンスに設定されるec2-***-***-***-***.ap-northeast-1.compute.amazonaws.comなどのPTRレコードが返ってくると未設定の状態です。

(参考)Amazon EC2 インスタンスまたは AWS Lambda 関数のポート 25 に対する制限を解除するにはどうすればよいですか? - aws.amazon.com
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-port-25-throttle/

Postfix設定

続いてはいよいよメールサーバとして稼働させるための環境を構築します。

だいぶ前の事なので覚えている限りの情報です。。。(すみません)

1.Postfixインストール

$ sudo yum -y install postfix

2.main.cf設定の変更

$ sudo vi /etc/postfix/main.cf
---以下設定---
#####
##### メールサーバのホスト名の設定 #####
#####
#myhostname = host.domain.tld

myhostname = <hostname>.<メールドメイン名>.jp

#####
##### 実際にメールで使うドメインの設定 #####
#####
mydomain = domain.tld

mydomain = <メールドメイン名>.jp

#####
##### 配送先ドメイン名 #####
#####
#myorigin = $myhostname

myorigin = $mydomain

#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

##### メール転送を受け付けるIPアドレス #####
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table

mynetworks = 127.0.0.0/8 , 172.31.0.0/16

#####
##### qmail形式 #####
#####
#home_mailbox = Mailbox

home_mailbox = Maildir/

#####
##### その他のセキュリティ設定など #####
#####
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_client_access cidr:/etc/postfix/reject_list

smtpd_helo_required = yes
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
allow_percent_hack = yes
swap_bangpath = yes
allow_untrusted_routing = no

smtpd_client_message_rate_limit=5
smtpd_client_recipient_rate_limit=5
anvil_rate_time_unit=60m

smtpd_sender_restrictions = reject_unknown_sender_domain

smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.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

3.SMTP認証のためのcyrus-saslのインストールと有効化

$ sudo yum -y install cyrus-sasl
$ sudo systemctl enable saslauthd
$ sudo systemctl enable saslauthd.service

4.Postfixの有効化

$ sudo chkconfig postfix on

5.master.cfの変更

$ vi /etc/postfix/master.cf
---以下設定---
smtpセクション
(全てコメントアウト)

submissionセクション
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

smtpsセクション
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

6.Dovecotインストール

$ sudo yum -y install dovecot
$ sudo chkconfig dovecot on

7.Dovecotの認証設定

ローカルに出力したパスワードファイルによる認証を予定しての設定です。

$ sudo vi /etc/dovecot/conf.d/10-auth.conf
---以下設定---
#####
##### Plaintextでの認証無効化を無効化 #####
#####
disable_plaintext_auth = yes

disable_plaintext_auth = no

#####
##### 認証時の方式(SSL/TLSを使うのでplain loginにした) #####
#####
auth_mechanisms = plain

auth_mechanisms = plain login

#####
##### パスワードファイルの指定 #####
#####
#!include auth-passwdfile.conf.ext ↓
!include auth-passwdfile.conf.ext

7.DovecotのSSL/TLS設定

証明書は既定のものをそのまま。(Outlook接続時にエラー出ます。)
SSL/TLSのバージョン関連の設定は一旦スキップ。

$ sudo vi /etc/dovecot/conf.d/10-ssl.conf
---以下設定---
#####
##### SSL/TLS設定 #####
#####
ssl = no

ssl = yes

8.Dovecotの設定

$ sudo vi /etc/dovecot/dovecot.conf
---以下設定---
#####
##### プロトコルはIMAP #####
#####
protocols = imap

#####
##### 挨拶 #####
#####
login_greeting = hi

9.Dovecotパスワードファイルの設定

$ sudo vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext
---以下設定---
passdb {
driver = passwd-file
args = /etc/dovecot/dovecot-pdb
}

userdb {
driver = passwd-file
args = /etc/dovecot/dovecot-pdb
}

10.Dovecot master.confの設定

143/TCPは止めて993のみに。

$ sudo vi /etc/dovecot/conf.d/10-master.conf
---以下設定---
service imap-login {
inet_listener imap {
#port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}

テスト

オープンリレーテスト

メールサーバはその名の通りメールの送受信を全て仲介します。

直接外部から通信が可能な構成となっていますので、認証設定やメール転送設定が誤っていると第三者がメールサーバを介して別のメールサーバに送信が可能となってしまいます。

これを悪用されるとスパムメールの送信に利用される可能性(オープンリレー)がありますので外部からのテストは重要になります。

以下のようなテストサイトも公開されており、構築したメールサーバのオープンリレーをチェックできます。
※あくまでも自分で構築したメールサーバに対するテスト用として実施。

(参考)open relay checker - check.jippg.org
http://check.jippg.org/

全部で17項目のテストがありOK/NGで判定してくれます。
私の環境で試したところでは一応すべてOKになりました。

Outlookからの送受信

最後に本当に送受信ができるか動作確認をします。

Outlookを起動して送受信の設定を入れます。

認証が正しく通ればセットアップは完了します。
一方で、今回は証明書にプリセットのものを利用していますのでOutlook起動時にメールサーバ側の証明書に関する警告が出ます。
無視をすれば使えはするのですが、毎回面倒であれば正式にサーバ証明書の利用が必要です。

Outlookから試しにメールを送ります。

わかりにくいですが、ちゃんと送信されています!
Fromが今回自分で作ったメールサーバ上のメールアドレスになっていることが確認できました!

返信もやってみます。
ちゃんと返信された内容も受信できている様子です。

考察

一旦、以上のような感じで送受信ができるメールサーバの構築はできました。

が、分かってはいたつもりですがやはりメールサーバの構築も維持もあらためて面倒だと実感しました。

80,443/TCPや22/TCPのように用途とプロトコルが1対1になっていないことで仕組みや設定が複雑になっている点が特に理解が難しい点です。

フリーメールという形で普段何気なく使っているメールアドレスも裏ではこれくらい大変な苦労があるんですね。

気が済んだのでいつかメールサーバごとドメイン移管してマネージドサービスに移管したい気持ちです。

以上
おつかれさまでした。



View:114 この記事をツイート!