Если вы хотите использовать инфраструктуру в качестве кода в своих проектах, вы должны помнить, что вам нужно поместить всю инфраструктуру в коде. Но часто чего -то не хватает, особенно при развертывании IAAS, сетевой безопасности.
В среде IAAS у вас обычно есть виртуальные машины внутри нескольких подсетей. Создание такого рода архитектуры с шаблоном ARM является простым, но обычно одной частью пренебрегают сетевой безопасностью с группами сети. Для этого много причин; Он комплекс, у вас может не быть матрицы соединений, количество виртуальной машины, IP, … так что большую часть времени вы думаете; Группа сети безопасности будет сделана позже. Но позже часто синоним никогда.
Лучшая практика для развертывания групп безопасности Networks так же, как вы развертываете виртуальные машины и другие услуги. Это должно быть в то же время. Держать все вместе.
Возьмите этот пример.
Представьте себе ситуацию, когда вам нужно реализовать шаблон для создания двух виртуальных машин, одного фронта и одного DB -сервера. Две виртуальные машины находятся в отдельных подсетях, и вы знаете, что вам нужно будет добавить несколько ограничений, чтобы фронт сможет подключиться только к БД на ограниченных портах TCP.
Даже если мы еще не знаем, какой порт использует решение, мы можем начать создавать группу безопасности сети в этих подсетах.
Чтобы избежать использования IP -адресов в правилах и иметь возможность сгруппировать несколько виртуальных машин в том же правиле NSG, вам необходимо будет использовать группы безопасности приложений. Группы безопасности приложений — это простой способ связать виртуальную машину, на самом деле, VM NIC, конфигурация сети с объектом, который вы можете использовать в NSG. Вы можете применить группы сети либо к виртуальной NIC, либо к подсети виртуальной машины. Я обычно предпочитаю связывать NSG с подсети, а не с виртуальной машиной.
Для нашего примера нам нужно:
- Один Vnet
- Две подчинки; спереди и бэкэнд
- Два виртуальных машины, фронт01 и DB01
Основная инфраструктура в руке выглядит так:
"resources": [ { "name": "vnet01", "type": "Microsoft.Network/virtualNetworks", "apiVersion": "2019-11-01", "location": "[variables('location')]", "properties": { "addressSpace": { "addressPrefixes": [ "172.24.0.0/24" ] }, "subnets": [ { "name": "front", "properties": { "addressPrefix": "172.24.0.0/26" } }, { "name": "backend", "properties": { "addressPrefix": "172.24.0.64/26" } } ] } }, { "name": "vmfront01-nic", "type": "Microsoft.Network/networkInterfaces", "apiVersion": "2019-11-01", "location": "[variables('location')]", "dependsOn": [ "[resourceId('Microsoft.Network/virtualNetworks', 'vnet01')]" ], "properties": { "ipConfigurations": [ { "name": "ipConfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "subnet": { "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'vnet01', 'front')]" } } } ] } }, { "name": "vmfront01", "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2019-07-01", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Network/networkInterfaces', 'vmfront01-nic')]" ], "properties": { "hardwareProfile": { "vmSize": "Standard_F2s_v2" }, "osProfile": { "computerName": "vmfront01", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "storageProfile": { "imageReference": { "publisher": "MicrosoftWindowsServer", "offer": "WindowsServer", "sku": "2019-Datacenter-Core", "version": "latest" }, "osDisk": { "name": "vmfront01-os.vhd", "caching": "ReadWrite", "createOption": "FromImage" } }, "networkProfile": { "networkInterfaces": [ { "id": "[resourceId('Microsoft.Network/networkInterfaces', 'vmfront01-nic')]" } ] } } }, { "name": "vmdb01-nic", "type": "Microsoft.Network/networkInterfaces", "apiVersion": "2019-11-01", "location": "[variables('location')]", "dependsOn": [ "[resourceId('Microsoft.Network/virtualNetworks', 'vnet01')]" ], "properties": { "ipConfigurations": [ { "name": "ipConfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "subnet": { "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'vnet01', 'backend')]" } } } ] } }, { "name": "vmdb01", "type": "Microsoft.Compute/virtualMachines", "apiVersion": "2019-07-01", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.Network/networkInterfaces', 'vmdb01-nic')]" ], "properties": { "hardwareProfile": { "vmSize": "Standard_F2s_v2" }, "osProfile": { "computerName": "vmdb01", "adminUsername": "[parameters('adminUsername')]", "adminPassword": "[parameters('adminPassword')]" }, "storageProfile": { "imageReference": { "publisher": "MicrosoftWindowsServer", "offer": "WindowsServer", "sku": "2019-Datacenter-Core", "version": "latest" }, "osDisk": { "name": "vmdb01-os.vhd", "caching": "ReadWrite", "createOption": "FromImage" } }, "networkProfile": { "networkInterfaces": [ { "id": "[resourceId('Microsoft.Network/networkInterfaces', 'vmdb01-nic')]" } ] } } } ]
Теперь вам нужно будет добавить группы безопасности приложений, один для передней виртуальной машины и один для DB VM. Группы безопасности приложений в ARM просты. Просто имя и местоположение (вы также можете добавить теги в качестве любых других объектов).
{ "type": "Microsoft.Network/applicationSecurityGroups", "apiVersion": "2019-11-01", "name": "frontVMs-asg", "location": "[variables('location')]", "properties": {} }, { "type": "Microsoft.Network/applicationSecurityGroups", "apiVersion": "2019-11-01", "name": "dbVMs-asg", "location": "[variables('location')]", "properties": {} },
Теперь, когда у вас есть группы безопасности ваших приложений, вы можете связать их с конфигурацией IP виртуальной машины. Вы должны сделать это на уровне виртуального NIC, в свойствах конфигурации IP, добавив свойства ApplicationSecurityGroups.
"ipConfigurations": [ { "name": "ipConfig1", "properties": { "privateIPAllocationMethod": "Dynamic", "subnet": { "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'vnet01', 'front')]" }, "applicationSecurityGroups" : [ { "ID": "[resourceId('Microsoft.Network/applicationSecurityGroups', 'frontVMs-asg')]" } ] } } ]
ApplicationSecurityGroups — это массив. Это означает, что вы можете добавить более одного ASG в конфигурацию. Вам нужно будет добавить в зависимости от пункта, чтобы убедиться, что группа безопасности приложений создана перед виртуальной NIC.
"dependsOn": [ "[resourceId('Microsoft.Network/virtualNetworks', 'vnet01')]", "[resourceId('Microsoft.Network/applicationSecurityGroups', 'frontVMs-asg')]" ],
Вы можете начать строить группы безопасности сетей. Вы хотите разрешить связь с фронтом на портах 80 и 443, и вы хотите ограничить связь на сервере DB только от передней виртуальной машины.
Чтобы создать правило NSG с использованием групп безопасности приложений, вы должны заменить sourceaddressprefixes/destinationAddressprefixes с помощью SourceApplicationSecurityGroups/destinationApplicationsCurityGroups с идентификатором группы безопасности приложения.
Например, чтобы правило разрешило общение от передней виртуальной машины в DB
{ "name": "sqlRule", "properties": { "description": "Allow Sql Servers flows", "protocol": "Tcp", "sourcePortRange": "*", "destinationPortRange": "1433", "sourceApplicationSecurityGroups": [ { "ID": "[resourceId('Microsoft.Network/applicationSecurityGroups', 'frontVMs-asg')]" } ], "destinationApplicationSecurityGroups": [ { "ID": "[resourceId('Microsoft.Network/applicationSecurityGroups', 'dbVMs-asg')]" } ], "access": "Allow", "priority": 100, "direction": "Inbound" } }
Конечно, вы не должны забывать добавлять зависимость для группы безопасности приложений при создании групп сетевой безопасности.
"name": "backend-nsg", "type": "Microsoft.Network/networkSecurityGroups", "apiVersion": "2019-11-01", "dependsOn": [ "[resourceId('Microsoft.Network/applicationSecurityGroups', 'dbVMs-asg')]", "[resourceId('Microsoft.Network/applicationSecurityGroups', 'frontVMs-asg')]" ]
Группы безопасности приложений просты. Это объект, который вы можете использовать для группы нескольких конфигураций IP из виртуальных NICS. Это делает группы безопасности сети простыми в использовании, поскольку вам не нужно знать IP -адрес виртуальной машины для создания правила. Вы можете масштабировать свои развертывания, не нуждаясь в обновлении групп безопасности сетей. Если вам нужно добавить виртуальную машину в существующее правило, вам просто нужно добавить ее в группу безопасности приложения.
Это так же, если вам нужно добавить правило, не нужно собирать информацию о IP, вам просто нужно добавить справочный идентификатор группы безопасности приложения для создания ваших правил.
Полный файл JSON включен Суть
Оригинал: «https://dev.to/omiossec/arm-templates-using-nsg-and-application-security-groups-in-your-azure-deployments-1one»