はじめに
Microsoft Ignite 2018 で Service Endpoint Policies という新機能がアナウンスされました。本エントリーでは、この Service Endpoint Policies を試した結果をまとめます。
Service Endpoint Policies とは
Service Endpoint Policies とは Service Endpoint 経由でアクセスできる Azure サービスを制限する機能です。2018年10月現在、Service Endpoint Policies はプレビューであり、対象サービスもAzure Storage に限られています。
そもそも、Service Endpoint とは、VNet 内のサブネットに Azure サービスへの裏口を作る機能です。Service Endpoint を有効にすると、Azure サービスで利用されているグローバルIPアドレス宛てのルーティングがサブネットに注入されます。そのため、グローバルIPアドレスで提供されている Azure サービスあての通信が0.0.0.0/0にマッチしなくなり、裏口から抜けていくようになります。Service Endpoint で Storage を有効にすると、次のようなルーティングが注入されます。
ただし、Azure サービスはマルチテナントなので、複数のユーザが同じアドレスを利用しています。そのため、この裏口を経由して他人の所有する Azure リソースにもアクセスできてしまいます。これまでは、裏口経由でアクセスできる Azure リソースを制限できませんでした。これを制限できるようにするのが Service Endpoint Policies です。
動作確認
事前準備
Service Endpoint 経由でストレージアカウントにだけアクセスできるサブネットを用意します。
Service Endpoint を Azure Storage に対して有効にします。Azure Storage を有効にした場合、VNet と同じリージョンとペアリージョンへの裏口ができます。
さらに、UDRを利用して0.0.0.0/0をVNet内の利用していないIPアドレスに向けます。これでこのサブネット上の Virtual Machine は VNet 内と Azure Storage にのみアクセスできます。インターネット経由で Azure にはアクセスできません。
Service Endpoint Policies なしの動作
Blob Storage に誰でも読み取りできるファイルを置いたうえで、Virtual Machine から Invoke-WebRequest しました。結果は以下の通りです。VNetと同のサブスクリプション配下のストレージアカウントだけでなく、他のサブスクリプション配下のストレージアカウントにもアクセスできてしまいます。これは期待された動作です。
対象 | サブスクリプション | 作成時期 | バージョン | 場所 | 結果 |
---|---|---|---|---|---|
その1 | VNetと同じサブスクリプション | 以前からあった | StorageV2 | VNetと同じ | アクセスできた |
その2 | VNetと同じサブスクリプション | 今回のために作った | StorageV1 | VNetと同じ | アクセスできた |
その3 | 別サブスクリプション | 以前からあった | StorageV1 | VNetと同じ | アクセスできた |
その4 | 別サブスクリプション | 今回のために作った | StorageV2 | VNetと同じ | アクセスできた |
その5 | 別サブスクリプション | 今回のために作った | StorageV1 | VNetと同じ | アクセスできた |
Service Endpoint Policies ありの動作
Service Endpoint Policies で設定できる許可の範囲は次の3択です。
- 特定のストレージアカウント
- 特定のリソースグループ内の全ストレージアカウント
- 現在のサブスクリプション内の全ストレージアカウント
今回は、ストレージアカウントその1(aimless1010v1)のみを許可する Service Endpoint Policies を上記の Virtual Machine が接続しているサブネットに適用します。
結果は次の通りです。なぜかストレージアカウントその3にアクセスできてしまう点を除けば、想定通りの動作です。Service Endpoint Policies で許可されていないストレージアカウントへのアクセスは「AuthorizationFailureThis request is not authorized to perform this operation.」でエラーになります。
対象 | サブスクリプション | 作成時期 | バージョン | 場所 | 結果 |
---|---|---|---|---|---|
その1 | VNetと同じサブスクリプション | 以前からあった | StorageV2 | VNetと同じ | アクセスできた |
その2 | VNetと同じサブスクリプション | 今回のために作った | StorageV1 | VNetと同じ | アクセスできない |
その3 | 別サブスクリプション | 以前からあった | StorageV1 | VNetと同じ | アクセスできた |
その4 | 別サブスクリプション | 今回のために作った | StorageV2 | VNetと同じ | アクセスできない |
その5 | 別サブスクリプション | 今回のために作った | StorageV1 | VNetと同じ | アクセスできない |
また、許可されたストレージアカウントにのみアクセスできるのであれば、Virtual Machine は Azure IaaS VM Backup 用の Azure Storageにアクセスできないはずです。ですが、Azure IaaS VM Backupは成功しました。これも想定外です・・・。
まとめ
若干の想定外が発生しましたが、意図した Azure サービスのみを許可することができました。Service Endpoint Policies を利用することで、利便性とセキュリティを両立できるようになります。今回発生した想定外は仕様だと思うので、ドキュメントが更新されるのを待ちます。