Szenario
Für das Azure Lighthouse Demo gehe ich vom folgenden Szenario aus:
- Der Service Provider (CSP) “Tom Demo Inc.” bietet Kunden zwei Dienstleistungspakete für die Azure Cloud an:
- Azure Support & Monitoring: die Mitarbeiter:innen des CSP überwachen (monitoren) die Azure Ressourcen des Kunden.
- Security: das Security Operations Center (SOC) des CSP wacht über die Sicherheit der Azure Ressourcen des Kunden.
- Kunden können diese Pakete für ihre Azure Subscriptions (oder einzelne Ressourcengruppen) buchen.
- Zugriff der CSP Mitarbeiter:innen auf die Ressourcen des Kunden erfolgt transparent mit Azure Lighthouse. Das bedeutet, Kunden müssen keine Benutzer:innen des CSP in ihren Entra ID Tenant “einladen”.
Service Provider setup
Sicherheitsgruppen
Für das Demo habe ich in meinem Dev-Entra-Tenant “dev.soltari.at” zwei Sicherheitsgruppen für Lighthouse vorbereitet:
az ad group list --filter "startswith(displayname, 'IT-AzLighthouse')" --query "[].{Name:displayName, Id:id, Beschreibung:description}" -o table
Name Id Beschreibung
--------------------- ------------------------------------ ----------------------------------------------------------
IT-AzLighthouse-ITOps 6cafe89d-a817-4dd5-9ae9-cd42d4e5cb58 IT Operations team, used for Azure Lighthouse
IT-AzLighthouse-SOC b0ab3638-e33f-47c1-a37a-614775a25c19 Security Operations Center team, used for Azure Lighthouse
Diese Sicherheitsgruppen beinhalten Benutzer, die über Lighthouse unterschiedliche Berechtigungen in den Azure Subscriptions des Kunden bekommen werden. Hier zum Beispiel die SOC Gruppe:
az ad group member list --group b0ab3638-e33f-47c1-a37a-614775a25c19 --query "[].{Name:displayName, Id:id, UPN:userPrincipalName, JobTitle:jobTitle}" -o table
Name Id UPN JobTitle
----------- ------------------------------------ --------------------- ----------------
Adele Vance 09af75ca-a16b-4d7f-bfd4-b791491ca628 AdeleV@dev.soltari.at Security Analyst
Lighthouse Offer
Die Azure Lighthouse “Offers” (Angebote) werden im ARM-Format, wie bei ARM üblich aus zwei Dateien im JSON-Format: dem Template selbst und einer Parameter-Datei.
Für das Demo verwende ich ein geringfügig angepasstes “Multi-Resource-Group” Template aus dem offiziellen Lighthouse GitHub-Repository: multi-rg.json und multiple-rg.parameters.json.
Die fünf Parameter des Templates kurz erklärt:
- mspOfferName ist der Anzeigename des “Angebots”, den der Kunde in Azure Lighthouse sehen wird.
- mspOfferDescription ist die Beschreibung, welche ebenfalls für den Kunden ersichtlch ist.
- managedByTenantId enthält die Microsoft Entra Tenant ID des CSPs. In diesem Fall ist es die ID meines “dev.soltari.at” Tenants
1d8c4cee-85e5-40c0-b55f-000000000000
(anonymisiert). - authorizations definiert die “Autorisierungen” welche der CSP auf die Ressourcengruppen des Kunden erhält. Konkret sind das Azure Rollen welche den Mitarbeiter:innen des CSP via RBAC zugewiesen werden. Die IDs der Azure Rollen sind in der Dokumentation unter Azure built-in roles zu finden. Welche meiner Gruppen welche Rollen bekommt beschreibe ich weiter unten.
- resourceGroups enthält eine Liste der Ressourcengruppennamen in der Azure-Umgebung des Kunden, auf welche die Lighthouse “Autorisierungen” angewendet werden.
Für alle Parameter außer den resourceGroups macht es Sinn, Default-Werte zu hinterlegen.
Parameter für Support & Monitoring Service
Für die “Support & Monitoring” Services soll unsere “IT Operations” Sicherheitsgruppe folgende Rollen bekommen:
b24988ac-6180-42a0-ab88-20f7382dd24c
Contributor91c1777a-f3dc-4fae-b103-61d183457e46
Managed Services Registration assignment Delete, damit der CSP die Berechtigungen im Tenant des Kunden selbst wieder entfernen kann.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"mspOfferName": {
"value": "Azure Support & Monitoring Services"
},
"mspOfferDescription": {
"value": "Support und Monitoring von Tom Demo Inc. für deine Azure-Umgebung."
},
"managedByTenantId": {
"value": "1d8c4cee-85e5-40c0-b55f-000000000000"
},
"authorizations": {
"value": [
{
"principalId": "6cafe89d-a817-4dd5-9ae9-cd42d4e5cb58",
"roleDefinitionId": "b24988ac-6180-42a0-ab88-20f7382dd24c",
"principalIdDisplayName": "IT-AzLighthouse-ITOps"
},
{
"principalId": "6cafe89d-a817-4dd5-9ae9-cd42d4e5cb58",
"roleDefinitionId": "91c1777a-f3dc-4fae-b103-61d183457e46",
"principalIdDisplayName": "IT-AzLighthouse-ITOps"
}
]
}
}
}
Parameter für Security Operations Service
Für die “Security Operations” Services soll unsere “SOC” Sicherheitsgruppe folgende Rollen bekommen:
acdd72a7-3385-48ef-bd42-f606fba81ae7
Readerab8e14d6-4a74-4a29-9ba8-549422addade
Microsoft Sentinel Contributorfb1c8493-542b-48eb-b624-b4c8fea62acd
Security Admin
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"mspOfferName": {
"value": "Azure Security Operations Services"
},
"mspOfferDescription": {
"value": "Das managed Security Operations Center von Tom Demo Inc. für deine Azure-Umgebung."
},
"managedByTenantId": {
"value": "1d8c4cee-85e5-40c0-b55f-000000000000"
},
"authorizations": {
"value": [
{
"principalId": "b0ab3638-e33f-47c1-a37a-614775a25c19",
"roleDefinitionId": "acdd72a7-3385-48ef-bd42-f606fba81ae7",
"principalIdDisplayName": "IT-AzLighthouse-SOC"
},
{
"principalId": "b0ab3638-e33f-47c1-a37a-614775a25c19",
"roleDefinitionId": "ab8e14d6-4a74-4a29-9ba8-549422addade",
"principalIdDisplayName": "IT-AzLighthouse-SOC"
},
{
"principalId": "b0ab3638-e33f-47c1-a37a-614775a25c19",
"roleDefinitionId": "fb1c8493-542b-48eb-b624-b4c8fea62acd",
"principalIdDisplayName": "IT-AzLighthouse-SOC"
}
]
}
}
}
Multi-Resource-Group ARM-Template
Das ARM-Template ist so gestaltet, dass es vom Kunden auf mehrere Ressourcengruppen gleichzeitig angewendet werden kann. Dazu wird der ARM “copy”-Syntax (vgl. Zeile 52 bis 57) verwendet.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"mspOfferName": {
"type": "string",
"metadata": {
"description": "Specify a unique name for your offer"
}
},
"mspOfferDescription": {
"type": "string",
"metadata": {
"description": "Name of the Managed Service Provider offering"
}
},
"managedByTenantId": {
"type": "string",
"metadata": {
"description": "Specify the tenant id of the Managed Service Provider"
}
},
"authorizations": {
"type": "array",
"metadata": {
"description": "Specify an array of objects, containing tuples of Azure Active Directory principalId, a Azure roleDefinitionId, and an optional principalIdDisplayName. The roleDefinition specified is granted to the principalId in the provider's Active Directory and the principalIdDisplayName is visible to customers."
}
},
"resourceGroups": {
"type": "array",
"metadata": {
"description": "The list of resource groups to delegate. Note: resource groups must already exist in tenant"
}
}
},
"resources": [
{
"type": "Microsoft.ManagedServices/registrationDefinitions",
"apiVersion": "2022-10-01",
"name": "[guid(parameters('mspOfferDescription'))]",
"properties": {
"registrationDefinitionName": "[parameters('mspOfferName')]",
"description": "[parameters('mspOfferDescription')]",
"managedByTenantId": "[parameters('managedByTenantId')]",
"authorizations": "[parameters('authorizations')]"
}
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2024-11-01",
"name": "[concat('rgAssignment-', parameters('resourceGroups')[copyIndex()])]",
"resourceGroup": "[parameters('resourceGroups')[copyIndex()]]",
"copy": {
"name": "deploymentCopy",
"count": "[length(parameters('resourceGroups'))]"
},
"dependsOn": [
"[resourceId('Microsoft.ManagedServices/registrationDefinitions/', parameters('managedByTenantId'))]"
],
"properties": {
"mode": "Incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"resources": [
{
"type": "Microsoft.ManagedServices/registrationAssignments",
"apiVersion": "2022-10-01",
"name": "[guid(parameters('resourceGroups')[copyIndex()])]",
"properties": {
"registrationDefinitionId": "[resourceId('Microsoft.ManagedServices/registrationDefinitions/', parameters('managedByTenantId'))]"
}
}
]
}
}
}
],
"outputs": {
"mspOfferName": {
"type": "string",
"value": "[concat('Managed by', ' ', parameters('mspOfferName'))]"
},
"authorizations": {
"type": "array",
"value": "[parameters('authorizations')]"
}
}
}
Kundenseitiges Setup
Der Kunde kann nun das “Offer” des Service Providers im Azure Portal unter Azure Lighthouse > Service providers mit einen Klick auf “Add offer” > “Add via Template” hinzufügen. Im Schritt “Custom deployment” (vgl. Abb. 1) muss der Kunde unter “Edit parameters” die gewünschten Ressourcengruppen hinzufügen, auf die der Service Provider Zugriff haben soll (siehe unten) und das Deployment schließlich mit “Create” starten.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
// ...
"resourceGroups": {
"value": [
"SomeResourceGroup",
"AnotherResourceGroup",
"YetAnotherResourceGroup"
]
}
}
}
Abbildung 1: Lighthouse Custom Template deployment
Lighthouse in Aktion
Nach dem “deployment” des Lighthouse ARM template im Tenant des Kunden kann dieser die offers und delegations im Azure Portal unter Azure Lighthouse > Service Providers sehen:
Abbildung 2: Lighthouse Service providers
Der Service Provider kann den bzw. die Kunden und dessen delegations ebenfalls im Azure Portal unter Azure Lighthouse > My Customers anzeigen:
Abbildung 3: Lighthouse Customers
Die Mitarbeiter:innen des Service Providers können auf die delegierten Ressourcen des Kunden nun mit allen Tools (Portal, CLI, PowerShell) mit den ihnen zugewiesenen Rollen zugreifen. Im Beispiel kann die Benutzerin “AdeleV” als Mitglied der SOC-Sicherheitsgruppen die delegierten Ressourcengruppen des Kunden sehen:
adelev [ ~ ]$ az ad signed-in-user show -o table
DisplayName GivenName Mail PreferredLanguage Surname
------------- ----------- ---------------------------- ------------------- ---------
Adele Vance Adele adele.vance@dev.soltari.at en Vance
adelev [ ~ ]$ az group list -o table
Name Location Status
----------------------- ---------- ---------
SomeResourceGroup westeurope Succeeded
AnotherResourceGroup westeurope Succeeded
YetAnotherResourceGroup westeurope Succeeded
Quellen und weiterführende Links
- Konzepte
- How-to und Anleitungen
- Service Provider: View and manage customers and delegates resources in the Azure portal
- Customer: View and manage service providers
- YouTube