Firewall Einstellugen für Azure SQL Server per ARM Skript

Was ist das Problem?

Will man eine SQL Datenbank im Azure betreiben und auf diese mittels Azure Data Studio, oder ähnlichem, zugreifen scheitert man an den Firewall Einstellungen des SQL Server im Azure. In der Standardkonfiguration sind keine Freigaben erteilt und somit kein Zugriff auf diese Art möglich.

Eine Art der Lösung

Wir übergeben dem ARM Skript eine Liste von Freigaben als Parameter und diese werden dann automatisch während des Deployments.

parameters.json

In die Parameter Datei kann folgendes eingetragen werden:

"SQLFirewallRuleList": {
  "value": [
    {
      "name": "Company Intern",
      "startIpAddress": "195.13.40.75",
      "endIpAddress": "195.13.40.77"
    },
    {
      "name": "Company HomeOffice",
      "startIpAddress": "195.13.40.70",
      "endIpAddress": "195.13.40.70"
    }
  ]
}

Es können weitere Freigaben in diese Liste eingetragen werden. Diese werde dann automatisch beim Deployment mit eingetragen.

template.json

Parameter

In den parameters Knoten wird dieser Punkt hinzugefügt:

"SQLFirewallRuleList": {
  "type": "array",
  "metadata": {
    "description": "A list of firewall rules for the SQL server."
  }
}

Dieser Eintrag erlaubt es die Liste der Freigaben von außen in das Template zu übergeben.

Firewall Loop

In das oberste resources Element wird folgendes hinzugefügt:

{
  "type": "Microsoft.Sql/servers/firewallrules",
  "name": "[concat(variables('SQLServerName'), '/', parameters('SQLFirewallRuleList')[copyIndex()].name)]",
  "apiVersion": "2014-04-01-preview",
  "location": "[resourceGroup().location]",
  "properties": {
    "startIpAddress": "[parameters('SQLFirewallRuleList')[copyIndex()].startIpAddress]",
    "endIpAddress": "[parameters('SQLFirewallRuleList')[copyIndex()].endIpAddress]"
  },
  "resources": [],
  "dependsOn": [
    "[concat('Microsoft.Sql/servers/', variables('SQLServerName'))]"
  ],
  "copy": {
    "name": "FirewallLoop",
    "count": "[length(parameters('SQLFirewallRuleList'))]"
  }
}

Zu Beachten ist, dass die Variable SQLServerName vorhanden sein muss oder durch einen entsprechenden Wert ersetzt werden muss.

Die copy Anweisung sorgt dafür, dass dieser Block für jeden Eintrag in der Liste SQLFirewallRuleList wiederholt wird.

"Allow access to Azure services"

Möchte man auch die Option "Allow access to Azure services" per ARM Skript setzen ist der folgende Block im obersten resources Element einzufügen:

{
  "name": "[concat(variables('SQLServerName'),'/', 'AllowAllWindowsAzureIps')]",
  "type": "Microsoft.Sql/servers/firewallrules",
  "location": "[resourceGroup().location]",
  "apiVersion": "2014-04-01-preview",
  "dependsOn": [
    "[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"
  ],
  "properties": {
    "startIpAddress": "0.0.0.0",
    "endIpAddress": "0.0.0.0"
  }
}

Das Geheimnis hier ist der Name AllowAllWindowsAzureIps sowie das Setzen der IP Adressen auf 0.0.0.0.

Info: Man kann natürlich diese Freigabe auch in die Liste des Parameters SQLFirewallRuleList eintragen, was zum gleichen Ergebnis führt