Azure のサービスエンドポイント vs プライベートエンドポイント

Azure のサービスエンドポイントとプライベートエンドポイントは、仮想ネットワーク(閉域網)内でのアクセスに限定する方法として似ている機能なので、何が違うのかを比較してみたい。

まずは、それぞれの機能の特徴を見てみる。

## サービスエンドポイントとは

Azure Storage や Azure SQL Database など仮想ネットワークに直接デプロイできないサービスを仮想ネットワーク内の特定のサブネットからのみにアクセスを制限できる機能で、各サービスが持っているファイアウォールの機能と連動して動作する。

サービスエンドポイントを利用するには Azure Storage などの「ファイアウォールの設定」で許可するサブネットを指定するだけですぐに利用できる。

実際に Azure Storage に対して「ファイアウォール設定」を行い、その動作を見てみる。
![storage-ファイアウォールと仮想ネットワーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46683/36963be6-267f-f394-1027-e52cf4af02f7.png)
**設定の流れ：**

1. ストレージカウントのリソース画面で「ファイアウォールと仮想ネットワーク」の設定画面を開く
2. 「＋既存の仮想ネットワークを追加」をクリックしてアクセスを許可したいサブネットを選択する
3. サービスエンドポイントを利用するために「有効化」をクリックする
4. 「追加」をクリックすることでこのサブネットからのアクセスが有効になる (この画面は割愛)

3 の段階でサブネットに対してサービスエンドポイントを有効にすると裏ではルートテーブルの更新が自動で行われている。
サービスエンドポイントの設定前と後でどのようにルートテーブルが更新されているかを確認してみる。
(すでにサブネットに対してサービスエンドポイントを有効にしている場合は 3 のアクションは発生しない)

**サービスエンドポイント設定前のルートテーブル：**
![初期のルート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46683/a6c25a23-da77-6db3-8ea6-fd451d95f1ce.png)
**サービスエンドポイント設定後のルートテーブル：**
![サービスエンドポイント設定後のルート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46683/77130b52-c1f0-6837-ca75-09a1e6368644.png)
サービスエンドポイントの設定後には２つのルーティング定義が追加されていることがわかる。
これらの IP アドレスは `13.73.8.16/28` が東日本のストレージアカウントで `20.150.10.0/23` は西日本のストレージアカウントであることが下記の公開されているサービスタグの IP レンジで確認できる。
Download Azure IP Ranges and Service Tags：https://www.microsoft.com/en-us/download/confirmation.aspx?id=56519

Azure SQL Database のファイアウォール設定を行った場合も同様に Azure SQL Database 用のルーティング定義がルートテーブルに追加される。

このようにルートテーブルが書き換えられることでサブネットから Azure Storage などのパブリック IP を持つサービスへのアクセスは次のように変化する。

**サービスエンドポイント設定前のルートテーブル書き換えなしの場合：**
Azure Storage へのアクセスは SNAT を経由して Azure が保有している適当なパブリック IP が一時的に利用されて送信元の IP がパブリックで通信される。
(Load Balancer の有無や VM にパブリック IP を割り当てている場合では若干異なるが送信元がパブリック IP であることには違いはない)

**サービスエンドポイント設定後のルートテーブル書き換えありの場合：**
ルートテーブルによって Azure Storage へのアクセスは強制的にルーティングされて送信元の IP がプライベートのまま通信される。
送信元がプライベート IP になるため、Azure Storage の「ファイアウォールと仮想ネットワーク」で許可したサブネットからのアクセスかを判定することができる。

これにより仮想ネットワーク内の特定のサブネットからのアクセスの制御を実現している。
下記の図はさまざまなアクセスに対する経路とアクセス制御を表している。
![サービスエンドポイント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46683/4f64b51c-afe8-6752-4267-7208c53017d8.png)

- 「Subnet A」からのアクセス①は **許可** される  
    - サービスエンドポイントが設定されていることで送信元がプライベート IP になる
    - Azure Storage 側の「ファイアウォール設定」で「Subnet A」が許可されている
- 「Subnet B」からのアクセス②は **拒否** される
    - サービスエンドポイントが設定されていることで送信元がプライベート IP になる
    - Azure Storage 側の「ファイアウォール設定」で「Subnet B」は許可されていない
- 「Subnet C」からのアクセス③は **拒否** される
    - サービスエンドポイントが設定されていないので送信元がパブリック IP になる
- 「オンプレ」からのアクセス③は **拒否** される
    - ExpressRoute などの VPN 接続が行われていたとしてもオンプレ側のプロクシなどを経由するため送信元がパブリック IP になる
- 「インターネット」からのアクセス③は **拒否** される
    - 送信元がパブリック IP になる

## プライベートエンドポイントとは

プライベートリンクを実現するための仕組みの一つで、プライベートリンクサービスにプライベートで安全に接続するネットワークインターフェイスを提供する。
プライベートリンクサービスとはプライベートリンクを使用するサービスのことで、 Azure Storage や Azure SQL Database などの定義済みのプライベートリンクリソースなどを指す。

要するに Azure Storage などのサービスに仮想ネットワーク内のサブネットにあるネットワークインターフェイスがマップされて、Azure Storage などのサービスに対して プライベート IP が割り振られ、その IP に直接アクセスできるようにする機能である。
![プライベートエンドポイント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46683/cf038cfe-4782-5b45-47e5-1728e60d2f74.png)
プライベートリンクを利用すると仮想ネットワーク内のすべてと接続されたオンプレ上からの閉域網のすべてのどこからでもアクセスが可能になる。
Azure Storage などのファイアウォール設定で特定のサブネットのみを許可していても閉域網であればすべてのアクセスが許可される。

注意が必要なのは、ネットワークセキュリティグループ(以下NSG)を設定しても無視されることである。

NSG を使って特定のサブネットや IP からのみをアクセス制御をかけたいと誰でも思うが、現時点ではプレビュー版ということなのか機能しない。
公式サイトではクライアント側の NSG の送信規則でブロックすることを推奨している。

プライベートエンドポイントは名前解決も考慮する必要がある。

プライベートエンドポイントを作成するときに Azure DNS Private Zones を使って名前解決するかを選択できて、仮想ネットワークと Azure DNS Private Zones がリンクされ仮想ネットワーク内での名前解決は Azure DNS Private Zones によって行われる。(図の①)
ただしこの動作は仮想ネットワークにカスタム DNS の設定を行っていない場合に限る。

オンプレからのアクセスの場合、名前解決でプライベート IP を取得できないためオンプレ側の DNS に Azure Storage の FQDN を登録する必要がある。(図の②)

## 適材適所を見極める

サービスエンドポイントとプライベートエンドポイントは閉域網からのアクセスをサポートする素晴らしい機能だが、どちらも一長一短がある。

サービスエンドポイントはサブネットのルートテーブルの書き換えによってサブネット内からのアクセス経路をショートカットし特定のサブネットのみのアクセスを許可してくれるが、オンプレからのアクセスはできない。
(ただしサブネット内に Proxy などを立てて経由することでアクセスすることはできる)

プライベートエンドポイントはサブネットのネットワークインターフェイスがマップされてプライベート IP でのアクセスが可能になり閉域網全体からのアクセスが可能になる反面、特定の場所のみに制限することができない。
(クライアント側で送信制限を行うことで実現することは可能だが現実的ではない)

それぞれの特徴や動作をよく理解して適材適所で利用することが重要である。