✔️ 適用対象: Microsoft.Storage リソース プロバイダーで作成されたクラシック ファイル共有
✔️ 適用対象: Microsoft.FileShares リソース プロバイダーで作成されたファイル共有
Azure Files では、Azure ファイル共有にアクセスするための次の主な 2 種類のエンドポイントが提供されます。
- パブリック IP アドレスを持ち、世界中のどこからでもアクセスできるパブリック エンドポイント。
- プライベート エンドポイント。仮想ネットワーク内に存在し、その仮想ネットワークのアドレス空間内からのプライベート IP アドレスを持ちます。
クラシック ファイル共有 (Microsoft.Storage リソース プロバイダーで作成) の場合、Azure ストレージ アカウントにはパブリック エンドポイントとプライベート エンドポイントがあります。
Microsoft.FileShares リソース プロバイダーで作成されたファイル共有の場合は、ストレージ アカウント レベルではなく、ファイル共有レベルでパブリック エンドポイントとプライベート エンドポイントを作成します。
この記事では、Azure ファイル共有に直接アクセスするためのプライベート エンドポイントを構成する方法について説明します。 この記事の内容の多くは、Azure File Sync がストレージ アカウントのパブリック エンドポイントとプライベート エンドポイントと相互運用する方法にも適用されます。 Azure File Syncのネットワークに関する考慮事項の詳細については、「Azure File Syncプロキシおよびファイアウォール設定の設定」をご覧ください。
このガイドを読む前に、Azure Files のネットワークに関する考慮事項を確認してください。
前提条件
エンドポイントの設定でストレージアカウントやファイル共有へのネットワークアクセスを制限できます。 仮想ネットワークへのアクセスを制限するには、以下のいずれかの方法を用いてください。
プライベート エンドポイントの作成
ファイル共有のプライベート エンドポイントを作成するときは、次のAzureリソースをデプロイします。
-
プライベート エンドポイント: プライベート エンドポイントを表すAzure リソース。 このリソースは、ターゲット リソースとネットワーク インターフェイスの間のコネクタと考えることができます。
-
ネットワーク インターフェイス (NIC): 指定された仮想ネットワークとサブネット内にプライベート IP アドレスを保持するネットワーク インターフェイス。 このリソースは、仮想マシン (VM) をデプロイするときにデプロイするリソースと同じです。 ただし、VM に割り当てる代わりに、プライベート エンドポイントが VM を所有します。
-
プライベート ドメイン ネーム システム (DNS) ゾーン: この仮想ネットワークのプライベート エンドポイントを以前にデプロイしていない場合は、仮想ネットワーク用に新しいプライベート DNS ゾーンがデプロイされます。 DNS レコードもこの DNS ゾーンに作成されます。 この仮想ネットワークにプライベート エンドポイントを既にデプロイしている場合は、新しいレコードが既存の DNS ゾーンに追加されます。 DNS ゾーンのデプロイは省略可能です。 ただし、AD サービス プリンシパルを使用して Azure ファイル共有をマウントする場合、または FileREST API を使用する場合は、これをお勧めし、そうする必要があります。
注
この記事では、core.windows.net、Azureパブリック リージョンの DNS サフィックスを使用します。 この解説は、Azure 米国政府機関 クラウドや 21Vianet クラウドによって運用されるAzureなどのAzureソブリン クラウドにも適用されます。 環境に適したサフィックスに置き換えます。
クラシックと新しいファイル共有のエクスペリエンス
プライベートエンドポイントの作成プロセスは、クラシックなファイル共有モデルを使うか新しいファイル共有モデルを使うかによって若干異なります。 従来のファイル共有の場合、ファイル共有を含むストレージアカウント用のプライベートエンドポイントを作成します。 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 リソース プロバイダーで作成されたファイル共有を使用している場合:
リソース ページで、リソースの種類 のドロップダウン メニューから 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
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有については、そのファイル共有への参照を取得します。
$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 に解決されます。 プライベートエンドポイントの作成は任意ですが、Active Directory(AD)ユーザープリンシパルを使って直接Azureファイル共有をマウントしたり、REST API経由でアクセスしたりするには明確に必須です。
# 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
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有については、そのファイル共有への参照を取得します。
# 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 に解決されます。 プライベートエンドポイントの作成という観点からはオプションですが、ADユーザープリンシパルを使ってAzureファイルシェアをマウントしたり、FileREST API経由でアクセスしたりするには必須です。
# 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
接続を検証する
仮想ネットワーク内に VM がある場合、または「Azure Filesの DNS 転送の構成」の説明に従って DNS 転送を構成した場合は、プライベート エンドポイントが正しく設定されていることをテストできます。 PowerShell、コマンド ライン、またはターミナルから次のコマンドを実行します (Windows、Linux、または macOS で動作します)。
クラシック ファイル共有の場合は、 <storage-account-name> を適切なストレージ アカウント名に置き換えます。
nslookup <storage-account-name>.file.core.windows.net
Microsoft.FileShares リソース プロバイダーで作成されたファイル共有の場合は、ファイル共有のホスト名を使用します。 ファイル共有の [概要] タブで、右上の 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: storageaccount.privatelink.file.core.windows.net
Address: 192.168.0.5
Aliases: storageaccount.file.core.windows.net
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
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
仮想ネットワーク内に VM がある場合、または「Azure Filesの DNS 転送の構成」の説明に従って DNS 転送を構成した場合は、次のコマンドを実行して、プライベート エンドポイントが正しく設定されていることをテストできます。
クラシック ファイル共有の場合:
$storageAccountHostName = [System.Uri]::new($storageAccount.PrimaryEndpoints.file) | `
Select-Object -ExpandProperty Host
Resolve-DnsName -Name $storageAccountHostName
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
Resolve-DnsName -Name $fileShare.HostName
成功した場合は、次のような出力が表示されます。 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
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
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
仮想ネットワーク内に VM がある場合、または「Azure Filesの DNS 転送の構成」の説明に従って 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
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
hostName=$(az fileshare show \
--resource-group $fileShareResourceGroupName \
--name $fileShareName \
--query "properties.hostName" --output tsv)
nslookup $hostName
成功した場合は、次のような出力が表示されます。 192.168.0.5 は仮想ネットワーク内のプライベート エンドポイントのプライベート IP アドレスです。
storageaccount.file.core.windows.net パスではなく、元のホスト名 (クラシックの場合は hostName、新しいエクスペリエンスではファイル共有のprivatelink) を使用してファイル共有をマウントする必要があります。
クラシック ファイル共有の場合:
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
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
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
パブリック エンドポイント アクセスを制限する
パブリック エンドポイントのアクセスを制限するには、まずパブリック エンドポイントへの一般的なアクセスを無効にします。 パブリック エンドポイントへのアクセスを無効にしても、プライベート エンドポイントには影響しません。 パブリック エンドポイントを無効にした後、引き続きアクセスできる特定のネットワークまたは IP アドレスを選択します。 一般に、ストレージ アカウントのほとんどのファイアウォール ポリシーではネットワーク アクセスが 1 つ以上の仮想ネットワークに制限されます。
また、 ネットワークセキュリティの境界 を使って、受信および送信のアクセスルールを一元管理することもできます。
パブリック エンドポイントへのアクセスを無効にする
パブリックネットワークアクセスを無効にすると、受信アクセスを制限し、アウトバウンドアクセスを許可します。 ストレージアカウントにはプライベートエンドポイントを通じてアクセス可能です。 そうでなければ、ストレージアカウントのパブリックエンドポイントへのリクエストは、 特に許可されたソースからのものでない限り却下されます。
クラシックファイル共有のパブリックネットワークアクセスを無効にするには、以下の手順に従ってください:
- パブリックエンドポイントへのすべてのインバウンドアクセスを制限したいストレージアカウントに行ってください。
- サービスメニューの セキュリティ+ネットワークの「 ネットワーク」を選択してください。
- [ パブリック ネットワーク アクセス] で、[管理] を選択 します。
-
無効を選択し、次に進行を選択します。
-
保存を選びます。
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
パブリック アクセスを無効にするファイル共有に移動します。 サービス メニューの [設定] で [構成] を選びます。
[パブリック ネットワーク アクセス] を [無効] に設定し、[保存] を選択します。
クラシック ファイル共有の場合、次の PowerShell コマンドはストレージ アカウントのパブリック エンドポイントへのすべてのトラフィックを拒否します。
-Bypass パラメーターを AzureServices に設定して、Azure File Syncなどの信頼されたファースト パーティ サービスがパブリック エンドポイント経由でストレージ アカウントにアクセスできるようにします。
# This assumes $storageAccount is still defined from the beginning of this guide.
$storageAccount | Update-AzStorageAccountNetworkRuleSet `
-DefaultAction Deny `
-Bypass AzureServices `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
Microsoft.FileShares リソース プロバイダーで作成されたファイル共有の場合は、そのファイル共有で -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
クラシック ファイル共有の場合、次の CLI コマンドは、ストレージ アカウントのパブリック エンドポイントへのすべてのトラフィックをブロックします。
--bypass パラメーターを AzureServices に設定して、Azure File Syncなどの信頼されたファースト パーティ サービスがパブリック エンドポイント経由でストレージ アカウントにアクセスできるようにします。
# This assumes $storageAccountResourceGroupName and $storageAccountName
# are still defined from the beginning of this guide.
az storage account update \
--resource-group $storageAccountResourceGroupName \
--name $storageAccountName \
--bypass "AzureServices" \
--default-action "Deny" \
--output none
Microsoft.FileShares リソース プロバイダーで作成されたファイル共有の場合は、そのファイル共有で --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
パブリックエンドポイントへのアクセスを特定のネットワークに制限する
パブリックエンドポイントへのアクセスを特定のネットワークに制限すると、指定された仮想ネットワークやIPアドレス内からパブリックエンドポイントへのリクエストを許可します。 この制限は サービスエンドポイントと呼ばれる機能によって機能します。 プライベートエンドポイントの有無にかかわらず、サービスエンドポイントを利用できます。
クラシックなファイル共有の場合は、パブリックエンドポイントを特定のネットワークに制限する手順に従ってください。
- パブリックエンドポイントを特定のネットワークに制限したいストレージアカウントに行ってください。
- サービスメニューの セキュリティ+ネットワークの「 ネットワーク」を選択してください。
- [ パブリック ネットワーク アクセス スコープ] で、[ 選択したネットワークから有効にする] を選択します。 この選択により、パブリック エンドポイントの制限を制御するためのさまざまな設定が表示されます。
-
仮想ネットワークの「仮想ネットワークを追加」を選択し>既存の仮想ネットワークを追加して、パブリックエンドポイントを通じてストレージアカウントへのアクセスを許可すべき仮想ネットワークを選択します。 仮想ネットワークとその仮想ネットワークのサブネットを選び、[有効化] を選びます。 この目的で新しい仮想ネットワークを作成したい場合は、「仮想ネットワークを追加」>「新しい仮想ネットワークを追加」を選び、詳細を入力してから「作成」を選択してください。
-
IPv4アドレスの項目で、ストレージアカウントにアクセスしたいパブリックインターネットIPアドレスを指定します。
- Azure File Sync などの信頼された Microsoft のファーストパーティ サービスがストレージ アカウントにアクセスできるようにするには、Allow trusted Microsoft サービス to access this resource チェック ボックスをオンにします。
-
保存を選びます。
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合:
パブリック アクセスを制限するファイル共有に移動します。 サービス メニューの [設定] で [ 構成] を選択します。 [ パブリック ネットワーク アクセス] で、 選択した仮想ネットワークから [有効] を選択し、共有へのアクセスが許可されている仮想ネットワークとサブネットを追加して、[ 保存] を選択します。
クラシック ファイル共有の場合は、サービス エンドポイントを使用して、ストレージ アカウントのパブリック エンドポイントへのアクセスを特定の仮想ネットワークに制限します。 まず、ストレージ アカウントと仮想ネットワークに関する情報を収集します。 次の手順のプレースホルダーの値を独自の値に置き換えます。
$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 `
-Bypass AzureServices `
-VirtualNetworkRule $networkRule `
-WarningAction SilentlyContinue `
-ErrorAction Stop | `
Out-Null
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合は、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 \
--bypass "AzureServices" \
--default-action "Deny" \
--output none
Microsoft.FileShares リソース プロバイダーを使用して作成されたファイル共有の場合は、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
関連項目