Amazon WorkMail に SMTP リレーをする Postfix サーバーを構築してみた

# はじめに

一般的にメールサーバーを運用するのは重労働です。メールはビジネスコミュニケーションの大事な方法なので、可用性を高く、なおかつセキュリティの担保も必要になります。そういった重労働を軽減するために、Amazon WorkMail を活用できます。

[前回](https://qiita.com/sugimount-a/items/ee3369b43369d525c72e)は、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 側に入力します。

![image-20220123143109976.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a95eee3b-2d5b-dc0d-39a9-ac55991ebdc3.png)





# 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` となっています。

![image-20220123144436471.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6d9fa78d-b7cc-59ff-e354-b95b91b6d873.png)



メールのソースを確認します。From も正常に指定されてありますね。

![image-20220123144648947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/652a6ac7-9f78-d85e-e82d-8337565323db.png)



## 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 とは違うユーザーなのでエラーになりました。

![image-20220123144935292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6a8bca63-88ce-a592-62e6-cbdc20224f06.png)



## share001 として送付

[以前の記事](https://qiita.com/sugimount-a/items/bf53ddfb1478d3fa0f23)で 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` として正しくメールが到着しています。

![image-20220123145914967.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ad9b29d2-3a0c-ef7d-b565-159fb940e4dd.png)



メールのソールも見ています。From ヘッダーが share001 となっています。

![image-20220123145926281.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2867d674-5048-55d2-6c66-fa988379f612.png)



# 検証を通じてわかったこと

- 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