Azure Files では、Azure ファイル共有にアクセスするための次の主な 2 種類のエンドポイントが提供されます。
- パブリック IP アドレスを持つパブリック エンドポイント。 アクセスはプロトコルやネットワークルールによって異なります。 NFSクライアントは許可されたサブネットからサービスエンドポイントを使用します。
- プライベート エンドポイント。仮想ネットワーク内に存在し、その仮想ネットワークのアドレス空間内からのプライベート IP アドレスを持ちます。
クラシック ファイル共有 (Microsoft.Storage リソース プロバイダーで作成) の場合、Azure ストレージ アカウントにはパブリック エンドポイントとプライベート エンドポイントがあります。
Microsoft.FileShares リソース プロバイダーで作成されたファイル共有の場合は、ストレージ アカウント レベルではなく、ファイル共有レベルでパブリック エンドポイントとプライベート エンドポイントを作成します。
この記事では、プライベートエンドポイントの設定方法と、両方のリソースプロバイダーのパブリックエンドポイントアクセスの制限について説明します。 クラシックファイル共有のガイダンスは、クラシックSMBファイル共有をサポートするAzure File Syncで使われるストレージアカウントにも適用されます。 ファイル同期ネットワークの要件については、「Azure File Syncプロキシおよびファイアウォール設定の設定」をご覧ください。
このガイドを読む前に、Azure Files のネットワークに関する考慮事項を確認してください。
前提条件
ストレージ アカウントをクラシック共有または個別の Microsoft.FileShares リソース用に設定することで、ファイル共有へのネットワーク アクセスを制限できます。 仮想ネットワークへのアクセスを制限するには、以下のいずれかの方法を用いてください。
プライベート エンドポイントの作成
ファイル共有のプライベート エンドポイントを作成するときは、次のAzureリソースをデプロイします。
-
プライベート エンドポイント: プライベート エンドポイントを表すAzure リソース。 このリソースは、ターゲット リソースとネットワーク インターフェイスの間のコネクタと考えることができます。
-
ネットワーク インターフェイス (NIC): 指定された仮想ネットワークとサブネット内にプライベート IP アドレスを保持するネットワーク インターフェイス。 このリソースは、仮想マシン (VM) をデプロイするときにデプロイするリソースと同じです。 ただし、VM に割り当てる代わりに、プライベート エンドポイントが VM を所有します。
-
プライベートドメインネームシステム(DNS)ゾーン:これらのステップは、仮想ネットワークに接続されたAzureプライベートDNSゾーンを作成し、プライベートエンドポイント用のAレコードを追加します。 クライアントがファイルシェアのホスト名をプライベートエンドポイントのIPアドレスに解決すれば、自社のDNSインフラを使うこともできます。
注
パブリッククラウドAzure、両方のリソースプロバイダーがプライベートDNSゾーンprivatelink.file.core.windows.netを使用しています。 クライアント ホスト名は異なっています。例については、「接続の確認」を参照してください。 他のAzureクラウドのクラシックファイル共有の場合は、そのクラウドのストレージエンドポイントのサフィックスを使いましょう。 Microsoft.FileShares を展開する前に地域の利用可能性を確認してください。
Classic と Microsoft.FileShares の比較
プライベートエンドポイントの作成プロセスは、クラシックなファイル共有モデルを使うか新しいファイル共有モデルを使うかによって若干異なります。 従来のファイル共有の場合、ファイル共有を含むストレージアカウント用のプライベートエンドポイントを作成します。 Microsoftで作成されたファイル共有用です。FileSharesは、ファイル共有自体のためにプライベートエンドポイントを作成します。
両方の体験で多くのステップは同じです。 異なるのはリソース参照、グループID、DNSレコード名のみであり、以下の表に示されています。
|
クラシック ファイル共有 (Microsoft.Storage) |
ファイル共有 (Microsoft.FileShares) |
|
プライベート エンドポイント ターゲット |
ストレージ アカウント |
ファイル共有 |
|
リソース コマンドレット |
Get-AzStorageAccount |
Get-AzFileShare |
|
グループID(サブリソース) |
file |
FileShare |
|
DNS A レコード名 |
ストレージ アカウント名 |
ホスト名プレフィックス (たとえば、 fs-xxxxxxxxxxxxxxxxx) |
プライベート エンドポイントを作成するリソース グループに移動します。 [ + 作成 ] を選択し、 プライベート エンドポイントを検索します。 プライベート エンドポイント リソースを選択し、[ 作成] を選択します。
ウィザードには、完了する複数のページがあります。
[ 基本 ] ページで、プライベート エンドポイントのサブスクリプション、リソース グループ、名前、ネットワーク インターフェイス名、リージョンを選択します。 プライベート エンドポイントを作成する仮想ネットワークと同じリージョンにプライベート エンドポイントを作成する必要があります。 その後、[次へ: リソース] を選択します。
Resource ページで、Resource type のドロップダウン メニューから Microsoft.Storage/storageAccounts を選択します。
リソースでは、接続したい特定のストレージアカウントを選択してください。
ターゲットサブリソースについてはfileを選択します。
[次へ: Virtual Network] を選択します。
リソース ページで、リソースの種類 のドロップダウン メニューから Microsoft.FileShares/fileShares を選択します。
リソースでは、接続したい特定のファイル共有を選択します。 ターゲット サブリソースには、FileShare が自動的に設定されます。
[次へ: Virtual Network] を選択します。
Virtual Network ページでは、プライベート エンドポイントを追加する特定のvirtual networkとサブネットを選択できます。 新しいプライベート エンドポイントの動的または静的 IP アドレスの割り当てを選択します。 静的を選択した場合は、名前とプライベート IP アドレスも指定する必要があります。 必要に応じて、アプリケーション セキュリティ グループを指定することもできます。 完了したら、[次: DNS] を選びます。
DNS ページには、プライベート エンドポイントとプライベート DNS ゾーンを統合するための情報が含まれています。 サブスクリプションとリソース グループが正しいことを確認し、[ 次へ: タグ] を選択します。
必要に応じて、タグを適用してリソースを分類できます。たとえば、[名前] の [環境] と [値] の [テスト] をすべてのテスト リソースに適用します。 必要に応じて名前と値のペアを入力し、[次へ: レビュー + 作成] を選択します。
[作成] を選択してプライベート エンドポイントを作成します。
プライベート エンドポイントを作成するには、まず、ストレージ アカウントまたはファイル共有への参照と、プライベート エンドポイントを追加する仮想ネットワーク サブネットを取得します。 次のコードのプレースホルダー値を独自の値に置き換えます。
ストレージ口座の参照を入手してください:
$storageAccountResourceGroupName = "<storage-account-resource-group-name>"
$storageAccountName = "<storage-account-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction SilentlyContinue
if ($null -eq $storageAccount) {
$errorMessage = "Storage account $storageAccountName not found "
$errorMessage += "in resource group $storageAccountResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Set common variables for private endpoint creation
$resourceGroupName = $storageAccountResourceGroupName
$privateLinkResourceId = $storageAccount.Id
$groupId = "file"
$dnsRecordName = $storageAccountName
ファイル共有の参照を入手してください:
$fileShareResourceGroupName = "<resource-group-name>"
$fileShareName = "<file-share-name>"
$fileShare = Get-AzFileShare `
-ResourceGroupName $fileShareResourceGroupName `
-ResourceName $fileShareName `
-ErrorAction SilentlyContinue
if ($null -eq $fileShare) {
$errorMessage = "File share $fileShareName not found "
$errorMessage += "in resource group $fileShareResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Extract hostName and hostNamePrefix for DNS record
$hostName = $fileShare.HostName
$hostNamePrefix = $hostName.Split('.')[0]
# Set common variables for private endpoint creation
$resourceGroupName = $fileShareResourceGroupName
$privateLinkResourceId = $fileShare.Id
$groupId = "FileShare"
$dnsRecordName = $hostNamePrefix
仮想ネットワークとサブネットへの参照を取得します。
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<vnet-subnet-name>"
# Get virtual network reference, and throw error if it doesn't exist
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName `
-ErrorAction SilentlyContinue
if ($null -eq $virtualNetwork) {
$errorMessage = "Virtual network $virtualNetworkName not found "
$errorMessage += "in resource group $virtualNetworkResourceGroupName."
Write-Error -Message $errorMessage -ErrorAction Stop
}
# Get reference to virtual network subnet, and throw error if it doesn't exist
$subnet = $virtualNetwork | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
Write-Error `
-Message "Subnet $subnetName not found in virtual network $virtualNetworkName." `
-ErrorAction Stop
}
プライベート エンドポイントを作成するには、プライベート リンク サービス接続を作成する必要があります。 プライベート リンク サービス接続は、プライベート エンドポイントの作成に対する入力です。
# Disable private endpoint network policies
$subnet.PrivateEndpointNetworkPolicies = "Disabled"
$virtualNetwork = $virtualNetwork | `
Set-AzVirtualNetwork -ErrorAction Stop
# Create a private link service connection.
$privateEndpointConnection = New-AzPrivateLinkServiceConnection `
-Name "$dnsRecordName-Connection" `
-PrivateLinkServiceId $privateLinkResourceId `
-GroupId $groupId `
-ErrorAction Stop
# Create a new private endpoint.
$privateEndpoint = New-AzPrivateEndpoint `
-ResourceGroupName $resourceGroupName `
-Name "$dnsRecordName-PrivateEndpoint" `
-Location $virtualNetwork.Location `
-Subnet $subnet `
-PrivateLinkServiceConnection $privateEndpointConnection `
-ErrorAction Stop
Azure のプライベート DNS ゾーンを仮想ネットワークに接続し、クライアントがファイル共有の元のホスト名をプライベート エンドポイントの IP アドレスに名前解決できるようにします。 以下の手順は両方のリソース提供者に適用されます。
# Get the host name suffix (core.windows.net for public cloud).
# This is done like this so this script will seamlessly work for non-public Azure.
$hostNameSuffix = Get-AzContext | `
Select-Object -ExpandProperty Environment | `
Select-Object -ExpandProperty StorageEndpointSuffix
# For public cloud, this will generate the following DNS suffix:
# privatelink.file.core.windows.net.
$dnsZoneName = "privatelink.file.$hostNameSuffix"
# Find a DNS zone matching desired name attached to this virtual network.
$dnsZone = Get-AzPrivateDnsZone | `
Where-Object { $_.Name -eq $dnsZoneName } | `
Where-Object {
$privateDnsLink = Get-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName $_.ResourceGroupName `
-ZoneName $_.Name `
-ErrorAction SilentlyContinue
$privateDnsLink.VirtualNetworkId -eq $virtualNetwork.Id
}
if ($null -eq $dnsZone) {
# No matching DNS zone attached to virtual network, so create new one.
$dnsZone = New-AzPrivateDnsZone `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $dnsZoneName `
-ErrorAction Stop
$privateDnsLink = New-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName $virtualNetworkResourceGroupName `
-ZoneName $dnsZoneName `
-Name "$virtualNetworkName-DnsLink" `
-VirtualNetworkId $virtualNetwork.Id `
-ErrorAction Stop
}
プライベート DNS ゾーンへの参照が作成されたので、レコードを作成する必要があります。
$privateEndpointIP = $privateEndpoint | `
Select-Object -ExpandProperty NetworkInterfaces | `
Select-Object @{
Name = "NetworkInterfaces";
Expression = { Get-AzNetworkInterface -ResourceId $_.Id }
} | `
Select-Object -ExpandProperty NetworkInterfaces | `
Select-Object -ExpandProperty IpConfigurations | `
Select-Object -ExpandProperty PrivateIpAddress
$privateDnsRecordConfig = New-AzPrivateDnsRecordConfig `
-IPv4Address $privateEndpointIP
New-AzPrivateDnsRecordSet `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $dnsRecordName `
-RecordType A `
-ZoneName $dnsZoneName `
-Ttl 600 `
-PrivateDnsRecords $privateDnsRecordConfig `
-ErrorAction Stop | `
Out-Null
プライベート エンドポイントを作成するには、まず、ストレージ アカウントまたはファイル共有への参照と、プライベート エンドポイントを追加する仮想ネットワーク サブネットを取得します。 次の手順のプレースホルダーの値を独自の値に置き換えます。
ストレージ口座の参照を入手してください:
storageAccountResourceGroupName="<storage-account-resource-group-name>"
storageAccountName="<storage-account-name>"
# Get storage account ID
privateLinkResourceId=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" --output tsv)
# Set common variables for private endpoint creation
resourceGroupName=$storageAccountResourceGroupName
groupId="file"
dnsRecordName=$storageAccountName
ファイル共有の参照を入手してください:
# Install the fileshare extension
az extension add --name fileshare
fileShareResourceGroupName="<resource-group-name>"
fileShareName="<file-share-name>"
# Get the file share resource ID and host name
privateLinkResourceId=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "id" --output tsv)
hostName=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "properties.hostName" --output tsv)
hostNamePrefix=$(echo $hostName | cut -d'.' -f1)
# Set common variables for private endpoint creation
resourceGroupName=$fileShareResourceGroupName
groupId="FileShare"
dnsRecordName=$hostNamePrefix
共通変数を設定した後、残りの手順は両方のエクスペリエンスで同じです。 仮想ネットワークとサブネットへの参照を取得します。
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<vnet-subnet-name>"
virtualNetwork=$(az network vnet show \
--resource-group $virtualNetworkResourceGroupName \
--name $virtualNetworkName \
--query "id" --output tsv)
subnet=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "id" --output tsv)
プライベート エンドポイントを作成するには、サブネットのプライベート エンドポイント ネットワーク ポリシーが無効になっていることを確認し、 az network private-endpoint createを使用してプライベート エンドポイントを作成します。
# Disable private endpoint network policies
az network vnet subnet update \
--ids $subnet \
--disable-private-endpoint-network-policies \
--output none
# Get virtual network location
region=$(az network vnet show \
--ids $virtualNetwork \
--query "location" --output tsv)
# Create a private endpoint
privateEndpoint=$(az network private-endpoint create \
--resource-group $resourceGroupName \
--name "$dnsRecordName-PrivateEndpoint" \
--location $region \
--subnet $subnet \
--private-connection-resource-id $privateLinkResourceId \
--group-id $groupId \
--connection-name "$dnsRecordName-Connection" \
--query "id" --output tsv)
AzureのプライベートDNSゾーンを仮想ネットワークに接続し、クライアントがファイル共有の元のホスト名をプライベートエンドポイントのIPアドレスに変換できるようにします。 以下の手順は両方のリソース提供者に適用されます。
# Get the desired storage account suffix (core.windows.net for public cloud).
# This is done so the script will work for non-public Azure clouds.
storageAccountSuffix=$(az cloud show \
--query "suffixes.storageEndpoint" --output tsv)
# For public cloud, this generates the DNS suffix:
# privatelink.file.core.windows.net.
dnsZoneName="privatelink.file.$storageAccountSuffix"
# Find a DNS zone matching the desired name attached to this virtual network.
possibleDnsZones=$(az network private-dns zone list \
--query "[?name == '$dnsZoneName'].id" \
--output tsv)
dnsZone=""
for possibleDnsZone in $possibleDnsZones
do
possibleResourceGroupName=$(az resource show \
--ids $possibleDnsZone \
--query "resourceGroup" --output tsv)
link=$(az network private-dns link vnet list \
--resource-group $possibleResourceGroupName \
--zone-name $dnsZoneName \
--query "[?virtualNetwork.id == '$virtualNetwork'].id" \
--output tsv)
if [ -n "$link" ]
then
dnsZoneResourceGroup=$possibleResourceGroupName
dnsZone=$possibleDnsZone
break
fi
done
if [ -z "$dnsZone" ]
then
# No matching DNS zone attached to the virtual network, so create a new one.
dnsZone=$(az network private-dns zone create \
--resource-group $virtualNetworkResourceGroupName \
--name $dnsZoneName \
--query "id" --output tsv)
az network private-dns link vnet create \
--resource-group $virtualNetworkResourceGroupName \
--zone-name $dnsZoneName \
--name "$virtualNetworkName-DnsLink" \
--virtual-network $virtualNetwork \
--registration-enabled false \
--output none
dnsZoneResourceGroup=$virtualNetworkResourceGroupName
fi
プライベート DNS ゾーンへの参照が作成されたので、A レコードを作成します。
privateEndpointNIC=$(az network private-endpoint show \
--ids $privateEndpoint \
--query "networkInterfaces[0].id" --output tsv)
privateEndpointIP=$(az network nic show \
--ids $privateEndpointNIC \
--query "ipConfigurations[0].privateIPAddress" --output tsv)
az network private-dns record-set a create \
--resource-group $dnsZoneResourceGroup \
--zone-name $dnsZoneName \
--name $dnsRecordName \
--output none
az network private-dns record-set a add-record \
--resource-group $dnsZoneResourceGroup \
--zone-name $dnsZoneName \
--record-set-name $dnsRecordName \
--ipv4-address $privateEndpointIP \
--output none
接続を検証する
仮想ネットワーク内のクライアントから、またはプライベートエンドポイントを解決するためにDNSが設定された接続ネットワークからチェックを実行します。 リソースプロバイダー間の違いについては 、DNS解決を参照してください。 シェアをマウントするには元のホスト名を使い、privatelink の名前を使わないでください。
PowerShell、コマンドライン、または Windows、Linux、macOS のターミナルから以下の DNS ルックアップを実行します。
<storage-account-name>を適切なストレージアカウント名に置き換えてください:
nslookup <storage-account-name>.file.core.windows.net
成功した場合、次のような出力が表示されます。192.168.0.5は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです (Windowsの出力)。
Server: UnKnown
Address: 10.2.4.4
Non-authoritative answer:
Name: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: storageaccount.file.core.windows.net
ファイル共有のホスト名を使いましょう。 ファイル共有の [概要] タブで、右上の JSON ビュー を選択します。 JSON ビューのプロパティで、 hostName の値をコピーします。 形式は fs-xxxxxxxxxxxxxxxxx.xx.file.storage.azure.netのようになります。
nslookup <file-share-host-name>
成功した場合、次のような出力が表示されます。192.168.0.5は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです (Windowsの出力)。
Server: UnKnown
Address: 10.2.4.4
Non-authoritative answer:
Name: <hostNamePrefix>.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: <hostNamePrefix>.<zone>.file.storage.azure.net
DNS解決を確認するために以下のPowerShellコマンドを実行してください:
$storageAccountHostName = [System.Uri]::new($storageAccount.PrimaryEndpoints.file) | `
Select-Object -ExpandProperty Host
Resolve-DnsName -Name $storageAccountHostName
成功した場合は、次のような出力が表示されます。 192.168.0.5 は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです。
Name Type TTL Section NameHost
---- ---- --- ------- --------
storageaccount.file.core.windows CNAME 60 Answer storageaccount.privatelink.file.core.windows.net
.net
Name : storageaccount.privatelink.file.core.windows.net
QueryType : A
TTL : 600
Section : Answer
IP4Address : 192.168.0.5
Resolve-DnsName -Name $fileShare.HostName
成功した場合は、次のような出力が表示されます。 192.168.0.5 は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです。
Name Type TTL Section NameHost
---- ---- --- ------- --------
<hostNamePrefix>.<zone>.file.storage.azur CNAME 60 Answer <hostNamePrefix>.privatelink.file.core.windows.net
e.net
Name : <hostNamePrefix>.privatelink.file.core.windows.net
QueryType : A
TTL : 600
Section : Answer
IP4Address : 192.168.0.5
ホスト名を取得しDNS解決を確認するには以下のコマンドを実行してください:
httpEndpoint=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "primaryEndpoints.file" --output tsv)
hostName=$(echo $httpEndpoint | cut -c7-$(expr length $httpEndpoint) | tr -d "/")
nslookup $hostName
成功した場合は、次のような出力が表示されます。 192.168.0.5 は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです。 ファイル共有をマウントするには、privatelinkパスではなく元のホスト名(storageaccount.file.core.windows.net)を使うべきです。
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
storageaccount.file.core.windows.net canonical name = storageaccount.privatelink.file.core.windows.net.
Name: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
hostName=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "properties.hostName" --output tsv)
nslookup $hostName
成功した場合は、次のような出力が表示されます。 192.168.0.5 は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです。
privatelink パスではなく、ファイル共有の元の hostName を使用してファイル共有をマウントしてください。
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
<hostNamePrefix>.<zone>.file.storage.azure.net canonical name = <hostNamePrefix>.privatelink.file.core.windows.net.
Name: <hostNamePrefix>.privatelink.file.core.windows.net
Address: 192.168.0.5
パブリック エンドポイント アクセスを制限する
パブリック ネットワーク アクセスを無効にするか、選択したネットワークに対してのみ有効のままにできます。 これらは別々の構成です。 プライベートエンドポイントはどちらの設定でも動作を続けます。
クラシック ファイル共有の場合は、ストレージ アカウントでパブリック アクセスを構成してください。 Microsoft.FileShares の場合。ファイルシェアは、それぞれのファイル共有で設定してください。 クラシックファイル共有は、プロトコルの制限を前提に ネットワークセキュリティ境界を利用することもできます。 強制モードでは、ペリメーターがサービスエンドポイントを通るNFSトラフィックをブロックします。
パブリック エンドポイントへのアクセスを無効にする
パブリックネットワークアクセスを無効にすると、クライアントはサービスエンドポイントを含めてパブリックエンドポイント経由で接続できません。 クライアントはプライベートエンドポイント経由で接続可能です。 この設定ではクライアントからのアウトバウンドトラフィックを制限しません。
クラシックファイル共有のパブリックネットワークアクセスを無効にするには、以下の手順に従ってください:
- パブリックエンドポイントへのすべてのインバウンドアクセスを制限したいストレージアカウントに行ってください。
- サービスメニューの セキュリティ+ネットワークの「 ネットワーク」を選択してください。
- [ パブリック ネットワーク アクセス] で、[管理] を選択 します。
-
無効を選択し、次に進行を選択します。
-
保存を選びます。
パブリック アクセスを無効にするファイル共有に移動します。 サービス メニューの [設定] で [構成] を選びます。
[パブリック ネットワーク アクセス] を [無効] に設定し、[保存] を選択します。
クラシックなファイル共有の場合は、ストレージアカウントで -PublicNetworkAccess を Disabled に設定してください。
# Use the storage account variables from the beginning of this guide.
Set-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-PublicNetworkAccess Disabled `
-ErrorAction Stop |
Out-Null
ファイル共有で -PublicNetworkAccess を Disabled に設定してください。
# To learn more about the Az.FileShare module, see https://www.powershellgallery.com/packages/Az.FileShare/1.0.0
Install-Module -Name Az.FileShare -Repository PSGallery -RequiredVersion 1.0.0
$fileShareResourceGroupName = "<resource-group-name>"
$fileShareName = "<file-share-name>"
Update-AzFileShare `
-ResourceGroupName $fileShareResourceGroupName `
-ResourceName $fileShareName `
-PublicNetworkAccess Disabled
クラシックなファイル共有の場合は、ストレージアカウントで --public-network-access を Disabled に設定してください。
# This assumes $storageAccountResourceGroupName and $storageAccountName
# are still defined from the beginning of this guide.
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--public-network-access Disabled \
--output none
ファイル共有で --public-network-access を Disabled に設定してください。
# Install the fileshare extension
az extension add --name fileshare
fileShareResourceGroupName="<resource-group-name>"
fileShareName="<file-share-name>"
az fileshare update \
--name $fileShareName \
--resource-group $fileShareResourceGroupName \
--public-network-access Disabled
パブリックエンドポイントへのアクセスを特定のネットワークに制限する
選択したサブネットからのクライアントを許可するには、パブリック ネットワーク アクセスを有効にし、それらのサブネット上でサービス エンドポイントを有効にし、サブネットをリソースのネットワーク ルールに追加します。 プライベートエンドポイントの有無にかかわらず、サービスエンドポイントを利用できます。 従来のSMBやFileRESTアクセスもIPアドレスルールを使用できます。NFSアクセスは許可されたサブネットが必要です。
PowerShellやCLIの例は、すでにパブリックネットワークアクセスが有効になっていることを前提としています。 Microsoft.FileSharesの例は、クライアント サブネットにすでにMicrosoft.Storageサービス エンドポイントがあることを前提としています。 そのエンドポイントを設定するには、「 サブネット上のサービスエンドポイントを有効にする」をご覧ください。
クラシックなファイル共有の場合は、パブリックエンドポイントを特定のネットワークに制限する手順に従ってください。
- パブリックエンドポイントを特定のネットワークに制限したいストレージアカウントに行ってください。
- サービスメニューの セキュリティ+ネットワークの「 ネットワーク」を選択してください。
- [ パブリック ネットワーク アクセス スコープ] で、[ 選択したネットワークから有効にする] を選択します。 この選択により、パブリック エンドポイントの制限を制御するためのさまざまな設定が表示されます。
-
仮想ネットワークの「仮想ネットワークを追加」を選択し>既存の仮想ネットワークを追加して、パブリックエンドポイントを通じてストレージアカウントへのアクセスを許可すべき仮想ネットワークを選択します。 仮想ネットワークとその仮想ネットワークのサブネットを選び、[有効化] を選びます。 この目的で新しい仮想ネットワークを作成したい場合は、「仮想ネットワークを追加」>「新しい仮想ネットワークを追加」を選び、詳細を入力してから「作成」を選択してください。
- SMBやFileRESTへのアクセスには、 IPv4アドレス を使って許可したいパブリックインターネットIPアドレスを指定します。 IPアドレスのルールはNFSへのアクセスを許可しません。
- サービス統合が信頼されたサービス アクセスを必要とする場合は、信頼された Microsoft サービスにこのリソースへのアクセスを許可チェック ボックスを選択してください。
-
保存を選びます。
パブリック アクセスを制限するファイル共有に移動します。 サービス メニューの [設定] で [ 構成] を選択します。 [ パブリック ネットワーク アクセス] で、 選択した仮想ネットワークから [有効] を選択し、共有へのアクセスが許可されている仮想ネットワークとサブネットを追加して、[ 保存] を選択します。
クラシック ファイル共有の場合は、サービス エンドポイントを使用して、ストレージ アカウントのパブリック エンドポイントへのアクセスを特定の仮想ネットワークに制限します。 まず、ストレージ アカウントと仮想ネットワークに関する情報を収集します。 次の手順のプレースホルダーの値を独自の値に置き換えます。
$storageAccountResourceGroupName = "<storage-account-resource-group>"
$storageAccountName = "<storage-account-name>"
$restrictToVirtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$restrictToVirtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction Stop
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $restrictToVirtualNetworkResourceGroupName `
-Name $restrictToVirtualNetworkName `
-ErrorAction Stop
$subnet = $virtualNetwork | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
Write-Error `
-Message "Subnet $subnetName not found in virtual network $restrictToVirtualNetworkName." `
-ErrorAction Stop
}
仮想ネットワークからのトラフィックを許可するには、Azure ネットワーク ファブリックが仮想ネットワークのサブネットにMicrosoft.Storage サービス エンドポイントを公開する必要があります。 次の PowerShell コマンドでは、Microsoft.Storage サービス エンドポイントがまだ存在しない場合は、サブネットに追加します。
$serviceEndpoints = $subnet | `
Select-Object -ExpandProperty ServiceEndpoints | `
Select-Object -ExpandProperty Service
if ($serviceEndpoints -notcontains "Microsoft.Storage") {
if ($null -eq $serviceEndpoints) {
$serviceEndpoints = @("Microsoft.Storage")
} elseif ($serviceEndpoints -is [string]) {
$serviceEndpoints = @($serviceEndpoints, "Microsoft.Storage")
} else {
$serviceEndpoints += "Microsoft.Storage"
}
$virtualNetwork = $virtualNetwork | Set-AzVirtualNetworkSubnetConfig `
-Name $subnetName `
-AddressPrefix $subnet.AddressPrefix `
-ServiceEndpoint $serviceEndpoints `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Set-AzVirtualNetwork `
-ErrorAction Stop
}
ストレージ アカウントへのトラフィックを制限する最後の手順は、ネットワーク規則を作成し、それをストレージ アカウントのネットワーク 規則セットに追加することです。
$networkRule = $storageAccount | Add-AzStorageAccountNetworkRule `
-VirtualNetworkResourceId $subnet.Id `
-ErrorAction Stop
$storageAccount | Update-AzStorageAccountNetworkRuleSet `
-DefaultAction Deny `
-VirtualNetworkRule $networkRule `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
これらのコマンドは既存のバイパス設定を保持します。 統合が信頼サービスアクセスを必要とする場合は、updateコマンドに -Bypass AzureServices を追加します。 パラメータはバイパス設定の代わりになるので、あなたのワークロードでまだ必要な他のバイパスオプションも含めてください。
Update-AzFileShareを使って許可されたサブネット リソース ID を-AllowedSubnetに渡します。 ネットワークルールはファイル共有に直接適用されるため、ストレージアカウントの設定は不要です。 クライアントサブネットは、上記の前提条件で説明したように、依然としてサービスエンドポイントを必要とします。
# To learn more about the Az.FileShare module, see https://www.powershellgallery.com/packages/Az.FileShare/1.0.0
Install-Module -Name Az.FileShare -Repository PSGallery -RequiredVersion 1.0.0
$fileShareResourceGroupName = "<resource-group-name>"
$fileShareName = "<file-share-name>"
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$subnet = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName | `
Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq $subnetName }
Update-AzFileShare `
-ResourceGroupName $fileShareResourceGroupName `
-ResourceName $fileShareName `
-AllowedSubnet @($subnet.Id)
クラシック ファイル共有の場合は、サービス エンドポイントを使用して、ストレージ アカウントのパブリック エンドポイントへのアクセスを特定の仮想ネットワークに制限します。 まず、ストレージ アカウントと仮想ネットワークに関する情報を収集します。 次の手順のプレースホルダーの値を独自の値に置き換えます。
storageAccountResourceGroupName="<storage-account-resource-group>"
storageAccountName="<storage-account-name>"
restrictToVirtualNetworkResourceGroupName="<vnet-resource-group-name>"
restrictToVirtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
storageAccount=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" --output tsv)
virtualNetwork=$(az network vnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--name $restrictToVirtualNetworkName \
--query "id" --output tsv)
subnet=$(az network vnet subnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--vnet-name $restrictToVirtualNetworkName \
--name $subnetName \
--query "id" --output tsv)
仮想ネットワークからのトラフィックを許可するには、Azure ネットワーク ファブリックが仮想ネットワークのサブネットにMicrosoft.Storage サービス エンドポイントを公開する必要があります。 次の CLI コマンドでは、Microsoft.Storage サービス エンドポイントがまだ存在しない場合は、サブネットに追加します。
serviceEndpoints=$(az network vnet subnet show \
--resource-group $restrictToVirtualNetworkResourceGroupName \
--vnet-name $restrictToVirtualNetworkName \
--name $subnetName \
--query "serviceEndpoints[].service" \
--output tsv)
foundStorageServiceEndpoint=false
for serviceEndpoint in $serviceEndpoints
do
if [ $serviceEndpoint = "Microsoft.Storage" ]
then
foundStorageServiceEndpoint=true
fi
done
if [ $foundStorageServiceEndpoint = false ]
then
serviceEndpointList=""
for serviceEndpoint in $serviceEndpoints
do
serviceEndpointList+=$serviceEndpoint
serviceEndpointList+=" "
done
serviceEndpointList+="Microsoft.Storage"
az network vnet subnet update \
--ids $subnet \
--service-endpoints $serviceEndpointList \
--output none
fi
ストレージ アカウントへのトラフィックを制限する最後の手順は、ネットワーク規則を作成し、それをストレージ アカウントのネットワーク 規則セットに追加することです。
az storage account network-rule add \
--resource-group $storageAccountResourceGroupName \
--account-name $storageAccountName \
--subnet $subnet \
--output none
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--default-action "Deny" \
--output none
これらのコマンドは既存のバイパス設定を保持します。 統合が信頼されたサービスへのアクセスを必要とする場合は、update コマンドに --bypass AzureServices を追加してください。 このオプションはバイパス設定の代わりになるので、ワークロードでまだ必要な他のバイパスオプションも含めてください。
az fileshare updateを使って許可されたサブネット リソース ID を--allowed-subnetsに渡します。 ネットワークルールはファイル共有に直接適用されるため、ストレージアカウントの設定は不要です。 クライアントサブネットは、上記の前提条件で説明したように、依然としてサービスエンドポイントを必要とします。
# Install the fileshare extension
az extension add --name fileshare
fileShareResourceGroupName="<resource-group-name>"
fileShareName="<file-share-name>"
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
subnetId=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "id" --output tsv)
az fileshare update \
--name $fileShareName \
--resource-group $fileShareResourceGroupName \
--allowed-subnets $subnetId
特定のストレージアカウントへのアウトバウンドアクセスを制限してください
ファイル共有のネットワークルールは、受信アクセスを制御します。 それらは、クライアントがアクセスできる他のストレージ リソースを制限しません。 クラシックなファイル共有では、サブネット内のクライアントがサービスエンドポイント経由でアクセスできるストレージアカウントを制限するために、オプションでサービス エンドポイント ポリシーを使うことができます。 このポリシーは、Azure Firewallやネットワーク仮想アプライアンスを迂回するトラフィックの宛先をフィルタリングします。 他のアウトバウンドパスを制限したり、宛先のネットワークルールや認可要件を置き換えたりするわけではありません。 詳細については、「 サービスエンドポイントポリシーでアウトバウンドアクセスを制限する」をご覧ください。
Important
サービス エンドポイント ポリシーは現在、Microsoft.FileShares のファイル共有ではサポートされていません。 クライアント サブネットのポリシーは、サービス エンドポイントを通じてこれらのファイル共有へのアクセスをブロックします。それらのサブスクリプションまたはリソース グループを許可していてもです。 この制限は、classic と Microsoft.FileShares の両方のファイル共有にアクセスするサブネットにも適用されます。 そのサブネット内のクライアントは、Microsoft.FileShares のファイル共有にアクセスするために プライベート エンドポイント を使わなければなりません。
サービスエンドポイントポリシーは、関連するサブネット内のクライアントに許可されるストレージ宛先を定義します。 それらのクライアントがサービス エンドポイントを通じて他のストレージ アカウントにアクセスできないようにします。 次の点に留意してください。
- サブネット内のクライアントが使用するすべてのストレージアカウントを追加してから、ポリシーをサブネットに関連付けてください。 このリストには、サブネット内の他のワークロードが使用するストレージアカウントが含まれます。
- サービスエンドポイントポリシーは仮想ネットワークと同じリージョンおよびサブスクリプション内でなければなりません。
- ポリシーは
Microsoft.Storage サービスに対して含めることができるポリシー定義は 1 つのみです。 より多くのストレージ アカウントを許可するには、それらのリソース ID を同じポリシー定義に追加してください。 リソースグループやサブスクリプション内のすべてのストレージアカウントを許可することもできます。
- サブネットにポリシーを関連付けた後、そのポリシーはすべての地域のストレージアカウントへのトラフィックに適用されます。
- これらのステップは、サブネットにサービスエンドポイントポリシーがないことを前提としています。 すでに関連付けられているポリシーは、関連付けを置き換えるのではなく、それらのポリシーを見直して更新してください。 PowerShellやCLIの例は、既存の関連付けが見つかると停止します。
サービスエンドポイントポリシーを作成しサブネットに関連付けるには、以下の手順に従ってください。 詳細な手順については、「 サービスエンドポイントポリシーの作成および関連付け」を参照してください。
- Azureポータルの上部にある検索ボックスに「Service endpoint policy」と入力します。 検索結果で [サービス エンドポイント ポリシー] を選びます。
-
[+ 作成] を選択します。
-
[基本] タブで、サブスクリプションと仮想ネットワークの地域を選択します。 リソースグループを選択し、ポリシーの名前を入力します。
-
[次へ: ポリシー定義] を選びます。
-
+ リソースを追加を選択します。
サービス については、Microsoft.Storage を選択してください。
[範囲] では [単一のアカウント] を選択し、ファイル共有を含むストレージ アカウントを選択します。 [] を選択し、[] を追加します。 このステップをサブネット内のクライアントが使用する各ストレージアカウントごとに繰り返します。
- [ 確認と作成] を選択し、[ 作成] を選択します。
- 新しいサービス エンドポイント ポリシーに移動してください。 サービスメニューの 設定から 「関連サブネット」を選択してください。
-
+ サブネットの関連付けを編集を選択し、仮想ネットワークとサブネットを選択してから、適用を選択します。
以下のPowerShellコマンドはサービスエンドポイントポリシーを作成し、サブネットに関連付けます。 このポリシーは、サービス エンドポイントを介したそのサブネットからのクライアント アクセスを、1 つのストレージ アカウントに制限します。 サブネットにはすでに Microsoft.Storage サービスエンドポイントが存在している必要があります。 プレースホルダーの値をあなた自身の値に置き換えてください。
$storageAccountResourceGroupName = "<storage-account-resource-group>"
$storageAccountName = "<storage-account-name>"
$virtualNetworkResourceGroupName = "<vnet-resource-group-name>"
$virtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$policyName = "<service-endpoint-policy-name>"
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName $storageAccountResourceGroupName `
-Name $storageAccountName `
-ErrorAction Stop
$virtualNetwork = Get-AzVirtualNetwork `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $virtualNetworkName `
-ErrorAction Stop
$subnet = $virtualNetwork.Subnets | Where-Object { $_.Name -eq $subnetName }
if ($null -eq $subnet) {
throw "Subnet '$subnetName' wasn't found in virtual network '$virtualNetworkName'."
}
if ($subnet.ServiceEndpointPolicies.Count -gt 0) {
throw "The subnet already has service endpoint policies. Review and update them before changing the configuration."
}
# To allow clients to access more storage accounts, add their resource IDs to -ServiceResource.
$policyDefinition = New-AzServiceEndpointPolicyDefinition `
-Name "allowed-storage-accounts" `
-Service "Microsoft.Storage" `
-ServiceResource @($storageAccount.Id) `
-ErrorAction Stop
$policy = New-AzServiceEndpointPolicy `
-ResourceGroupName $virtualNetworkResourceGroupName `
-Name $policyName `
-Location $virtualNetwork.Location `
-ServiceEndpointPolicyDefinition $policyDefinition `
-ErrorAction Stop
$subnet.ServiceEndpointPolicies = @($policy)
$virtualNetwork | Set-AzVirtualNetwork -ErrorAction Stop | Out-Null
以下のCLIコマンドはサービスエンドポイントポリシーを作成し、サブネットに関連付けます。 このポリシーは、サービス エンドポイントを通じて、そのサブネットからのクライアントのアクセスを 1 つのストレージ アカウントに制限します。 サブネットにはすでに Microsoft.Storage サービスエンドポイントが存在している必要があります。 プレースホルダーの値をあなた自身の値に置き換えてください。
storageAccountResourceGroupName="<storage-account-resource-group>"
storageAccountName="<storage-account-name>"
virtualNetworkResourceGroupName="<vnet-resource-group-name>"
virtualNetworkName="<vnet-name>"
subnetName="<subnet-name>"
policyName="<service-endpoint-policy-name>"
existingPolicyIds=$(az network vnet subnet show \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--query "serviceEndpointPolicies[].id" --output tsv) || exit 1
if [ -n "$existingPolicyIds" ]; then
echo "The subnet already has service endpoint policies. Review and update them before changing the configuration." >&2
exit 1
fi
storageAccountId=$(az storage account show \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--query "id" --output tsv) || exit 1
location=$(az network vnet show \
--resource-group $virtualNetworkResourceGroupName \
--name $virtualNetworkName \
--query "location" --output tsv) || exit 1
az network service-endpoint policy create \
--resource-group $virtualNetworkResourceGroupName \
--name $policyName \
--location $location \
--output none || exit 1
# To allow clients to access more storage accounts, add their resource IDs to --service-resources.
az network service-endpoint policy-definition create \
--resource-group $virtualNetworkResourceGroupName \
--policy-name $policyName \
--name "allowed-storage-accounts" \
--service "Microsoft.Storage" \
--service-resources $storageAccountId \
--output none || exit 1
az network vnet subnet update \
--resource-group $virtualNetworkResourceGroupName \
--vnet-name $virtualNetworkName \
--name $subnetName \
--service-endpoint-policy $policyName \
--output none || exit 1
サービス エンドポイント ポリシーを持つサブネットから Microsoft.FileShares ファイル共有にアクセスするには、ファイル共有用のプライベート エンドポイントを作成します。 サービスエンドポイントのポリシーは、プライベートエンドポイントを経由するトラフィックには適用されません。
関連項目