Azure Resource Manager (ARM) とPowerShell を用いて、 NSG ルールを作成する方法

yoko kawase

こんにちは。Azure サポートの川瀬です。

今回は Azure のパブリック IP アドレスに対して通信を許可する NSG ルールを作成する方法をご紹介します。

パブリック クラウドをご利用になる場合、セキュリティ要件との兼ね合いから仮想マシンのインターネット接続 を制限される方が少なからずいらっしゃるかと思います。 その場合にも VNET 内のインスタンスから同一リージョン内の (VNET 外にある) Azure ストレージや SQL データベース、その他いくつかの Azure サービスにアクセスできるように設定しておく必要があります。

image_thumb_4E371D20

この記事では NSG (Network Security Group) を利用して、同一リージョン内の Azure サービスへのアウトバウンド向けネットワークアクセスを制御する方法をご紹介します。

また、GitHub から本稿で参照文に引用されるコード集をダウンロードすることができます。

Network Security Groups を使ってみよう

Azure セキュリティ機能である Network Security Groups (NSG) を使用することで、Azure VNET でサブネットへの特定のインバウンドとアウトバウンドのネットワーク・アクセスを明示的に制限したり、許可することが可能です。

アウトバウンド通信を VNET が存在するリージョンの Azure のパブリック IP アドレス範囲のみに制限することで、Azure 内のネットワーク トラフィックはインターネット網を介することなく、Azure のバックボーン ネットワークのみを経由するため、セキュリティ レベルの高い環境を構築することが可能となります。

でも・・・ルールが多すぎる!

ですが、いざ実際に NSG の設定を行うとなると、セキュリティ要件によっては非常に多くのルール設定が必要になる場合もあるかと思います。でも、ご安心ください。NSG は全 Azure リージョンの whitelist 化とそれ以外のカスタムルールの追加にも対応できるように 400 ものルール設定が可能です。

また、後述の Azure PowerShell のコードと、定期的に更新される以下の Azure データセンターのパブリック IP アドレスの範囲 (XML 形式) を利用すれば、NSG の設定を自動化することもできます。

このIP アドレスの範囲の一覧は、アメリカ時間の毎週水曜日に最新版にアップデートされ、その次のアメリカ時間の月曜日に有効になります。

NSG を設定する前に

Azure PowerShell をインストールしたら、まずはログインして、適切なサブスクリプションとリソースグループを選択します。

# Sign-in with Azure account credentials

Login-AzureRmAccount

# Select Azure Subscription

$subscriptionId = 

(Get-AzureRmSubscription |

Out-GridView `

-Title "Select an Azure Subscription …" `

-PassThru).SubscriptionId

Select-AzureRmSubscription `

-SubscriptionId $subscriptionId

# Select Azure Resource Group

$rgName =

(Get-AzureRmResourceGroup |

Out-GridView `

-Title "Select an Azure Resource Group …" `

-PassThru).ResourceGroupName

 

Azure データセンターのパブリック IP アドレスをダウンロード

次に Azure データセンターのパブリック IP アドレスのリストをダウンロードします。

このXMLから、Azureのリージョンに対応するパブリックIPアドレス範囲のリストを抽出することができます。

# Download current list of Azure Public IP ges

# See this link for latest list

$downloadUri = "https://www.microsoft.com/en-in/download/confirmation.aspx?id=41653"

$downloadPage = Invoke-WebRequest -Uri $downloadUri

$xmlFileUri = ($downloadPage.RawContent.Split('"') -like "https://*PublicIps*")[0]

$response = Invoke-WebRequest -Uri $xmlFileUri

# Get list of regions & public IP ranges

[xml]$xmlResponse = [System.Text.Encoding]::UTF8.GetString($response.Content)

$regions = $xmlResponse.AzurePublicIpAddresses.Region

 

許可するアウトバウンド通信を NSG ルールとして定義する

パブリック IP アドレスのリストを入手したら、利用している Azure のリージョンを選択し、関連したパブリック IP 範囲ごとにアウトバウント通信のルールを作成します。

# Select Azure regions for which to define NSG rules

$selectedRegions = $regions.Name | Out-GridView `

-Title "Select Azure Datacenter Regions …" `

-PassThru

$ipRange = ( $regions | where-object Name -In $selectedRegions ).IpRange

# Build NSG rules

$rules = @()

$rulePriority = 100

ForEach ($subnet in $ipRange.Subnet) {

$ruleName = "Allow_Azure_Out_" + $subnet.Replace("/","-")

$rules += New-AzureRmNetworkSecurityRuleConfig `

-Name $ruleName `

-Description "Allow outbound to Azure $subnet" `

-Access Allow `

-Protocol * `

-Direction Outbound `

-Priority $rulePriority `

-SourceAddressPrefix VirtualNetwork `

-SourcePortRange * `

-DestinationAddressPrefix "$subnet" `

-DestinationPortRange *

$rulePriority++

}

NOTE:ここでは Azure データセンターパブリック IP アドレスに対するルールのみを設定しています。このほかご利用のアプリケーションがアクセスする Azure 以外のサービス(例えばパブリック DNS サーバー、各種 API、ライセンス サーバー、その他)のために、さらにルールを追加する必要がある場合があります。

 

その他のインターネット向けのアウトバウンド通信を拒否する

アウトバウンド通信を許可する設定が完了したら、他のすべてのインターネット向けのアウトバウンド通信を拒否するルールを設定します。正当に許可されている通信をブロックすることの無いように、この拒否ルールは上記で設定した許可ルールよりも優先度が低く設定されていることを確認してください。

# Define deny rule for all other traffic to Internet

$rules += New-AzureRmNetworkSecurityRuleConfig `

-Name "Deny_Internet_Out" `

-Description "Deny outbound to Internet" `

-Access Deny `

-Protocol * `

-Direction Outbound `

-Priority 4001 `

-SourceAddressPrefix VirtualNetwork `

-SourcePortRange * `

-DestinationAddressPrefix Internet `

-DestinationPortRange *

 

Network Security Group の作成

必要なすべてのルールを設定した後、全てのルールをひとつにまとめた Network Security Group を作成します。複数のルールを一つのグループとすることで、一連のルールを対象のサブネットやネットワーク・インターフェースに容易に適用できます。

# Set Azure region in which to create NSG

$location = "japaneast"

# Create Network Security Group

$nsgName = "Allow_Azure_Out"

$nsg = New-AzureRmNetworkSecurityGroup `

-Name "$nsgName" `

-ResourceGroupName $rgName `

-Location $location `

-SecurityRules $rules

 

Network Security Group の関連付け

NSG を作成したら、AzureのポータルまたはAzureのPowerShellのいずれを使用して VNET 内の適切なサブネットまたはネットワーク・インタフェースにこの NSG を関連付けます。これにより、選択したリージョン内のアウトバンド通信を Azure サービス用の 許可されたパブリック IP アドレス範囲のみに制限する事が可能になります。

※ 設定が反映されるまでに時間がかかる場合がありますので、期待した動作とならない場合は時間をおいてご確認頂ければと思います。

# Select VNET

$vnetName = (Get-AzureRmVirtualNetwork `

-ResourceGroupName $rgName).Name |

Out-GridView `

-Title "Select an Azure VNET …" `

-PassThru

$vnet = Get-AzureRmVirtualNetwork `

-ResourceGroupName $rgName `

-Name $vnetName

# Select Subnet

$subnetName = $vnet.Subnets.Name | Out-GridView `

-Title "Select an Azure Subnet …" `

-PassThru

$subnet = $vnet.Subnets | Where-Object Name -eq $subnetName

# Associate NSG to selected Subnet

Set-AzureRmVirtualNetworkSubnetConfig `

-VirtualNetwork $vnet `

-Name $subnetName `

-AddressPrefix $subnet.AddressPrefix `

-NetworkSecurityGroup $nsg | Set-AzureRmVirtualNetwork

 

別の方法として、Azure Portal で新しい NSG とサブネットまたはネットワークインターフェイスと結びつけるためには「参照」「ネットワークセキュリティグループ」設定したい NSG 名「すべての設定」と進み、サブネットに NSG  を関連付ける場合には、「サブネット」と選択し、特定の VM のネットワークインターフェイスと関連付けたい場合には「ネットワークインターフェイス」を選択します。

image_thumb_7FC51B66

 

参考リンク

本投稿は以下のブログをもとに、一部内容を抄訳しています。