クロステナントのAzure Private Endpoint経由でBlob Storageに接続する

Azure Private Endpointは、PaaSのプライベートIPを仮想ネットワークの中に持たせることでPaaSへの接続をセキュアに実現する手段です。
異なるテナント、異なるサブスクリプション間でBlob Storageへのプライベートエンドポイント接続を試したので手順を残します。

# 構成
* Subscription Bに作成したBlobへ、Subscription Aのプライベートエンドポイント経由でアクセスできればOKです。Blobはパブリックアクセスは無効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/066e5d07-9684-7669-d999-9189d8a2bada.png)

# 事前準備
* Subscription Aの仮想ネットワークと接続確認用VMは事前に作成しておきます。

# Blob Storage作成（Subscription B）
* 作成手順は割愛しますが、以下2つの設定を入れています。
    * testコンテナーをプライベートアクセスレベルで作成し、配下にファイル配置
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/85d2f47e-a043-8fad-cb50-c62b3828c91c.png)
    * [ネットワーク]から、パブリックネットワークアクセスを無効に設定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1e5f2372-6063-02c4-e4c5-0f767b674782.png)
* [設定]→[エンドポイント]の順に選択し、[ストレージアカウントリソースID]をメモしておきます。（後ほど使います）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/390beb57-c525-c316-9115-20a595fffe67.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e167b585-9b88-80be-eca2-24867fb1d380.png)

# プライベートエンドポイント作成（Subscription A）
* Azure Portalから[プライベートリンクサービス]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8fb3a990-5047-8ff6-4942-24ad5c1db8f8.png)

* [プライベートエンドポイント]→[作成]の順に選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/cbbe5093-4f6c-06ab-c8cb-f7b3bf461502.png)

* プライベートエンドポイント名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d767ad2e-5a59-e4e4-7f34-79404cd29783.png)

* [リソースIDまたはエイリアスを使ってAzureリソースに接続します]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ae1ce448-9311-b5a6-e90f-43ce8008770d.png)

* 事前にメモした[ストレージアカウントリソースID]を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b7a8da18-7fc3-2e73-c2cc-7cecea0397d3.png)

* 対象サブリソースに[blob]と入力し、要求メッセージに任意のメッセージを入力します。（後ほどSubscription A側でメッセージを確認します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4abbd5a8-0f25-d0a0-8854-a8eaecc4bb42.png)

* 仮想ネットワークとサブネットは事前に準備したものを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/46901e45-2a66-4cfd-080f-2f5c2eace517.png)

* クロステナントのポイントとして、プライベートDNS統合が自動設定できません。後ほど触れますがプライベートDNS設定を手動で行う必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7d24bbaa-565b-59d4-c5f8-0199ed9d24ed.png)

* ここまで設定したらプライベートエンドポイントを作成します。作成するとSubscription BのBlobに接続要求が飛びます。

* プライベートエンドポイント画面にいくと、プライベートIPアドレスが割り振られているのでメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a4f184e4-842b-1690-4c1e-438f3982ea95.png)

# プライベートエンドポイント接続承認（Subscription B）
* Blobストレージ左メニューから[ネットワーク]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4346f434-1099-273a-67a3-3fcdc7356cba.png)

* [プライベートエンドポイント]を選択すると、[保留中]の接続が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/50e1dd66-633f-e327-b679-35805dc98a4c.png)

* 対象の接続にチェックを入れ、[承認]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/a53b81d4-22d7-cf46-fc25-6802feba63dc.png)

* [承認済み]に変わればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/19337940-c6ef-d32f-f0ae-60a6cacb1fd1.png)

# プライベートDNS設定（Subscription A）
* このままだとVMは名前解決のときにパブリックIPを引いてきてしまいます。プライベートDNSを作成し、仮想ネットワークとリンクさせることで、プライベートIPを引いてくるようにします。
* Azure Portalから[プライベートDNSゾーン]を選択し、作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/553e30f7-2a36-46d2-eaf9-af4f06920099.png)

* プライベートDNS名を[privatelink.blob.core.windows.net]として作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/443e17d8-e60d-7820-e8a4-888a7bda4e5a.png)

* プライベートDNSゾーンが作成されたら[レコードセット]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f1c10f06-9028-3994-395d-78f5bfcbc736.png)

* [名前]にはSubscription Bで作成したBlobストレージのアカウント名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/52be2353-353f-079a-33ee-e66182d9bf5e.png)

* Aレコードを選択、TTLは10秒とし、IPアドレスには事前にメモしたプライベートエンドポイントのIPを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/4e43d77b-cad8-ae7c-45c7-846e743160ac.png)

* [仮想ネットワークリンク]を選択し追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b1349d7e-6b3a-2557-28ee-32b168d42faf.png)

* 任意のリンク名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ed2ab539-0087-4c56-fa03-e69313ccbacf.png)

* VMが配置された仮想ネットワークを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8dd161df-61f3-d1c6-5025-e0e2ab078f85.png)

* リンクの状態が[完了]になればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c5848bab-ae9b-c9d3-9325-51d07adb6e99.png)

# 疎通確認
* VMにアクセスしプライベートIPが引けていることを確認します。

```
# nslookup [ストレージアカウント名].blob.core.windows.net
```

* ストレージアカウントのアクセスキーを使ってアクセスできればOKです

```
# az storage blob list --container-name [コンテナー名] --account-name [ストレージアカウント名] --account-key [アクセスキー]
```

* クロスアカウントでのマネージドIDは使えないので、アクセスキーかSASでのアクセスになりそうですね。

以上