Azure の仮想ネットワークから Azure Storage へアクセスする際にサービスエンドポイントとストレージ側のファイアウォールを使うことで特定の仮想ネットワークからのみにアクセスを制限することができますが、この機能は現状、同一リージョンまたはペアリージョンへのアクセスのみサポートとなっていました。以下のリンクにある通り、任意のリージョンへのアクセスがパブリックプレビューで利用できるようになりましたので、さっそく試してみました。
2023/4/25 に GA となりました。
#サービスエンドポイントのメリット
上記のようなリージョンを跨いだ構成の場合、パブリック IP アドレスにて送信元を制御することもできますが、Azure Storage へのサービスエンドポイントを利用することで、以下のようなメリットもあります。
- ストレージへのアクセス経路の最適化
- 例えば強制トンネリング構成の際にストレージへのアクセスはバックボーン経由にしたいといった構成で UDR を使わずに対応可能
- パブリック IP アドレスによる SNAT がない
- LB や Firewall の SNAT 枯渇を防止
- ソース IP アドレスの特定
- パブリック IP アドレスが不要
- サブネット単位で許可させることができる
- サブネット内の VM は任意にアクセスできるようになるため、個別のアクセス制御も不要となる
※アクセス元のリソースと Azure Storage のリージョンが同じ場合はパブリック IP アドレスからは Azure Storage にアクセスできませんので注意が必要です。
#検証手順
プレビューの登録手順は以下にあります。
現状、Azure Powershell または Azure CLI でやる必要があります。
Connect-AzAccount
Set-AzContext -SubscriptionId <サブスクリプション ID>
Register-AzProviderFeature -ProviderNamespace Microsoft.Network -FeatureName AllowGlobalTagsForStorage
以下の RegistrationState が "Registered" になるまで待ちます。(20-30 分かかりました。)
Get-AzProviderFeature -ProviderNamespace Microsoft.Network -FeatureName AllowGlobalTagsForStorage
FeatureName ProviderName RegistrationState
----------- ------------ -----------------
AllowGlobalTagsForStorage Microsoft.Network Registering
仮想ネットワークのサブネットにストレージ用のサービスエンドポイント "Microsoft.Storage" を追加します。
Get-AzVirtualNetwork -ResourceGroupName "EREastUS" -Name "ERVNet" | Set-AzVirtualNetworkSubnetConfig -Name "VM-Subnet" -AddressPrefix "10.10.1.0/24" -ServiceEndpoint "Microsoft.Storage" | Set-AzVirtualNetwork
成功するとちゃんと登録されていることが確認できます。
"ServiceEndpoints": [
{
"ProvisioningState": "Succeeded",
"Service": "Microsoft.Storage",
"Locations": [
"*"
]
}
],
この段階でポータルからサブネットの追加を試みましたが、対象のサブネットは表示されませんでした。
以下の 2 つのコマンドで、ストレージ側の Firewall に対象のサブネットを追加します。
$subnet = Get-AzVirtualNetwork -ResourceGroupName "EREastUS" -Name "ERVNet" | Get-AzVirtualNetworkSubnetConfig -Name "VM-Subnet"
Add-AzStorageAccountNetworkRule -ResourceGroupName "Storage" -Name "gzrshiyamasto" -VirtualNetworkResourceId $subnet.Id
Action VirtualNetworkResourceId State
------ ------------------------ -----
Allow /subscriptions/xxxxx/resourceGroups/EREastUS/providers/Microsoft.Network/virtualNetworks/ERVNet/subnets/VM-Subnet Succeeded
設定が、"すべてのネットワーク" のままだったので、"選択されたネットワーク" に変更してみると、上記で追加したサブネットが追加済みとして表示されたので、そのまま保存します。
#動作確認
アクセス確認します。米国東部の VM から curl で問題なくアクセスできることを確認します。また、東日本の VM からアクセスしましたが、許可されてないため Status 403 になることも確認できました。
[testuser@EastUSVM ~]$ curl -v https://gzrshiyamasto.blob.core.windows.net/test/index.html
* About to connect() to gzrshiyamasto.blob.core.windows.net port 443 (#0)
* Trying 20.38.117.228...
* Connected to gzrshiyamasto.blob.core.windows.net (20.38.117.228) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate:
* subject: CN=*.blob.core.windows.net
* start date: Oct 13 21:51:40 2021 GMT
* expire date: Oct 13 21:51:40 2022 GMT
* common name: *.blob.core.windows.net
* issuer: CN=Microsoft RSA TLS CA 01,O=Microsoft Corporation,C=US
> GET /test/index.html HTTP/1.1
> User-Agent: curl/7.29.0
> Host: gzrshiyamasto.blob.core.windows.net
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 12
< Content-Type: text/html
< Content-MD5: bLL+2vK0uXm1HPdaivMY1w==
< Last-Modified: Fri, 10 Dec 2021 09:37:47 GMT
< ETag: 0x8D9BBC0B9F1A604
< Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
< x-ms-request-id: 60082f7b-101e-0065-4cb4-ed1d3b000000
< x-ms-version: 2009-09-19
< x-ms-lease-status: unlocked
< x-ms-blob-type: BlockBlob
< Date: Fri, 10 Dec 2021 10:53:40 GMT
<
* Connection #0 to host gzrshiyamasto.blob.core.windows.net left intact
Test BLOB
診断ログを確認します。ちゃんと VM の IP アドレス "10.10.1.4:43622" からアクセスがあることが確認できます。
1.0;2021-12-10T10:53:40.7513037Z;~省略~; 10.10.1.4:38580 ;~省略~, 10-Dec-21 09:37:47 GMT;;"curl/7.29.0";;
念のためサービスエンドポイントとストレージのファイアウォール設定を外した際のログも確認します。VM に割り当てたパブリック IP アドレスからアクセスがあることが確認できます。
1.0;2021-12-10T10:52:23.6285100Z;GetBlob;~省略~; 20.119.60.232:56374 ;~省略~, 10-Dec-21 09:37:47 GMT;;"curl/7.29.0";;
リージョンを跨いだサービスエンドポイント、ストレージのファイアウォールの動作確認が無事できました。