カスタム MAIL FROM ドメインを使って Azure Communication Services からメール送信する

# はじめに

メールセキュリティ対策が重要と言われてきている昨今ですが、2023年にはGoogleから[「メール送信者のガイドライン」](https://support.google.com/a/answer/81126?visit_id=638461691252096480-510091823&rd=1)が公表されエンジニア界隈では話題になりましたね。

Azureにおけるメール送信元ドメイン認証や改ざんの対策をどのように実現するのか気になりましたので、本記事でそのインフラ構築とセキュリティ対策を実践していきます。

`重要: Gmail では 2024 年 2 月以降、Gmail アカウントに 1 日あたり 5,000 件以上のメールを送信する送信者に対し、送信メールを認証すること、未承諾のメールまたは迷惑メールを送信しないようにすること、受信者がメールの配信登録を容易に解除できるようにすることが義務付けられます。詳しくは、1 日あたり 5,000 件以上のメールを送信する場合の要件をご覧ください。`

## なぜメール送信ドメイン認証をすべきなのか

この対応はGoogleだけが対応してくださいといっているだけではありません。

一般的にメールアドレスは、送信元ドメイン「@の後ろ部分」を簡単に詐称することができてしまうので、この送信元IPアドレスが正しいことを確認する「SPF (Sender Policy Framework)」という技術を使って対策をする必要があります。

さらに送信元から送ったメールが改ざんされていた場合、受信者が不本意にランサムウェア等を受けとってしまうと、セキュリティ事故の温床となる可能性があり「DKIM (DomainKeys Identified Mail)」というメール改ざんを検知する技術への対応が求められているのです。

「DMARC（Domain-based Message Authentication Reporting & Conformance）」とはSPF または DKIM の検証に合格しなかった場合にメールの処理方法を受信サーバーの指示を行うというものです。

このSPF/D-KIM/DMARCに対応することにより、送信者側で検証に失敗した際の検知や受信者側にメールが送信されないよう自動で拒否をしたり迷惑メールへ移動させるということをマネージできるようになり、アプリケーションのセキュリティを向上させることができるのです。

これらが本質的なリスクおよびその対策になります。

## この記事で扱い内容と扱わない内容

今回は、メール送信ドメインの認証の技術である「SPF」および電子署名を用いて送信ドメインの認証をおこなう「D-KIM」について触れます。「DMARC」の検証に関しては次回の記事で記載しようと考えています！

# 目次

1. Azure Communication Services（通信サービス） とは
1. Azure Communication Services（通信サービス） の用意
2. ドメインの用意
3. Azure Email Communication Services（メール配信サービス）の作成
4. Azure Email Communication Services（メール配信サービス）にカスタム検証済みドメインを設定
5. SPF と DKIM の設定
6. メールを送信する

## Azure Communication Services とは？

- [Azure Communication Services とは](https://learn.microsoft.com/ja-jp/azure/communication-services/overview#common-scenarios)　からの引用です。
- `用意されている REST API およびクライアント ライブラリ SDK を利用することで、通信を手軽にアプリケーションに組み込むことができます。 基になる技術 (メディアのエンコードやテレフォニーなど) の専門家でなくても、アプリケーションに通信を追加できます。 `

- Comunications Service Email ができることは以下のようです。
    - 電話番号を取得する
        - 電話番号のプロビジョニングし、通話を発呼、着呼したりSMS ソリューションを構築できる。
    - アプリから SMS を送信する
        - Azure Communication Services の SMS REST API および SDK を使用して、サービス アプリケーションから SMS メッセージが送受信できる。
    - アプリからメールを送信する
        - Azure Communication Services のメール REST API と SDK を使用すると、サービス アプリケーションからメール メッセージを送信できる。

## Azure Communication Services（通信サービス） の用意

- ここからは、Azure Portal でリソースを構築し、メール配信するまでを実践した証跡ベースで進めていきます！

- Azure Communication Servicesの作成を進めます。重要なのは「データの場所」です。この後作る「メール配信サービス」の「データの場所」と一致させる必要があります。
![image-65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/f3db5b8a-3eca-0459-f28f-22db833cfc36.png)

- 作成後はこのように表示されます。
![image-67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/59f083a0-b9a2-f0c8-a054-589556a109fe.png)

## ドメインの用意

- これから「App Service ドメイン」でドメインを購入します。費用は、 $11.99/年 です。
- 「App Service ドメイン」で検索
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/1d73151f-06f2-58d6-a8d2-c5b6b1e64bfa.png)

- 「App Service ドメインの作成」を押下
- ![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/4985a0f9-edb1-a904-d869-8f09007e8e5f.png)

- 「ドメインの詳細」を入力
![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/e2472758-5fd4-76dd-cf15-19ddfc27a61a.png)

- 「連絡先情報」は個人情報駄々洩れになっちゃいますので省略しますw

- 「詳細」では、自動更新とプライバシー保護の設定を行います。
- ![image-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/36e20b6c-b85e-d094-e0d1-6bdfce3c92f3.png)
![image-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/e172818e-6381-88fd-84ed-ed20ed764e94.png)

- 購入したドメインが表示されている事を確認します。作成後に「ネットワーキング」「DNSゾーン」の順に押下し、「DNSゾーン」の画面を開きます。
![image-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/6599755c-ad9e-a0c6-7fcb-41589a4d9d86.png)

- NS レコードと SOA レコードが追加されていますので、これで Azure DNS ゾーンを権威DNSサーバとして利用することができるようになりました。
![image-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/1f31250e-112a-32c3-4577-1b35b5b97c77.png)

## Azure Email Communication Services（メール配信サービス）の作成

- 続いてメール送信を行うために「メール配信サービス」を作成します。
「メール配信サービス」は以下の「＋作成」から作成できます。
![image-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/b6c3b40a-5a0e-8214-38ba-d65a34f6b034.png)
- 「Basics」で名前とDatalocationを選択できます。ここで重要なのは「データの場所」です。この指定はこの後作る「メール配信サービス」の「データの場所」と一致させる必要がありますのでご注意ください。
![image-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/9091d83c-30c0-612a-b660-0d884ca616dd.png)
![image-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/7bbe71cf-c860-b84d-bfb7-783f61ef2e7c.png)

## メール配信サービスにカスタム検証済みドメインを設定

- Azure が提供するドメインではなく独自のカスタムドメインを利用してメールを送信したい場合には、検証済みのドメインを用意する必要があります。

- 今回は冒頭で購入した「nukocse.net」というドメインをカスタム検証済みドメインとして利用できるよう設定します。以下リンクを参考にしています。
 [クイックスタート: カスタム検証済みドメインを電子メール通信サービスに追加する方法](https://learn.microsoft.com/en-us/azure/communication-services/quickstarts/email/add-custom-verified-domains)

- 以下の「メール通信サービス」＞「ドメインをプロビジョニングする」の「＋ドメインの追加」＞「カスタムドメイン」から「nukocse.net」を入力して「確認する」を押下
![image-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/79db033a-1911-cce3-a00b-3823fa51527c.png)
![image-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/28ea2883-f3e1-f8cd-648b-db7474730a30.png)
![image-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/362f3e81-51b8-e3f4-8f13-18393cc6943f.png)

- 正常に追加されました。
![image-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/3a6b7c3a-f6d0-4ba7-bd82-287801f8bd39.png)
- カスタムドメインの「Domain Status」が[構成] となっていますので、[構成] をクリックして [TXT レコードを使用してドメインを確認する] に移動します。
![image-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/10df5654-5f29-56cc-d45f-51f286d262e8.png)
- ドメイン検証するためのレコードが表示されます。
![image-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/9a196c9a-00bf-fe2c-5ad3-14335b487e20.png)
- DNSゾーンにレコードを追加します。
![image-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/db338b9a-7847-175c-0949-455870d9633b.png)
- Name：「@」、「Record Type」：「TXT」で指定された「Value」を入力してレコードを追加しました。
![image-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/40d010bc-1f2b-022b-528a-6374c617898b.png)
- Name：「nukocse.net」をそのまま入力すると以下のように検証が完了しませんのでお気を付けください！少しはまってしまいましたw
- それでは「メール配信サービス」で完了を実行します。
![image-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/98c6030f-9fe5-fc10-61a9-045a73c6feae.png)
- プロセスが完了するまでに 15 分から 20 分かかる場合があります。
![image-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/d728c1f4-7c2f-715c-e5e7-340512f05419.png)
- 以下のようにStatusが更新されます。
![image-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/52a27d9a-185e-6d58-ca2d-2fb3eb9d8fd3.png)

以上でドメイン検証は終わりです。

## SPF と DKIM を使用してドメインを認証する

- 続いてSPF・D-KIMレコードを追加します。
- 「メール通信サービス」にあるSPF Statusの「構成」を選択します。
![image-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/cafbfebb-f22e-0e35-a9d1-e76713cecc0e.png)
- Azureでは次のように「SPF」、「D-KIM」、「D-KIM2」で定義すべきレコードが表示されます。
![image-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/ac40d58b-6260-ac04-9340-4fec1da6fea9.png)
![image-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/7f56ada5-0d3b-6f74-3d7c-3d59752d674a.png)
![image-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/716b251b-2b94-6051-4811-09c687be7e53.png)
- これらをDNSゾーンへ追加します。SPFレコードは、DNS検証で追加していた「@」レコードにSPFレコードを追加すればSPFレコードも検証ができるようになります。
![image-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/424763c5-e77d-6172-7129-ff3293c75f74.png)
- レコードを追加したら、「メール通信サービス」の「レビュー」から「Done」を選択します。
![image-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/c31c9aac-5060-2a53-104c-a892a9113cec.png)
- 検証が開始されました。
![image-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/decf5e35-13bd-d7ca-9977-96dd9058cde8.png)
- D-KIMレコードはすぐに検証済みに変わりました。
![image-60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/754804ef-f2e9-c215-6f25-e03d7b3c2867.png)
- 20分程度経過してSPFレコードも検証済みに変わりました。
![image-61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/4285d7e8-c899-6b97-2231-5bf34fa1172d.png)

## カスタム MAIL FROM ドメインを使ってAzure Communication Service からメール送信する

- 続いて「通信サービス」に戻り「ドメインを接続する」を選択します。
![image-68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/4321b623-3793-eb65-9cef-ba4901965314.png)

- 先ほど作成した「メール配信サービス」の確認済みドメインを選択し「接続」を押します。
![image-69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/cb806135-57be-18a0-edc3-cff82315ae89.png)
- 冒頭でもお伝えしましたが、以下が注意事項です。
    - ` 地理的な場所が同じドメインの接続のみが許可されます。 リソースの作成時に選択された通信リソースとメール通信リソースのデータの場所が同じであることを確認してください。`
     [メール ドメインを Communication Service リソースに接続する](https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/connect-email-communication-resource?pivots=azure-portal#connect-an-email-domain-to-a-communication-service-resource)

- ドメインが正常に接続されました
![image-70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/b427eb01-f95d-1ade-f036-4e0526282fb3.png)

- 「通信サービス」＞「メールを試す」から必要な情報を入力し、「Send」を実行します。以下のフォームを入力すると勝手に右のサンプルコードが書き換わります。素晴らしい・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/de62e7d9-134e-1e96-343c-2110c1f4dcf5.png)

- メール届きましたね。PCで見ると次のように「送信元」と「署名元」が指定したドメインになっていますので問題ないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/04608b2e-3320-cba7-ea02-7cc2743c9eb8.png)
- Google からもメッセージのソースを見る方法や送信元・署名元を見る手順が記載されています。
https://support.google.com/mail/answer/180707?hl=ja&co=GENIE.Platform%3DDesktop
- ちなみにメッセージのソースは以下のようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516131/34b0878d-0e59-2e6d-e912-33b3ea1645e2.png)

## 終わりに

以上です。何とか出来たので良かったです！続いてこういうこともやりたいですね。

- DMARCレコード追加して検証失敗時のポリシーを定義する
- Azure Functions からのメール送信
- メール受信はどうやるのか・・・　←Azure Communication Servicesからは難しそう？

是非ご感想いただけると嬉しいです！