Azure Netzwerksicherheitsgruppe anpassen

Was für ein Wort. Netzwerksicherheitsgruppe. 25 Zeichen! NSG hat nur 3. :-). Ok, Spaß beiseite, ich möchte heute zeigen, wie man recht einfach den Zugang zu seinen Ressourcen freischalten und blocken kann.

(This article is also available in english).

Meine Testumgebungen sind immer gleich aufgebaut: Es gibt eine Namenskonvention für alle Ressourcen, und damit auch für das VNet bzw. Subnet. Weiterhin gibt es immer eine NSG, die beim Deployment mit angelegt wird und erst mal alles blockt. Da ich sie an das Subnetz binde, sind damit alle VMs von extern geschützt. Genau diese NSG modifiziere ich dann mit einem kleinen PowerShell Script, in dem ich meine aktuelle IP Adresse ermittle (wir mobile Worker haben ja immer eine andere) und diese dann eintrage. Das wollte ich euch nicht vorenthalten.

Erst mal der Teil des Templates, der die NSG anlegt:

        {   "type": "Microsoft.Network/networkSecurityGroups",
            "name": "[variables('nsgName')]",
            "apiVersion": "2018-08-01",
            "location": "[variables('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "all-in-from-home",
                        "properties": {
                            "description": "needs modification by script",
                            "protocol": "Tcp",
                            "sourcePortRange": "*",
                            "destinationPortRange": "*",
                            "sourceAddressPrefix": "127.0.0.1/32",
                            "destinationAddressPrefix": "*",
                            "access": "Allow",
                            "priority": 100,
                            "direction": "Inbound"
                        }
                    }
                ]
            }
        },

Man sieht, dass zunächst nur der Zugriff von 127.0.0.1 gestattet wird… also von nirgendwoher.

Die Variable „nsgName“ ist zusammengesetzt aus Ressourcengruppe und „nsg1“. Für die Gruppe „blogdemo“ also blogdemonsg1. Das macht es sehr einfach, die Regel zu ändern, ich muss dem Script nur den Namen der Gruppe übergeben:

Param(
    [parameter(mandatory=$true)][string]$resourcegroup
)

$ipinfo = Invoke-RestMethod "http://ipinfo.io/json"

$nsgname=$resourcegroup+"nsg1"
$configname="all-in-from-home"
$sourceAddressPrefix = "$($ipinfo.ip)/32"
$description = "modified by script to temp IP"

$nsg=Get-AzNetworkSecurityGroup -Name $nsgname -ResourceGroupName $resourcegroup

$rule = ($nsg | Get-AzNetworkSecurityRuleConfig -Name $configname -ErrorAction SilentlyContinue)

Sicher verwendet der ein oder andere eine alternative Methode, die eigene IP-Adresse zu ermitteln. Ich finde diese hier in Zeile 5 ganz praktisch, die liefert (wenn man möchte) gleich noch ein paar mehr Infos mit.

„nsgname“ haben wir schon besprochen. Die Regel, die standardmäßig alles blockt, heißt „all-in-from-home“. In Zeile 12 erhalten wir das entsprechende Objekt. Das untersuchen wir in Zeile 14, ob es eine entsprechende Regel enthält oder ob diese evtl. gelöscht wurde. Existiert die Regel noch nicht, dann legen wir im folgende Teil eine neue an mit Add-AzNetworkSecurityRuleConfig bzw. ändern die vorhandene ab mit Set-AzNetworkSecurityRuleConfig:

if ($rule -eq $null) {
        $prio = [int]($nsg.SecurityRules[$nsg.SecurityRules.Count-1].Priority)
        $prio += 10
        if ($prio -lt 100){
                $prio=100
        }
        Write-Host "Adding $configname rule to allow $sourceAddressPrefix with priority $prio"
        $ret = ($nsg | Add-AzNetworkSecurityRuleConfig `
                        -Name $configname `
                        -SourceAddressPrefix $sourceAddressPrefix `
                        -SourcePortRange "*" `
                        -DestinationAddressPrefix "*" `
                        -DestinationPortRange "*" `
                        -Protocol "Tcp" `
                        -Direction "Inbound" `
                        -Access "Allow" `
                        -Priority $prio `
                        -Description $description
        )
} else {
        Write-Host "Updating $configname rule to allow $sourceAddressPrefix"
        $ret = ($nsg | Set-AzNetworkSecurityRuleConfig `
                        -Name $configname `
                        -SourceAddressPrefix $sourceAddressPrefix `
                        -SourcePortRange $rule.SourcePortRange `
                        -DestinationAddressPrefix $rule.DestinationAddressPrefix `
                        -DestinationPortRange $rule.DestinationPortRange `
                        -Protocol $rule.Protocol `
                        -Direction $rule.Direction `
                        -Access $rule.Access `
                        -Priority $rule.Priority `
                        -Description $description
        )
}
Write-Host "Apply new rule..."
$ret = ($nsg | Set-AzNetworkSecurityGroup)

In Zeile 16-20 legen wir eine Priorität fest (Standard ist 100), außer es existieren schon welche, dann erhöhen wir die höchste bisherige um 10. Man sieht, dass wir im zweiten Teil, also dann, wenn die Regel schon existiert, nur „sourceAddressPrefix“ und „description“ ändern, für alle andere Werte schreiben wir die bisherigen Daten zurück.

Noch ganz am Ende die neue NSG aktualisieren, und schon steht dem Login nichts mehr im Wege.

Der Aufruf sieht dann wie folgt aus:

change-nsg.ps1 -resourcegroup blogdemo

Ich muss noch erwähnen, dass es in Azure auch einen „Just-in-Time“ Access Control Service gibt, die kann man natürlich auch nutzen. Ich möchte auf gar keinen Fall dieser tollen Funktionalität Konkurrenz machen, mein Ziel hier war es, das einfach von Kommandozeile aus nutzen zu können. Und wenn ich eine neue Testumgebung ausbringe, dann ist dieser Aufruf der letzte Teil meines Deployment-Skripts. Und außerdem hatte ich das schon, bevor es JIT access control gab 🙂

4 Kommentare zu „Azure Netzwerksicherheitsgruppe anpassen

Hinterlasse einen Kommentar