NSGを使用してAzureネットワークをセキュリティで保護する:ステップバイステップのチュートリアル

Azure Network Security GroupsまたはAzure NSGは、1つ以上のAzureリソースからのネットワークトラフィックを入力および出力の両方でフィルタリングすることができます。Azureリソースへのアクセスを制限する必要がある場合は、NSGの動作原理を理解する必要があります。

この記事では、Azure NSGの目的と、PowerShellスクリプト言語を使用してそれらを設定する方法を学びます。

前提条件

  • ターゲットにするAzureリソース。このチュートリアルでは、従量課金制のサブスクリプションとWindows Server 2019のAzure仮想マシンを使用します。
  • PowerShell 7+。以前のバージョンのPowerShellでも動作する場合がありますが、このチュートリアルではPowerShell 7.0.1を使用しています。
  • Azure Azモジュール PowerShellモジュール

Azure NSGの理解

Azure NSGをファイアウォールと考えてください。ファイアウォールには、着信および送信トラフィックに対して実行するアクションを定義するルールセットがあります。ファイアウォールには通常、ファイアウォールを通過できるものとできないものを制御するデフォルトのルールセットが付属しています。Azure NSGにも同様のルールセットがあります。Azure NSGも同様です

従来のファイアウォールとは異なり、Azure NSGにはサービスタグというクラウド概念があります。サービスタグは、管理を容易にするためにアドレス範囲を抽象化するAzureの方法です。

これらの重要なトピックを簡単に説明しましょう。

ルールの構成を簡素化するためのサービスタグの使用

クラウドサービスでは、IPアドレスや範囲が頻繁に変更されることがあります。これにより、手動で定義したAzure IP範囲ルールセットの管理が困難になることがあります。幸いなことに、Azureでは多くの異なるサービスタグが定義されており、NSGルールの対象となることができます。

サービスタグは常に最新のアドレスリストを使用する概念です。サービスタグは、アドレス範囲のセットにプレースホルダーを割り当てるための方法です。

Azure service tags in the Azure portal

デフォルトのルールセットに注意してください

Azure NSGを作成して適用する際には、まずそのNSGが自動的に適用するルールについて知る必要があります。これらのデフォルトルールセットは変更できず、受信および送信トラフィックの両方に対して作成されます。

Azure NSGのルールセットの各ルールには優先順位があります。優先順位は操作の順序または他のルールの上書きを決定します。たとえば、すべての受信トラフィックをブロックする優先順位65000のルールが存在し、ポート80を許可する優先順位64999のルールを作成した場合、Azure NSGはポート80を除いてすべてのトラフィックをブロックします。

Default Azure NSG rule priorities

デフォルトのルールセットは変更できませんが、上記のように優先度の高いルールを使用してオーバーライドすることができます。これらのルールは、TCP、UDP、およびICMPなどのすべてのプロトコルに適用されます。

ルールがデフォルトのルールをオーバーライドするために、65500よりも低い番号を使用していることを確認してください!

Azure NSGを作成すると、さまざまなデフォルトのルールが表示されます:

インバウンドルール

  • AllowVNetInBound – このインバウンドルールには、仮想ネットワークで定義されたすべてのIPアドレス範囲と、接続されたオンプレミスのアドレススペースが含まれます。さらに、このルールには、ピアリングされた仮想ネットワーク、仮想ネットワークゲートウェイに接続された仮想ネットワーク、ホストの仮想IPアドレス、およびユーザー定義ルートで使用されるアドレスプレフィックスも含まれます。このルールは、65000の優先度で設定されています。
  • AllowAzureLoadBalancerInBoundAzureLoadBalancerサービスタグは、Azureのヘルスプローブが発信されるホストの仮想IPアドレスである168.63.129.16に変換されます。実際のトラフィックはここを通過せず、Azure Load Balancingを使用しない場合、このルールはオーバーライドできます。ホストの仮想IPアドレスは、すべてのリージョンに存在し、DHCP、DNS、IMDS、およびヘルスモニタリングなどの重要なインフラストラクチャサービスを提供するために特に存在します。このルールは、65001の優先度で設定されています。
  • DenyAllInbound – 最後のルールとして設定されており、優先度は65500です。このルールは明示的に許可されていないすべてのインバウンドトラフィックを拒否します。

アウトバウンドルール

  • AllowVNetOutBound – これには、仮想ネットワークに定義されたすべてのIPアドレス範囲、オンプレミスのアドレススペース、ピアリングされた仮想ネットワーク、仮想ネットワークゲートウェイに接続された仮想ネットワーク、ホストの仮想IPアドレス、およびユーザー定義ルートで使用されるアドレスプレフィックスが含まれています。このルールは、65000の優先順位で設定されています。
  • AllowInternetOutBound – 仮想ネットワークの外部であり、パブリックインターネットから到達可能なIPアドレススペースです。Azure所有のパブリックIPアドレススペースのアドレス範囲が含まれます。このルールは、65001の優先順位で設定されています。
  • DenyAllOutBound – 入力ルールセットと同様に、このルールは最後のルールとして設定され、優先順位は65500です。このアウトバウンドルールは、明示的に許可されていないトラフィックをすべて拒否します。

Azure NSGのPowerShellでの構築

話はここまでにして、さあAzure NSGの構築を始めましょう!PowerShellコンソールにいて認証されていることを前提として、読み進めてください。

関連記事: Connect-AzAccount: PowerShellでのAzureへのゲートウェイ

Azure NSGをPowerShellで作成するには、1つのコマンドが必要です。それは、New-AzNetworkSecurityGroupです。このコマンドを使用してNSGを作成するには、名前、NSGを作成するリソースグループ名、および場所を指定します。

以下のコード例は、New-AzNetworkSecurityGroupコマンドレットを使用して、NSG-MyVMという名前のNSGを、eastusのAzureデータセンターにあるArticlesリソースグループに作成しています。

$Params = @{
  'Name'              = 'NSG-MyVM'
  'ResourceGroupName' = 'Articles' 
  'Location'          = 'centralus'
}

$NSG = New-AzNetworkSecurityGroup @Params

PowerShellを使用してAzure NSGルールを作成する

NSGを取得したら、デフォルトのルールだけでは十分ではありません。独自のルールを作成する必要があります。

リモートデスクトッププロトコルのインバウンドルールの設定

A common administrative task is the need to create an inbound rule for the Remote Desktop Protocol (RDP). In the tutorial’s example, perhaps it’s going to be applied to a Windows Server Azure VM and you need to access the VM via RDP. In that case, you need to open up port 3389 inbound.

既存のNSGに新しいインバウンドルールを追加するには、3つのステップが必要です:

  1. 既存のNSGを取得するために、Get-AzNetworkSecurityGroupコマンドを実行します。
  2. ルールを作成するために、Add-AzNetworkSecurityRuleConfig コマンドを実行します。
  3. そのルールをNSGに適用するために、Set-AzNetworkSecurityGroupコマンドを実行します。

以下のコード例では、Get-AzNetworkSecurityGroupを使用して既存のNSGを取得し、次にAdd-AzNetworkSecurityRuleConfigを使用してルールを定義し、Set-AzNetworkSecurityGroupコマンドレットを使用して既存のNSGに適用します。

$NSG = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

$Params = @{
  'Name'                     = 'allowRDP'
  'NetworkSecurityGroup'     = $NSG
  'Protocol'                 = 'TCP'
  'Direction'                = 'Inbound'
  'Priority'                 = 200
  'SourceAddressPrefix'      = 'my.ip.address'
  'SourcePortRange'          = '*'
  'DestinationAddressPrefix' = '*'
  'DestinationPortRange'     = 3389
  'Access'                   = 'Allow'
}

Add-AzNetworkSecurityRuleConfig @Params | Set-AzNetworkSecurityGroup

優先度パラメータは、ルールが評価されるタイミングを決定します。値200は上位に近く、4096が最も低い優先度ルールです。

通常、アウトバウンドトラフィックはブロックされません。なぜなら、アプリケーションが使用する可能性のあるすべてのポートを把握するのが困難だからです。幸いなことに、情報セキュリティの標準で広く信頼されているSANS Instituteからいくつかの専門のイーグレスフィルタリングの推奨事項を見つけることができます。

SANSの推奨事項を実装するために、前述の3つのステップを同じように使用しますが、今回は複数のポートを持つルールを作成し、Directionをインバウンドではなくアウトバウンドに設定します。

  • MS RPC – TCP & UDPポート135
  • NetBIOS/IP – TCP & UDPポート137-139
  • SMB/IP – TCPポート445
  • Trivial File Transfer Protocol (TFTP) – UDPポート69
  • Syslog – UDPポート514
  • Simple Network Management Protocol (SNMP) – UDPポート161-162

以下のコードは、Get-AzNetworkSecurityGroupコマンドレットを使用して既存のNSGルールを取得します。アウトバウンドルールは、Add-AzNetworkSecurityRuleConfigを使用して定義され、Set-AzNetworkSecurityGroupコマンドレットを介して適用されます。

$NSG = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

$Params = @{
  'Name'                     = 'DenySANSOutBound'
  'NetworkSecurityGroup'     = $NSG
  'Protocol'                 = '*'
  'Direction'                = 'Outbound'
  'Priority'                 = 4000
  'SourceAddressPrefix'      = '*'
  'SourcePortRange'          = '*'
  'DestinationAddressPrefix' = 'Internet'
  'DestinationPortRange'     = @('135', '137','139','445','69','514','161','162')
  'Access'                   = 'Deny'
}

Add-AzNetworkSecurityRuleConfig @Params | Set-AzNetworkSecurityGroup

もちろん、これらのポートのいくつかは、提供するサービスによって価値があり、必要です。おそらく、アプリケーションに必要なものに応じて、このリストをカスタマイズする必要があります。通常、これらはベンダーによって提供されるか、netstatのようなオープンポートを検索するツールを使用します。

関連記事: NetstatとPowerShellを使用したポートの検索

特定のサブネットに対してAzure NSGを構成する

おそらく、サブネットを使用して仮想ネットワークスペースをセグメント化しています。より詳細にするために、NSGを特定のサブネットに適用することで、そのサブネット内のトラフィックを詳細に制御できます。

以下のコードスニペットは、アドレスプレフィックス全体を見つけ、それにNSGを適用しています。

# 既存の仮想ネットワークを取得
$VNet = Get-AzVirtualNetwork -Name 'Articles-vnet' -ResourceGroupName 'Articles'
# 既存のNSGを取得
$NSG  = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName 'Articles'

# 配列表記と0インデックスにより、最初のサブネットを選択
$Params = @{
    'VirtualNetwork'       = $VNet
    'Name'                 = ($VNet.Subnets[0]).Name
    'AddressPrefix'        = ($VNet.Subnets[0]).AddressPrefix
    'NetworkSecurityGroup' = $NSG
}

# 更新された構成をサブネット構成に適用し、変更をVNetに適用
Set-AzVirtualNetworkSubnetConfig @Params
Set-AzVirtualNetwork -VirtualNetwork $VNet

次に、ネットワークインターフェイスを使用して、ネットワークインターフェースなど必要なものにNSGをセグメント化して制限する方法を学びます。

ネットワークインターフェイスにAzure NSGを適用する

サブネットが機能するのと同様に、ネットワークインターフェースに直接NSGルールを適用することができます。この細かなレベルの適用は通常必要ありませんが、仮想マシンごとに複数のネットワークインターフェースがある場合、個々のNICに必要に応じて異なるルールセットを適用することは意味があります。

サブネット制限と同様に、個々のNICにルールを適用することができます。この場合、Get-AzNetworkInterfaceコマンドレットを使用して、指定した仮想マシンの特定のNICを取得します。これには以前に作成されたNSGがNetworkSecurityGroupプロパティに設定されています。

$NSG = Get-AzNetworkSecurityGroup -Name "MyVM-nsg" -ResourceGroupName "Articles"
$NIC = Get-AzNetworkInterface -name "MyVM-vm-nic"
 
$NIC.NetworkSecurityGroup = $NSG
$NIC | Set-AzNetworkInterface

NSGを介したトラフィックの診断と解析については、次に進んでNSGフローログとその使用方法について学びましょう!

NSGフローログを使用したデバッグとトラブルシューティング

NSGの作成と使用中に、ルールのエラーやトラフィックの解析のためにさらなるデバッグが必要な場合があります。フローログは、NSGを通過するIPトラフィックに関する情報を記録するAzure Network Watcherの機能です。

Azure Network Watcherがネットワークトラフィックをキャプチャすると、そのデータをAzureストレージアカウントに保存します。PowerShellを使用して、Azure NSGフローログを構成して、Azureストレージアカウントを解析し、問題の特定やトラブルシューティングをより効果的に行うことができます。

関連記事:AzCopyツールのダウンロードとインストール方法

NSGフローログの有効化には、PowerShellで次の3つの手順が必要です。

  1. Microsoft.Insightsプロバイダーを登録します。
  2. データを保存するために、Operational Insights Workspaceを作成します。
  3. Set-AzNetworkWatcherConfigFlowLogコマンドを使用して、NSGフローログを有効にします。

Azure NSGフローログの設定を容易にするため、以下のPowerShellコードが必要な手順を簡素化します。特に、このコードはOperational Insights Workspaceを作成し、正しいサブスクリプション、ワークスペース、およびNSGにフローログ設定を関連付けます。

$resourceGroupName = '<some resource group name>'
$NetworkWatcher = Get-AzNetworkWatcher -Name '<some name>' -ResourceGroupName $resourceGroupName
$NSG            = Get-AzNetworkSecurityGroup -Name 'NSG-MyVM' -ResourceGroupName $resourceGroupName
$StorageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name '<storage account name>'
$Subscription   = Get-AzSubscription -SubscriptionName '<your subscription name>'

$Workspace = New-AzOperationalInsightsWorkspace -Location 'centralus' -Name "DefaultWorkspace-$($NSG.Name)-Articles" -Sku 'Standard' -ResourceGroupName $resourceGroupName

$Params = @{
  'NetworkWatcher'         = $NetworkWatcher
  'TargetResourceId'       = $NSG.Id
  'StorageAccountId'       = $StorageAccount.Id
  'EnableFlowLog'          = $True
  'FormatType'             = 'JSON'
  'FormatVersion'          = 2
  'EnableTrafficAnalytics' = $True
  'WorkspaceResourceId'    = $Workspace.ResourceId
  'WorkspaceGUID'          = $Workspace.CustomerId
  'WorkspaceLocation'      = 'centralus'
}

Set-AzNetworkWatcherConfigFlowLog @Params

フローログには、ファイアウォールログに典型的なソースIP、宛先IP、ポート、プロトコル、およびタイムスタンプなど、多くの異なるプロパティが含まれています。バージョン1と2のログには、フローステートの概念があるという大きな違いがあります。これにより、フローの継続と終了、およびトラフィックの帯域幅情報がマークされます。

次のステップ

Azure NSGは、リソースへのトラフィックを制限して監査するための強力なツールです。効果的に使用することで、リソースとインフラストラクチャを適切に保護することができます。NSGフローログを介した監査機能や、サブネットやネットワークアダプタにNSGを制限する能力などを活用することで、必要に応じてルールのスコープを設定し、すべてのトラフィックが予想どおりであることを確認することができます。

Source:
https://adamtheautomator.com/azure-nsg/