Ein Azure Lighthouse Demo-Setup mit Codebeispielen.

Azure Lighthouse Demo


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:

{
  "$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:

{
  "$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 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 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 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