normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Microsoft AzureのNetwork Security Groupを使ってなんちゃってネットワーク設計(インスタンスのインターネットアクセス禁止とか)をする

御大ブログにて以下の新機能リリースがあった。

上記の機能のうち、Network Security Groupと呼ばれる機能の提供により、仮想ネットワーク上で簡易なネットワーク設計が可能となった。以下の様な社蓄心をくすぐる要件にこたえることが可能なナイス機能となっているので、今回はNetwork Security Groupの機能について紹介する。

Network Security Group の概要

MSDN - About Network Security Groups に概要がある。Network Security Group は仮想ネットワーク上に設定された サブネット or 仮想マシン、またはサブネットと仮想マシン両方に通信制御を可能とする機能だ。
IP アドレス、ポート、TCP/UDP プロトコルを指定して通信制御を行うため、冒頭で記載したインターネットへのアクセス禁止やインスタンス間(またはサブネット間)における通信制御が可能となる。
Network Security Group で利用可能なコマンドは以下となるため、詳細は MSDN を確認してほしい。

PS C:\Temp> Get-Command *NetworkSecurity*

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Cmdlet          Get-AzureNetworkSecurityGroup                      Azure
Cmdlet          Get-AzureNetworkSecurityGroupConfig                Azure
Cmdlet          Get-AzureNetworkSecurityGroupForSubnet             Azure
Cmdlet          New-AzureNetworkSecurityGroup                      Azure
Cmdlet          Remove-AzureNetworkSecurityGroup                   Azure
Cmdlet          Remove-AzureNetworkSecurityGroupConfig             Azure
Cmdlet          Remove-AzureNetworkSecurityGroupFromSubnet         Azure
Cmdlet          Remove-AzureNetworkSecurityRule                    Azure
Cmdlet          Set-AzureNetworkSecurityGroupConfig                Azure
Cmdlet          Set-AzureNetworkSecurityGroupToSubnet              Azure
Cmdlet          Set-AzureNetworkSecurityRule                       Azure

また、Network Security Groupの主な制限は以下になるので、実際に利用する際には参考にして欲しい。

  • 一つのサブスクリプションに100個までNetwork Security Groupを作成できる
  • 一つのNetwork Security Groupにつき、ルールは 200個まで設定可能
  • ACL とは併用できない(Network Security Group利用時に、あらかじめ削除しておく必要がある)
  • Multi NIC を利用している場合、デフォルト NIC にしか適用されない
  • VM 単位、Subnet 単位、または両方に適用可能

試しにネットワークを設定してみる

以下のネットワークを設定してみる。
f:id:waritohutsu:20141115163958p:plain

また、あらかじめ以下の仮想ネットワーク、インスタンスが作成済みとする。

DMZ 向けの Network Security Group を適用する

以下の PowerShell スクリプトを実行する。

# DMZ用のNetwork Security Group作成
New-AzureNetworkSecurityGroup -Name "NSG01" -Label "for vnet01 DMZ NSG" -Location "Japan East"

# インターネットからの HTTP アクセスを許可
Get-AzureNetworkSecurityGroup -Name NSG01 | Set-AzureNetworkSecurityRule -Name "AllowWEBFromInternet" -Type Inbound -Priority 100 -Action Allow -SourceAddressPrefix INTERNET -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 80 -Protocol *

# インターネットからの RDP を許可
Get-AzureNetworkSecurityGroup -Name NSG01 | Set-AzureNetworkSecurityRule -Name "AllowRDPFromInternet" -Type Inbound -Priority 500 -Action Allow -SourceAddressPrefix INTERNET -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Protocol *

# インターネットへのアクセスを禁止
Get-AzureNetworkSecurityGroup -Name NSG01 | Set-AzureNetworkSecurityRule -Name "DenyToInternet" -Type Outbound -Priority 1100 -Action Deny -SourceAddressPrefix VIRTUAL_NETWORK -SourcePortRange * -DestinationAddressPrefix INTERNET -DestinationPortRange * -Protocol *

# NSG01 の情報を表示(なくても勝手に表示されますが、一応
Get-AzureNetworkSecurityGroup -Name NSG01 -Detailed

# Subnet-DMZ へのNetwork Security Groupの適用
Get-AzureNetworkSecurityGroup NSG01 | Set-AzureNetworkSecurityGroupToSubnet -SubnetName Subnet-DMZ -VirtualNetworkName vnet01

# Subnet-DMZ へのNetwork Security Groupへの適用の確認
Get-AzureNetworkSecurityGroupForSubnet -SubnetName Subnet-DMZ -VirtualNetworkName vnet01 -Detailed

以下の実行結果が出力されるはずだ。

Name  : NSG01
Rules :

           Type: Inbound

        Name                 Priority  Action   Source Address  Source Port R Destination Addr Destination Po Protocol
                                                Prefix          ange          ess Prefix       rt Range
        ----                 --------  ------   --------------- ------------- ---------------- -------------- --------
        AllowWEBFromInternet 100       Allow    INTERNET        *             *                80             *
        AllowRDPFromInternet 500       Allow    INTERNET        *             *                3389           *
        ALLOW VNET INBOUND   65000     Allow    VIRTUAL_NETWORK *             VIRTUAL_NETWORK  *              *
        ALLOW AZURE LOAD BAL 65001     Allow    AZURE_LOADBALAN *             *                *              *
        ANCER INBOUND                           CER
        DENY ALL INBOUND     65500     Deny     *               *             *                *              *


           Type: Outbound

        Name                 Priority  Action   Source Address  Source Port R Destination Addr Destination Po Protocol
                                                Prefix          ange          ess Prefix       rt Range
        ----                 --------  ------   --------------- ------------- ---------------- -------------- --------
        DenyToInternet       1100      Deny     VIRTUAL_NETWORK *             INTERNET         *              *
        ALLOW VNET OUTBOUND  65000     Allow    VIRTUAL_NETWORK *             VIRTUAL_NETWORK  *              *
        ALLOW INTERNET OUTBO 65001     Allow    *               *             INTERNET         *              *
        UND
        DENY ALL OUTBOUND    65500     Deny     *               *             *                *              *
AP/DB 向けの Network Security Group を適用する

以下の PowerShell スクリプトを実行する。

# APサーバ、DBサーバ用のセキュリティグループ作成
New-AzureNetworkSecurityGroup -Name "NSG02" -Label "for vnet01 AP_DB NSG" -Location "Japan East"

# インターネットからの HTTP アクセスを許可
Get-AzureNetworkSecurityGroup -Name NSG02 | Set-AzureNetworkSecurityRule -Name "AllowWEBFromInternet" -Type Inbound -Priority 100 -Action Allow -SourceAddressPrefix INTERNET -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 80 -Protocol *

# インターネットからの RDP を許可
Get-AzureNetworkSecurityGroup -Name NSG02 | Set-AzureNetworkSecurityRule -Name "AllowRDPFromInternet" -Type Inbound -Priority 500 -Action Allow -SourceAddressPrefix INTERNET -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Protocol *

# インターネットへのアクセスを禁止
Get-AzureNetworkSecurityGroup -Name NSG02 | Set-AzureNetworkSecurityRule -Name "DenyToInternet" -Type Outbound -Priority 1100 -Action Deny -SourceAddressPrefix VIRTUAL_NETWORK -SourcePortRange * -DestinationAddressPrefix INTERNET -DestinationPortRange * -Protocol *

# DMZ Subnet(NSG01) へのアクセスを禁止
Get-AzureNetworkSecurityGroup -Name NSG02 | Set-AzureNetworkSecurityRule -Name "DenyToNSG01" -Type Outbound -Priority 2000 -Action Deny -SourceAddressPrefix 10.0.1.0/24 -SourcePortRange * -DestinationAddressPrefix 10.0.0.0/24 -DestinationPortRange * -Protocol *

# DMZ Subnet(NSG01) からのアクセスを許可
Get-AzureNetworkSecurityGroup -Name NSG02 | Set-AzureNetworkSecurityRule -Name "AllowFromNSG01" -Type Inbound -Priority 2100 -Action Allow -SourceAddressPrefix 10.0.0.0/24 -SourcePortRange * -DestinationAddressPrefix 10.0.1.0/24 -DestinationPortRange * -Protocol *

# Subnet-AP_DB へのNetwork Security Groupの適用
Get-AzureNetworkSecurityGroup NSG02 | Set-AzureNetworkSecurityGroupToSubnet -SubnetName Subnet-AP_DB -VirtualNetworkName vnet01

# Subnet-AP_DB へのNetwork Security Groupへの適用の確認
Get-AzureNetworkSecurityGroupForSubnet -SubnetName Subnet-AP_DB -VirtualNetworkName vnet01 -Detailed

以下の実行結果が出力されるはずだ。

Name  : NSG02
Rules :

           Type: Inbound

        Name                 Priority  Action   Source Address  Source Port R Destination Addr Destination Po Protocol
                                                Prefix          ange          ess Prefix       rt Range
        ----                 --------  ------   --------------- ------------- ---------------- -------------- --------
        AllowWEBFromInternet 100       Allow    INTERNET        *             *                80             *
        AllowRDPFromInternet 500       Allow    INTERNET        *             *                3389           *
        AllowFromNSG01       2100      Allow    10.0.0.0/24     *             10.0.1.0/24      *              *
        ALLOW VNET INBOUND   65000     Allow    VIRTUAL_NETWORK *             VIRTUAL_NETWORK  *              *
        ALLOW AZURE LOAD BAL 65001     Allow    AZURE_LOADBALAN *             *                *              *
        ANCER INBOUND                           CER
        DENY ALL INBOUND     65500     Deny     *               *             *                *              *


           Type: Outbound

        Name                 Priority  Action   Source Address  Source Port R Destination Addr Destination Po Protocol
                                                Prefix          ange          ess Prefix       rt Range
        ----                 --------  ------   --------------- ------------- ---------------- -------------- --------
        DenyToInternet       1100      Deny     VIRTUAL_NETWORK *             INTERNET         *              *
        DenyToNSG01          2000      Deny     10.0.1.0/24     *             10.0.0.0/24      *              *
        ALLOW VNET OUTBOUND  65000     Allow    VIRTUAL_NETWORK *             VIRTUAL_NETWORK  *              *
        ALLOW INTERNET OUTBO 65001     Allow    *               *             INTERNET         *              *
        UND
        DENY ALL OUTBOUND    65500     Deny     *               *             *                *              *

しかして

上記で設定は完了だが、設定がうまく反映されたり反映が遅れたりする場合があるようだ。MSDN にも以下の記載があり、反映に数分はかかることが記載されているが、体感で30分以上の時間が過ぎたにも関わらず設定が反映されていない場合もあった(逆に、ルールを変更したら即座に反映された場合もあった)ので、利用時には注意してほしい。

Associating an NSG to a VM - When a NSG is directly associated to a VM, the Network access rules in the NSG are directly applied to all traffic that is destined to the VM. Whenever the NSG is updated for rule changes, the changes are reflected in the traffic handling within minutes. When the NSG is dis-associated from the VM, the state goes back to whatever it was before the NSG, i.e. the system defaults before the introduction if NSG will be used.
Associating an NSG to a Subnet - When a NSG is associated to a subnet, the Network access rules in the NSG are applied to all the VMs in the subnet. Whenever the access rules in the NSG are updated the changes are applied to all Virtual machines in the subnet within minutes.