OCIのEmail Deliveryへのメール配信依頼をクラウド内部ネットワークに限定してみた

OCI（Oracle Cloud Infrastructure）のEmail Delivery Serviceはメール配信サービスであり、メールを受信することはありません。
ただ、メール配信依頼はSMTPプロトコルで受け取ることができるため、この受け取り窓口がパブリック・ネットワーク（以下「インターネット」）に開いていることを制限できないかという相談を受けました。
仕組み的には、ネットワーク・ソースを利用すればできそうだったので、試してみた内容を記載します。

### 1.検証環境

Email Delivery Serviceの構築は、[OCIチュートリアル](https://community.oracle.com/tech/welcome/discussion/4474289/email-delivery%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E5%A4%96%E9%83%A8%E3%81%B8%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1-%E3%81%9D%E3%81%AE1-%E9%85%8D%E4%BF%A1%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E7%B7%A8-oracle-cloud-infrastructure%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%82%B9%E3%83%89)にしたがって構築しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/22446a14-bb40-011d-a101-351f3e1d7cb7.png)
OCI上にメール配信依頼を行うComputeを2種類立てました。

1つはPublic Subnetに配置し、メール配信依頼はインターネットを経由します。
Public Subnetのルート表は以下のとおり、Internet Gatewayを向いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/34e18f5b-a689-1f94-db57-2ddbdcdf17d1.png)
もう1つはPrivate Subnetに配置し、メール配信依頼はクラウド内部ネットワークを利用します。
Private Subnetのルート表は以下のとおり、Service Gatewayを向いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/063d91ec-a4bd-5b90-eb34-849853621f87.png)
この状態（ネットワーク限定なし）で、[OCIチュートリアル](https://community.oracle.com/tech/developers/discussion/4474293/email-delivery%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E5%A4%96%E9%83%A8%E3%81%B8%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1-%E3%81%9D%E3%81%AE2-%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E7%B7%A8-oracle-cloud-infrastructure%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%82%B9%E3%83%89)にしたがって、メール配信依頼を出すと、Public SubnetおよびPrivate Subnetに配置したどちらのComputeからもメールを配信することができます。

Public Subnetに配置したComputeからのメール配信

```
[opc@developer ~]$ echo "Test Mail from public network" | mailx -s "Public NW" xxxxxxxx@yyyyyy.com
```
Private Subnetに配置したComputeからのメール配信

```
[opc@developer-private ~]$ echo "Test Mail from private network" | mailx -s "Private NW" xxxxxxxx@yyyyyy.com
```

### 2.メール配信依頼をクラウド内部ネットワークに限定

ネットワーク・ソースを利用して、Email Delivery Serviceへのメール配信依頼をVCN（のPrivate IP）からの依頼に限定します。

#### 2-1.ネットワーク・ソースの作成

左上三本線メニューより、「アイデンティティとセキュリティ」を選択し、「ネットワーク。ソース」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/848d1535-fa0a-043e-5c4a-f201a8124ad8.png)

［ネットワーク・ソースの作成］ボタンを押し、以下の設定を行います。

名前：任意（今回は「Email_delivery_limitation」とします）
説明：任意
ネットワーク：仮想クラウド・ネットワーク
VCNの選択：メール配信依頼を許可するVCN
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/ef68e827-69f6-276d-c770-00642c1261e7.png)

#### 2-2.ポリシーの設定

SMTP資格証明を取得したユーザーの所属するグループに対して、上記のネットワーク・ソースからのリクエストのみを受け付けるように、ポリシー構文に以下の条件句を設定します。
`where request.networkSource.name='Email_delivery_limitation'`

今回の場合は、ユーザーの所属するグループ（email_sender）に対して、「use email-family」権限を条件付きで付与します。
`allow group email_sender to use email-family in tenancy where request.networkSource.name='Email_delivery_limitation'`
※スコープ「in tenancy」は必要に応じて「in compartment コンパートメント名」などに変更してください）
 
#### 2-3.Public Subnetに配置したComputeからのメール配信

前回と同じmailxコマンドを投げると、以下のとおりエラーが返ります。

```
[opc@developer ~]$ echo "Test Mail from public network" | mailx -s "Public NW" xxxxxxxx@yyyyyy.com
[opc@developer ~]$ smtp-server: 535 Authorization failed: Envelope From address <xxxxxxxx@yyyyyy.com> not authorized
"/home/opc/dead.letter" 11/342
. . . message not sent.
```
当然ながら、メールは届きません。

#### 2-4.Private Subnetに配置したComputeからのメール配信

同様にmailxコマンドを投げます。

```
[opc@developer-private ~]$ echo "Test Mail from private network" | mailx -s "Private NW" xxxxxxxx@yyyyyy.com
```
こちらはエラーもなく、正常にメールが届きました。