Azure Virtual Network Manager を利用して、NSG を無視した通信制御を強制する
azure
Published: 2021-11-03

はじめに

Ignite Fall 2021 にて Azure Virtual Network Manager がプレビューになりました。

https://docs.microsoft.com/en-us/azure/virtual-network-manager/

Azure Virtual Network Manager が提供する機能は次の3つです。

  1. Hub and Spoke 型 VNet Peering の構築
  2. フルメッシュ型 VNet Peering の構築
  3. NSG よりも優先度の高い Security Admin Rule の設定

1と2は、手作業で出来る VNet Peering の作業を簡略化してくれるものです。3は Azure Virtual Network Manager でのみ実現できる機能です。というわけで3を試しました。

Azure Virtual Network Manager の作成

まずは Azure Virtual Network Manager(AVNM) 自体を作ります。作る際に AVNM が管理する対象をスコープとして指定します。

スコープの設定画面

また、AVNM が利用する機能を選択します。Connectivity と Security Admin を選択できます。

機能の選択画面

今回はサブスクリプションをスコープとして、Connectivity と Security Admin の両方を利用する AVNM を作りました。

Network Group の作成

AVNM の機能を適用する VNet を Network Group として束ねます。束ね方は VNet を指定する静的な割り当てと Azure Policy のような構文で VNet を指定する動的な割り当てがサポートされています。

Excluding elements from dynamic membership in Azure Virtual Network Manager (Preview)

今回は静的な割り当てを利用して、複数の VNet を Network Group として束ねました。

Network Group の設定画面

Security admin configuration の作成

Security Admin Rule を VNet に適用するためには、Security Admin Rule と、Security Admin Rule の集合である Rule collections、そして Rule collections の集合体であり VNet に適用する security admin configuration の3つを作る必要があります。

今回は Security admin configuration と Rule collections を Azure Portal から作り、その中に PowerShell で Security Admin Rule を追加しました。

$collection = @{
    Name = 'Reject-untrust-traffic'
    ResourceGroupName = 'anm'
    NetworkManagerName = 'anm'
    ConfigName = 'force-nsg'
}
$rulecollection = Get-AzNetworkManagerSecurityAdminRuleCollection @collection

$sourceip = @{
    AddressPrefix = 'Internet'
    AddressPrefixType = 'ServiceTag'
}
$sourceprefix = New-AzNetworkManagerAddressPrefixItem @sourceip

$destinationip = @{
    AddressPrefix = 'VirtualNetwork'
    AddressPrefixType = 'ServiceTag'
}
$destinationprefix = New-AzNetworkManagerAddressPrefixItem @destinationip

[System.Collections.Generic.List[string]]$sourcePortList = @() 
$sourcePortList.Add("0-65535") 

[System.Collections.Generic.List[string]]$destinationPortList = @() 
$destinationPortList.Add("3389")

$rule = @{
    Name = 'Block_RDP_From_Internet'
    ResourceGroupName = 'anm'
    NetworkManagerName = 'anm'
    SecurityAdminConfigurationName = 'force-nsg'
    RuleCollectionName = $rulecollection.Name
    Protocol = 'TCP'
    Access = 'Deny'
    Priority = '100'
    Direction = 'Inbound'
    Source = $sourceprefix
    SourcePortRange = $sourcePortList
    Destination = $destinationprefix
    DestinationPortRange = $destinationPortList
}

上記のとおり、Internet から VirtualNetwork への RDP を拒否する Security Admin Rule が設定されました。

インターネットからの RDP を全拒否する Security Admin Rule

security admin configuration のデプロイ

作成した security admin configuration を VNet にデプロイします。デプロイする際には、どの security admin configuration をどのリージョンに展開するかを指定します。

デプロイ画面

今回は作成した force-nsg という security admin configuration を AVNM がサポートする9リージョンに展開しました。Network Group 内に AVNM がサポートしない仮想ネットワークが存在する場合、その仮想ネットワークには security admin rule はデプロイされません。

デプロイ結果

動作確認

仮想マシンであれば、デプロイされた security admin rule は Network の確認画面に表示されます。今回作成した Internet からの RDP 全拒否 security admin rule が NSG のルールの下に表示されました。

デプロイ結果

NSG で 特定 IP からの RDP を許可しているにも関わらず、security admin rule で Internet からの RDP が拒否されているため、特定 IP からの RDP ができなくなりました。大成功です。

まとめ

プレビューになった Azure Virtual Network Manager を試しました。AVNM は、すべての NSG に共通のルールを追加したいという要望を実現できるサービスです。セキュリティシステムとの通信を許可したい、C&Cサーバや怪しいグローバル IP アドレスへの通信を拒否したいなどの要件で、ネットワーク管理者やセキュリティ管理者がすべての NSG に同じルールを強制したいケースはあると思います。そんな時に使うと便利なサービスだと思います。