Azure portal を使用して DNS セキュリティ ポリシーを作成するには:
Azure portal の [ホーム] ページで DNSセキュリティ ポリシーを検索して選択します。 また、Azure Marketplace から [DNS セキュリティ ポリシー] を選択することもできます。
[+ 作成] を選択して新しいポリシーの作成を開始します。
[基本] タブで、[サブスクリプション] と [リソース グループ] を選択するか、新しいリソース グループを作成します。
[インスタンス名] の横に DNS セキュリティ ポリシーの名前を入力し、セキュリティ ポリシーを適用する [リージョン] を選択します。
Note
DNS セキュリティ ポリシーは、セキュリティ ポリシーと同じリージョン内の VNet にのみ適用できます。
[次へ: 仮想ネットワーク リンク] を選択し、次に [+ 追加] を選択します。
セキュリティ ポリシーと同じリージョンの VNet が表示されます。 1 つ以上の利用可能な VNet を選び、[追加] を選びます。 既に別のセキュリティ ポリシーに関連付けられている VNet を選択することはできません。 次の例では、2 つの VNet がセキュリティ ポリシーに関連付けられており、選択可能な VNet は 2 つです。
選択された VNet が表示されます。 必要に応じて、仮想ネットワーク リンクを作成する前に、リストから VNet を削除できます。
Note
仮想ネットワーク リンクは、選択されているかどうかにかかわらず、リストに表示されている全ての VNet に対して作成されます。 チェックボックスを使用して、リストから削除する VNet を選択します。
[確認および作成] を選択し、次に [作成] を選択します。
[次へ: DNS トラフィック ルール] の選択はここではスキップしますが、今すぐトラフィック ルールを作成することもできます。 このガイドでは、トラフィック ルールと DNS ドメイン リストを作成し、後で DNS セキュリティ ポリシーに適用します。
ログ分析ワークスペースを作成する
既に使用する Log Analytics ワークスペースがある場合は、このセクションをスキップします。
Azure portal を使用して Log Analytics ワークスペースを作成するには:
Azure portal の [ホーム] ページで、Log Analytics ワークスペースを検索して選択します。 Azure Marketplace から [Log Analytics ワークスペース] を選択することもできます。
[+ 作成] を選択して新しいワークスペースの作成を開始します。
[基本] タブで、[サブスクリプション] と [リソース グループ] を選択するか、新しいリソース グループを作成します。
[名前] の横にワークスペースの名前を入力し、ワークスペースの [リージョン] を選択します。
[確認および作成] を選択し、次に [作成] を選択します。
Log Analytics ワークスペースができたので、このワークスペースを使用するようにセキュリティ ポリシーの診断設定を構成します。
診断設定を構成するには:
作成した DNS セキュリティ ポリシー (この例では myeast-secpol) を選択します。
[監視] で [診断設定] を選択します。
[診断設定の追加] を選択します。
[診断設定の名前] の横に、ここで収集するログの名前を入力します。
[ログ] と [メトリック] で "すべて" のログとメトリックを選択します。
[診断の詳細] で [Log Analytics ワークスペースに送信する] を選択し、作成したサブスクリプションと ワークスペースを選択します。
[保存] を選択します。 次の例を参照してください。
DNS ドメイン リストを作成する
Azure portal を使って DNS ドメイン リストを作成するには:
Azure portal の [ホーム] ページで DNS ドメイン リストを検索して選択します。
[+ 作成] を選択して新しいドメイン リストの作成を開始します。
[基本] タブで、[サブスクリプション] と [リソース グループ] を選択するか、新しいリソース グループを作成します。
[ドメイン リスト名] の横にドメイン リスト名を入力し、リストの [リージョン] を選択します。
Note
セキュリティ ポリシーには、同じリージョン内のドメイン リストが必要です。
[次へ: DNS ドメイン] を選択します。
[DNS ドメイン] タブで、ドメイン名を 1 つずつ手動で入力するか、コンマ区切り値 (CSV) ファイルからインポートします。
ドメイン名の入力が完了したら、[確認と作成] を選択し、[作成] を選択します。
必要に応じて、詳細なドメイン リストを作成するためにこのセクションを繰り返します。 各ドメイン リストは、次の 3 つのアクションのいずれかを持つトラフィック ルールに関連付けることができます。
-
許可: DNS クエリを許可し、ログに記録します。
-
ブロック: DNS クエリをブロックし、ブロック アクションをログに記録します。
-
アラート: DNS クエリを許可し、アラートをログに記録します。
1 つの DNS トラフィック ルールから複数のドメイン リストを動的に追加または削除できます。
DNS ドメイン リストができたので、このワークスペースを使用するようにセキュリティ ポリシーの診断設定を構成します。
Note
CNAME チェーンが調べられ ("追跡され")、ドメインに関連付けられているトラフィック ルールを適用する必要があるかどうかを判断します。 たとえば、malicious.contoso.com に適用されるルールは、adatum.com が malicious.contoso.com にマップされる場合、または malicious.contoso.com が adatum.com の CNAME チェーンのどこかに表示される場合は、adatum.com にも適用されます。
診断設定を構成するには:
作成した DNS セキュリティ ポリシー (この例では myeast-secpol) を選択します。
[設定] で、[DNS トラフィック ルール] を選択します。
[+ 追加] を選択します。
[DNS トラフィック ルールの追加] ペインが開きます。
[優先度] の横に、100 - 65000 の範囲の値を入力します。 ルールの数値が小さいほど優先度が高くなります。
[ルール名] の横にルールの名前を入力します。
[DNS ドメイン リスト] の横で、このルールで使用するドメイン リストを選択します。
[トラフィック アクション] の次に、選択したドメインに適用するアクションの種類に基づいて、[許可]、[ブロック]、または [アラート] を選択します。 この例では [許可] が選択されています。
既定の [ルールの状態] を [有効] のままにして、[保存] を選択します。
ビューを更新して、ルールが正常に追加されたことを確認します。 トラフィック アクション、DNS ドメイン リスト、ルールの優先度、ルールの状態を編集できます。
DNS ログを表示してテストする
- DNS セキュリティ ポリシーに移動し、[監視] で [診断設定] を選択します。
- 以前にセキュリティ ポリシーに関連付けた Log Analytics ワークスペース (この例では secpol-loganalytics) を選択します。
- 左側の [ログ] を選びます。
- 同じリージョン内の IP アドレス 10.40.40.4 の仮想マシンからの DNS クエリを表示するには、次のようにクエリを実行します。
DNSQueryLogs
| where SourceIpAddress contains "10.40.40.4"
| limit 1000
次の例を参照してください。
contoso.com を含むトラフィック ルールが [許可] クエリに設定されていたことを思い出してください。 仮想マシンからのクエリは正常に応答します。
C:\>dig db.sec.contoso.com +short
10.0.1.2
ログ分析でクエリの詳細を展開すると、次のようなデータが表示されます。
- OperationName: RESPONSE_SUCCESS
- リージョン: EastUS
- QueryName: db.sec.contoso.com
- QueryType: A
- SourceIpAddress: 10.40.40.4
- ResolutionPath: PrivateDnsResolution
- ResolverPolicyRuleAction: Allow
トラフィック ルールを編集して [ブロック] の contoso.com クエリに設定すると、仮想マシンからのクエリの王乙が失敗します。 ルールのコンポーネントを変更する場合は、必ず [保存] を選択してください。
この変更により、次のようにクエリが失敗します。
C:\>dig db.sec.contoso.com
; <<>> DiG 9.9.2-P1 <<>> db.sec.contoso.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 24053
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
失敗したクエリは次のログ分析に記録されます。
Note
クエリの結果がログ分析に表示されるまで、数分かかる場合があります。
ローカル PowerShell リポジトリを設定し、Az.DnsResolver PowerShell モジュールをインストールします。 これは、Cloud Shell を使用していない場合にのみ必要です。
ディスク上に新しいフォルダーを作成し、ローカル PowerShell リポジトリとして使用します。 この例では、C:\bin\PSRepo
が使用されます。
Az.DnsResolver.0.2.6.nupkg をこのディレクトリにダウンロードします。
次のコマンドを実行して、ローカル リポジトリを設定します。
# Register the repository
Register-PSRepository -Name LocalPSRepo -SourceLocation 'C:\bin\PSRepo' -ScriptSourceLocation 'C:\bin\PSRepo' -InstallationPolicy Trusted
# Install the Az.DnsResolver module
Install-Module -Name Az.DnsResolver -RequiredVersion 0.2.6 -SkipPublisherCheck
# If you already installed Az.DnsResolver, update your version to 0.2.6
Update-Module -Name Az.DnsResolver
# Confirm that the Az.DnsResolver module was installed properly
Get-InstalledModule -Name Az.DnsResolver
サブスクリプションのコンテキストを設定する
# Connect PowerShell to Azure cloud
Connect-AzAccount -Environment AzureCloud
# Set your default subscription
Select-AzSubscription -SubscriptionObject (Get-AzSubscription -SubscriptionId <your-sub-id>)
PowerShell を使用して DNS セキュリティ ポリシーを作成します。
$ErrorActionPreference = "Stop"
################################################################
# Configure resource names and locations
################################################################
$resourceNumber = 1 # Customize this if needed
$region = "centralus" # Change this region to your preference
if ($env:username) {$name = "$($env:username)"} else {$name = "$($env:USER)"} # The environment variable is different in Cloud Shell vs local PowerShell
$nameSuffix = "test-$($region)-$($name)-resolverpolicytest$($resourceNumber)-test"
$resourceGroupName = "rg-$($nameSuffix)"
$virtualNetworkName = "vnet-$($nameSuffix)"
$resolverPolicyName = "dnsresolverpolicy-$($nameSuffix)"
$domainListName = "domainlist-$($nameSuffix)"
$securityRuleName = "securityrule-$($nameSuffix)"
$resolverPolicyLinkName = "dnsresolverpolicylink"
$storageAccountName = "stor$($name.ToLower())" # Customize this, taking care that the name is not too long
$storageAccountName = $storageAccountName.Substring(0, [Math]::Min(24, $storageAccountName.Length)) # Storage account names must be 3-24 characters long
$diagnosticSettingName = "diagnosticsetting-$($nameSuffix)"
$vnetId = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Network/virtualNetworks/$virtualNetworkName"
################################################################
# Create resource group, virtual network, and storage account
################################################################
Write-Host "Creating resource group"
$rg = New-AzResourceGroup -Name $resourceGroupName -Location $region
Write-Host ($rg | ConvertTo-Json -Depth 64)
Write-Host "Creating virtual network"
$defaultSubnet = New-AzVirtualNetworkSubnetConfig -Name "default" -AddressPrefix "10.$resourceNumber.0.0/24"
$vnet = New-AzVirtualNetwork -Name $virtualNetworkName -ResourceGroupName $resourceGroupName -Location $region -AddressPrefix "10.$resourceNumber.0.0/16" -Subnet $defaultSubnet
Write-Host ($vnet | ConvertTo-Json -Depth 64)
Write-Host "Creating storage account"
$storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName -Location $region -SkuName Standard_GRS
Write-Host $storageAccount.ToString()
################################
# Create DNS security policy
################################
Write-Host "Creating DNS resolver policy"
$resolverPolicy = New-AzDnsResolverPolicy -Location $region -ResourceGroupName $resourceGroupName -Name $resolverPolicyName
Write-Host $resolverPolicy.ToJsonString()
Write-Host "Creating DNS resolver policy virtual network link"
$link = New-AzDnsResolverPolicyVirtualNetworkLink -Location $region -ResourceGroupName $resourceGroupName -DnsResolverPolicyName $resolverPolicyName -Name $resolverPolicyLinkName -VirtualNetworkId $vnetId
Write-Host $link.ToJsonString()
$log = New-AzDiagnosticSettingLogSettingsObject -Enabled $true -Category DnsResponse
Write-Host "Creating diagnostic setting"
$diagnosticSetting = New-AzDiagnosticSetting -Name $diagnosticSettingName -ResourceId $resolverPolicy.id -Log $log -StorageAccountId $storageAccount.id
Write-Host $diagnosticSetting.ToJsonString()
Write-Host "Creating domain list"
$domainList = New-AzDnsResolverDomainList -Location $region -ResourceGroupName $resourceGroupName -Name $domainListName -Domain @("contoso.com.", "adatum.com.")
Write-Host $domainList.ToJsonString()
Write-Host "Creating DNS security policy rule"
$rule = New-AzDnsResolverPolicyDnsSecurityRule -ResourceGroupName $resourceGroupName -Name $securityRuleName -DnsResolverDomainList @{id = $domainList.Id;} -DnsSecurityRuleState "Enabled" -ActionType "Block" -ActionBlockResponseCode "SERVFAIL" -Priority 100 -DnsResolverPolicyName $resolverPolicyName -Location $region
Write-Host $rule.ToJsonString()
オプション: 新しい値を使用して DNS リゾルバー ポリシーを更新します。
################################
# Update DNS security policy
################################
Write-Host "Updating DNS resolver policy"
$resolverPolicy = Update-AzDnsResolverPolicy -ResourceGroupName $resourceGroupName -Name $resolverPolicyName -Tag @{"key0" = "value0"}
Write-Host $resolverPolicy.ToJsonString()
Write-Host "Updating DNS resolver policy virtual network link"
$link = Update-AzDnsResolverPolicyVirtualNetworkLink -ResourceGroupName $resourceGroupName -DnsResolverPolicyName $resolverPolicyName -Name $resolverPolicyLinkName -Tag @{"key1" = "value1"}
Write-Host $link.ToJsonString()
$log = New-AzDiagnosticSettingLogSettingsObject -Enabled $false -Category DnsResponse
Write-Host "Updating diagnostic setting by disabling log category"
$diagnosticSetting = New-AzDiagnosticSetting -Name $diagnosticSettingName -ResourceId $resolverPolicy.id -Log $log -StorageAccountId $storageAccount.id
Write-Host $diagnosticSetting.ToJsonString()
Write-Host "Updating domain list"
$domainList = Update-AzDnsResolverDomainList -ResourceGroupName $resourceGroupName -Name $domainListName -Tag @{"key2" = "value2"}
Write-Host $domainList.ToJsonString()
Write-Host "Updating DNS security policy rule"
$rule = Update-AzDnsResolverPolicyDnsSecurityRule -ResourceGroupName $resourceGroupName -Name $securityRuleName -DnsResolverDomainList @{id = $domainList.Id;} -DnsResolverPolicyName $resolverPolicyName
Write-Host $rule.ToJsonString()
DNS セキュリティ ポリシーの構成を確認します。
################################
# Get DNS security policy
################################
Write-Host "Getting DNS resolver policy"
$resolverPolicy = Get-AzDnsResolverPolicy -ResourceGroupName $resourceGroupName -Name $resolverPolicyName
Write-Host $resolverPolicy.ToJsonString()
Write-Host "Getting DNS resolver policy virtual network link"
$link = Get-AzDnsResolverPolicyVirtualNetworkLink -ResourceGroupName $resourceGroupName -DnsResolverPolicyName $resolverPolicyName -Name $resolverPolicyLinkName
Write-Host $link.ToJsonString()
Write-Host "Getting diagnostic setting"
$diagnosticSetting = Get-AzDiagnosticSetting -ResourceId $resolverPolicy.id
Write-Host $diagnosticSetting.ToJsonString()
Write-Host "Getting domain list"
$domainList = Get-AzDnsResolverDomainList -ResourceGroupName $resourceGroupName -Name $domainListName
Write-Host $rule.ToJsonString()
Write-Host "Getting DNS security policy rule"
$rule = Get-AzDnsResolverPolicyDnsSecurityRule -ResourceGroupName $resourceGroupName -Name $securityRuleName -DnsResolverPolicyName $resolverPolicyName
Write-Host $rule.ToJsonString()
DNS セキュリティ ポリシーをテストする
新しいセキュリティ ポリシーをテストするには、仮想ネットワーク内のホスト デバイスに接続し、ブロックしたドメインのクエリを発行します。 この例では、ドメイン リストは contoso.com と adatum.com です。
入力:
Resolve-DnsName -Name contoso.com -Type NS
出力:
Resolve-DnsName : contoso.com : DNS server failure
At line:1 char:1
+ Resolve-DnsName -Name contoso.com -Type NS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (contoso.com:String) [Resolve-DnsName], Win32Exception
+ FullyQualifiedErrorId : RCODE_SERVER_FAILURE,Microsoft.DnsClient.Commands.ResolveDnsName