Custom RBAC Role in Azure

Um innerhalb vom Azure Resource Manager granularere Berechtigungen zu verteilen, braucht man customized Rollen. Dieses lassen sich per Shell erstellen. In diesem Beispiel möchte ich den Kollegen Contributor Rechte auf deren ResourceGroups geben, jedoch verhindern, dass sie irgendetwas am Netzwerk-Stack ändern können:

# Laden und anmelden
Import-Module AzureRM
Login-AzureRMAccount

# Die Konfig muss als JSON gespeichert werden um sie dann zu übergeben
$TempJsonFile = "C:\temp\RBAC.json"

# Die Contributor Rolle als Vorlage nehmen
$Role = Get-AzureRmRoleDefinition "Contributor"

# Wunschnamen definieren
$Role.Name = "Custom-Contributor"

# Markieren, dass es eine Custom Role ist
$Role.IsCustom = $True

# Eine passende Beschreibung vergeben
$Role.Description = "Custom Contributor group with access to anything but changing network settings"

# Auflisten was alles noch verboten werden soll
$Role.NotActions.Add("Microsoft.Network/*/Action")
$Role.NotActions.Add("Microsoft.Network/*/Write")
$Role.NotActions.Add("Microsoft.Network/*/Delete")

# Die Subscription ID für den Scope raussuchen
$SubID = (Get-AzureRmSubscription).ID

# Den Default Scop von Azure löschen und unsere Subscription eintragen
$Role.AssignableScopes.Remove("/")
$Role.AssignableScopes.Add("/subscriptions/$SubID")

# Die Konfig als JSON speichern, ohne ID, denn die muss neu generiert werden
$Role | select * -ExcludeProperty ID | ConvertTo-Json | Out-File $TempJsonFile

# Neue Role erstellen
New-AzureRmRoleDefinition -InputFile $TempJsonFile

# Jason File wieder löschen
Remove-Item $TempJsonFile

Möchte man nun nicht nur Befehle ausschließen, sondern in weiteren Rollen auch einmal ein paar Befehle exklusiv verteilen, geht das wie folgt:

$Role.Actions.Add("Microsoft.Network/virtualNetworks/subnets/read")

Eine Liste aller möglichen “Operations” findet ihr wie folgt:

Get-AzureRmProviderOperation *

Wie im Beispiel oben zu sehen, kann mit Wildcards gearbeitet werden.