はじめに
一般的にメールサーバーを運用するのは重労働です。メールはビジネスコミュニケーションの大事な方法なので、可用性を高く、なおかつセキュリティの担保も必要になります。そういった重労働を軽減するために、Amazon WorkMail を活用できます。
前回は、WorkMail の構築をおこなってみました。
今回は、Amazon EC2 インスタンスでPostfix サーバーを新たに構築して、SMTP リレーとして WorkMail を経由しながらメールを送付する方法をご紹介します。
WorkMail 上で既にユーザー user001@workmail.sugiaws.tokyo
を登録されている環境を利用します。
環境情報
- EC2 Instance
- Amazon Linux
- Postfix 2.10.1
Postfix Install
Amazon Linux 2 の環境では、既に Postfix がインストールされています。
$ yum list installed | grep postfix
postfix.x86_64 2:2.10.1-6.amzn2.0.3 installed
Postfix のバージョンを確認
$ postconf | grep mail_version
mail_version = 2.10.1
Postfix の基本的な設定
Postfix の設定ファイルを、念のためバックアップします。
sudo cp -p /etc/postfix/main.cf /etc/postfix/main.cf.old
postconf コマンドで編集をします。WorkMail で利用しているドメインを指定します。
sudo postconf -e "myhostname = workmail.sugiaws.tokyo"
sudo postconf -e "mydomain = workmail.sugiaws.tokyo"
Postfix の再起動実施と、自動起動を有効化します。
sudo systemctl restart postfix
sudo systemctl enable postfix
Postfix のステータス確認
sudo systemctl status postfix
Postfix そのものの動作確認をします。メール送付は出来ませんが、ログを確認して動作確認とします。
sendmail -f sender@example.com recipient@example.com
From: Sender Name <sender@example.com>
Subject: Amazon SES Test
This message was sent using Amazon SES.
.
想定通りエラーログが出ています。Postfix 自体が動作していることがわかります。
$ sudo tail -n 4 /var/log/maillog
Jan 22 14:56:09 ip-10-0-1-116 postfix/smtp[3989]: warning: valid_hostname: empty hostname
Jan 22 14:56:09 ip-10-0-1-116 postfix/smtp[3989]: warning: malformed domain name in resource data of MX record for example.com:
Jan 22 14:56:09 ip-10-0-1-116 postfix/smtp[3989]: 69F036E944: to=<sender@example.com>, relay=none, delay=0, delays=0/0/0/0, dsn=5.4.4, status=bounced (Name service error for name=example.com type=MX: Malformed or unexpected name server reply)
Jan 22 14:56:09 ip-10-0-1-116 postfix/qmgr[3872]: 69F036E944: removed
WorkMail の SMTP クレデンシャルの取得
WorkMail 上で既に user001 として登録されている状態です。User を作成するときに、パスワードを指定しており、メールアドレスとパスワードをメモっておきます。 後の手順で Postfix 側に入力します。
stunnel の設定
Postfix を起動する Amazon Linux 2 から、WorkMail にメールを送る際に、TLS(ポート 465)を使って通信を行います。STARTTLS(ポート 587) は WorkMail だと利用できません。
今回の記事では、Linux マシンと、WorkMail 間で TSL/SSL トンネリングを行うために、stunnel を利用します。stunnel を install します。
sudo yum install stunnel -y
一度、Postfix を停止します。
sudo systemctl stop postfix
stunnel の設定情報を編集します。
sudo vim /etc/stunnel/stunnel.conf
次の値を指定します
- WorkMail の SMTP エンドポイントを指定
[smtp-tls-wrapper]
accept = 2525
client = yes
connect = smtp.mail.us-east-1.awsapps.com:465
stunnel を起動します。
sudo stunnel /etc/stunnel/stunnel.conf
telnet で localhost の 2525 ポートに接続します。これが stunnel で作成されている WorkMail へのトンネルです。
telnet localhost 2525
実行例です。smtp.us-east-1.mail.awsapps.com ESMTP Amazon WorkMail SMTP Service
と表示されているため、正しく疎通できていることがわかります。
$ telnet localhost 2525
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 smtp.us-east-1.mail.awsapps.com ESMTP Amazon WorkMail SMTP Service
WorkMail に転送するための Postfix 設定
設定変更をします。Postfix として SMTP リレー先に、stunnel で出来たトンネルを指定します。
sudo postconf -e "relayhost = 127.0.0.1:2525" \
"smtp_sasl_auth_enable = yes" \
"smtp_sasl_security_options = noanonymous" \
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd" \
"smtp_use_tls = yes" \
"smtp_tls_security_level = may" \
"smtp_tls_note_starttls_offer = yes"
SMTP クレデンシャルを書き込んでいきます。
sudo vim /etc/postfix/sasl_passwd
以下の値を入れます。user001@workmail.sugiaws.tokyo:yourpassword
の部分は環境に合わせて変更してください。
127.0.0.1:2525 user001@workmail.sugiaws.tokyo:yourpassword
hashmap データべースファイルを作成します。
sudo postmap hash:/etc/postfix/sasl_passwd
所有権の変更をして、root ユーザーのみ触れるようにします。
sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
CA 証明書の位置を指定します。
sudo postconf -e 'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt'
Postfix の再起動
sudo systemctl restart postfix
Postfix のステータス確認
sudo systemctl status postfix
動作確認
user001 として送付
sendmail コマンドで、メールを送付していきます。メールの送信元として、SMTP クレデンシャルで指定している user001@workmail.sugiaws.tokyo
を使っています。
sendmail -f user001@workmail.sugiaws.tokyo xxxxxxxxxxx@xxxx.xxx
From: I AM POSTFIX <user001@workmail.sugiaws.tokyo>
Subject: Amazon WorkMail Test
This message was sent using Amazon WorkMail.
.
Postfix が出力したログを確認します。
sudo less /var/log/maillog
250 Ok
という文字が確認でき、メールを正常に送付できていることがわかります。
Jan 23 05:42:57 ip-10-0-1-116 postfix/smtp[5487]: A3D566E954: to=<secret@gmail.com>, relay=127.0.0.1[127.0.0.1]:2525, delay=2.9, delays=0.25/0.01/1.3/1.3, dsn=2.0.0, status=sent (250 Ok)
Jan 23 05:42:57 ip-10-0-1-116 postfix/qmgr[5206]: A3D566E954: removed
メールの送付先を確認すると、正常にメールが到着しています!送信元は user001
となっています。
メールのソースを確認します。From も正常に指定されてありますね。
user002 として送付 : エラー
Postfix で指定している SMTP クレデンシャルが user001@workmail.sugiaws.tokyo
を利用しているなかで、user002
を指定してメールを送付するとどうなるでしょうか試してみます。
sendmail -f user002@workmail.sugiaws.tokyo xxxxxxxxxxx@xxxx.xxx
From: I AM POSTFIX <user002@workmail.sugiaws.tokyo>
Subject: Amazon WorkMail Test
This message was sent using Amazon WorkMail.
.
エラーの旨のメールが、user001 のメールボックスに到着します。Postfix で指定している SMTP クレデンシャルは、user002 とは違うユーザーなのでエラーになりました。
share001 として送付
以前の記事で user001 に対して、share001 に成り代わって送付する権限を付与しています。Postfix で share001 と指定して送付してみましょう。
sendmail -f share001@workmail.sugiaws.tokyo xxxxxxxxxxx@xxxx.xxx
From: I AM POSTFIX <share001@workmail.sugiaws.tokyo>
Subject: Amazon WorkMail Test
This message was sent using Amazon WorkMail.
.
Gmail にメールが届きました!share001
として正しくメールが到着しています。
メールのソールも見ています。From ヘッダーが share001 となっています。
検証を通じてわかったこと
- WorkMail の SMTP エンドポイントは STARTTLS(587)を利用することができない。TLS(465) で送る必要がある。
- Linux 上の Postfix で、WorkMail に SMTP リレーをする際には、TLS/SSL のトンネリング(stunnel)が利用可能。
- Postfix から WorkMail を使って SMTP リレーをすると、Postfix 側で指定した SMTP クレデンシャルに紐づくユーザーが送信元になる
- 違うユーザーを from で指定すると、エラーになる
- 例外として、WorkMail 上で代わりに送付する権限を付与すると、そのユーザーを From に指定してメール送付が可能
- メールを送る用途だと、WorkMail に限定せず、SES を利用してもいい。SES 側だとドメイン認証をすることができ、そのドメイン内だと任意のメールアドレスを From に指定できるので、プログラムから連携するときはやりやすい。
参考URL
Amazon SES とPostfixの統合
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/postfix.html