ARMテンプレート使ってNSGをデプロイ

 

Azure Network Security Group(NSG)のデプロイをARMテンプレート使ってやってみました。

今回は一番初期に使うパターンとして多そうな、RDP(ポート番号3389)を特定のIPからのみ受信許可する設定を試してみました。

1 .NSGの設定項目を確認する

まず、Azure PortalでNSGのセキュリティ規則設定で必要な項目を確認してみました。必須項目は以下の内容となっている事が確認できます。

      • ソース
      • ソースIPアドレス
      • ソースポート範囲
      • 宛先
      • 宛先ポート範囲
      • プロトコル
      • アクション
      • 優先度
      • 名前

 

.NSGのARMテンプレートサンプル(特定のIPからのみRDPを受信許可する)

今回のARMテンプレートで実施する内容は以下の通りになります。

      • NSGの作成
      • セキュリティ規則の作成

NSGのセキュリティ規則については、ソースIP以外をARMテンプレート内のresourcesで指定しています。

RDPをすべてのプロトコルで受信許可し、優先度100とする内容としています。

パラメータとして以下の値を指定するようにしています。

      • NSG名
      • ロケーション(デフォルト値を東日本としています)
      • NSGのセキュリティ規則名(デフォルト値をRDP-Permitとしています)
      • ソースIPアドレス(RDPを許可するIP)
{

    “$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
    “contentVersion”: “1.0.0.0”,
    “parameters”: {
        “NSGName”: {
            “type”: “String”,
            “metadata”: {}
        },
        “location”: {
            “type”: “String”,
            “defaultValue”: “japaneast”,
            “metadata”:{} 
        },
        “NSGRuleName”: {
            “type”: “String”,
            “defaultValue”: “RDP-Permit”,
            “metadata”:{} 
        },
        “PermitIP”: {
           “type”: “String”,
           “metadata”:{} 
        }
    },
    “variables”: {},
    “resources”: [
        {
            “type”: “Microsoft.Network/networkSecurityGroups”,
            “apiVersion”: “2019-11-01”,
            “name”: “[parameters(‘NSGName’)]”,
            “location”: “[parameters(‘location’)]”,
            “properties”: {
                “securityRules”: [
                    {
                        “name”: “[parameters(‘NSGRuleName’)]”,
                        “properties”: {
                            “protocol”: “*”,
                            “sourcePortRange”: “*”,
                            “destinationPortRange”: “3389”,
                            “sourceAddressPrefix”: “[parameters(‘PermitIP’)]”,
                            “destinationAddressPrefix”: “VirtualNetwork”,
                            “access”: “Allow”,
                            “priority”: 100,
                            “direction”: “Inbound”,
                            “sourcePortRanges”: [],
                            “destinationPortRanges”: [],
                            “sourceAddressPrefixes”: [],
                            “destinationAddressPrefixes”: []
                        }
                    }
                ]
            }
        },
        {
            “type”: “Microsoft.Network/networkSecurityGroups/securityRules”,
            “apiVersion”: “2019-11-01”,
            “name”: “[concat(parameters(‘NSGName’), ‘/’, parameters(‘NSGRuleName’))]”,
            “dependsOn”: [
                “[resourceId(‘Microsoft.Network/networkSecurityGroups’, parameters(‘NSGName’))]”
            ],
            “properties”: {
                “protocol”: “*”,
                “sourcePortRange”: “*”,
                “destinationPortRange”: “3389”,
                “sourceAddressPrefix”: “[parameters(‘PermitIP’)]”,
                “destinationAddressPrefix”: “VirtualNetwork”,
                “access”: “Allow”,
                “priority”: 100,
                “direction”: “Inbound”,
                “sourcePortRanges”: [],
                “destinationPortRanges”: [],
                “sourceAddressPrefixes”: [],
                “destinationAddressPrefixes”: []
            }
        }
    ]
}

 

※デフォルトルールは、テンプレートには必要無いようです。

.NSGのARMテンプレートをPower Shell使ってデプロイする

1.で作成したNSGのARMテンプレートをPower Shell使ってデプロイします。
今回のサンプルではリソースグループ名、ロケーション名、セキュリティ規則名はデプロイ用Power Shellに直接記載しています。

Power Shellでデプロイ時にNSGの名前、RDPを許可するIPは指定するようにしています。

#NSG Template Deploy

param (
  [String] [Parameter(Mandatory=$true)]  $NSGName ,
  [String] [Parameter(Mandatory=$true)]  $Address
    )

$resourceGroupName = “リソースグループ名”
$location = “ロケーション名”
$NSGRuleName =“セキュリティ規則名”
$TemplateFilePath = “テンプレートのパス”

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateFile $TemplateFilePath `
  -NSGName $NSGName `
  -NSGRuleName $NSGRuleName `
  -PermitIP $Address `
  -location $location

NSGが出来た後に、SubnetやNetwork Interfaceとの関連付けを行ってください。

これをデフォルト適用すれば、間違ってRDPをInterNetにAnyで公開する事を防げないかなぁと思っていたします。

今後は、サービスタグの指定、複数のセキュリティ規則を一括して作成するなど、環境に合わせて作成できるようにしていきたい所です。