Verwenden von Azure Policy zum Erzwingen der Auftragsausführung auf Hybrid Runbook Worker

Wichtig

Der Azure Automation Agent-basierte Benutzer-Hybrid Runbook Worker (Windows und Linux) wird am 31. August 2024 eingestellt und wird nach diesem Datum nicht mehr unterstützt. Sie müssen die Migration vorhandener Agent-basierter Benutzer-Hybrid Runbook Worker zu erweiterungsbasierten Workern vor dem 31. August 2024 abschließen. Darüber hinaus ist ab dem 1. November 2023 das Erstellen neuer Agent-basierter Hybrid Worker nicht mehr möglich. Weitere Informationen

Beim Starten eines Runbooks auf einem Hybrid Runbook Worker wird die Option Ausführen auf verwendet, mit der Sie den Namen einer Hybrid Runbook Worker-Gruppe beim Initiieren aus dem Azure-Portal mit dem Azure PowerShell oder der REST-API angeben können. Wenn eine Gruppe angegeben wird, ruft einer der Worker in dieser Gruppe das Runbook ab und führt es aus. Wenn Ihr Runbook diese Option nicht angibt, führt Azure Automation das Runbook in der Azure-Sandbox aus.

Jeder Benutzer in Ihrer Organisation, der Mitglied des Automation-Auftragsoperator oder höher ist, kann Runbookaufträge erstellen. Zum Verwalten der Runbookausführung für eine Hybrid Runbook Worker-Gruppe in Ihrem Automation-Konto können Sie Azure Policy verwenden. Dies trägt dazu bei, Organisationsstandards zu erzwingen und sicherzustellen, dass Ihre Automatisierungsaufträge von den dafür vorgesehenen Personen gesteuert und verwaltet werden und dass niemand ein Runbook in einer Azure-Sandbox ausführen kann, sondern nur auf Hybrid Runbook Workers.

Eine benutzerdefinierte Azure Policy-Definition ist in diesem Artikel enthalten, um Sie bei der Steuerung dieser Aktivitäten mithilfe der folgenden Automation-REST-API-Vorgänge zu unterstützen. Speziell:

Diese Richtlinie basiert auf der runOn-Eigenschaft. Die Richtlinie überprüft den Wert der Eigenschaft, die den Namen einer vorhandenen Hybrid Runbook Worker-Gruppe enthalten sollte. Wenn der Wert NULL ist, wird er als Erstellungsanforderung für den Auftrag, Auftragszeitplan oder Webhook für die Azure-Sandbox interpretiert, und die Anforderung wird abgelehnt.

Erforderliche Berechtigungen

Sie müssen ein Mitglied der Rolle Besitzer auf Abonnementebene sein, um die Berechtigung für die Azure Policy-Ressourcen zu erhalten.

Erstellen und Zuweisen der Richtliniendefinition

Hier erstellen wir die Richtlinienregel und weisen sie dann entweder einer Verwaltungsgruppe oder einem Abonnement zu und geben optional eine Ressourcengruppe im Abonnement an. Falls Sie mit der Richtliniensprache noch nicht vertraut sind, helfen Ihnen die Informationen zur Strukturierung der Richtliniendefinition weiter, die unter Struktur von Richtliniendefinitionen angegeben sind.

  1. Verwenden Sie den folgenden JSON-Codeausschnitt, um eine JSON-Datei mit dem Namen „AuditAutomationHRWJobExecution.json“ zu erstellen.

     {
       "properties": {
         "displayName": "Enforce job execution on Automation Hybrid Runbook Worker",
         "description": "Enforce job execution on Hybrid Runbook Workers in your Automation account.",
         "mode": "all",
         "parameters": {
           "effectType": {
             "type": "string",
             "defaultValue": "Deny",
             "allowedValues": [
                "Deny",
                "Disabled"
             ],
             "metadata": {
               "displayName": "Effect",
               "description": "Enable or disable execution of the policy"
             }
           }
         },
         "policyRule": {
           "if": {
             "anyOf": [
               {
                 "allOf": [
                   {
                     "field": "type",
                     "equals": "Microsoft.Automation/automationAccounts/jobs"
                   },
                   {
                     "value": "[length(field('Microsoft.Automation/automationAccounts/jobs/runOn'))]",
                     "less": 1
                   }
                 ]
               },
               {
                 "allOf": [
                   {
                     "field": "type",
                     "equals": "Microsoft.Automation/automationAccounts/webhooks"
                   },
                   {
                     "value": "[length(field('Microsoft.Automation/automationAccounts/webhooks/runOn'))]",
                     "less": 1
                   }
                 ]
               },
               {
                 "allOf": [
                   {
                     "field": "type",
                     "equals": "Microsoft.Automation/automationAccounts/jobSchedules"
                   },
                   {
                     "value": "[length(field('Microsoft.Automation/automationAccounts/jobSchedules/runOn'))]",
                     "less": 1
                   }
                 ]
               }
             ]
           },
           "then": {
             "effect": "[parameters('effectType')]"
           }
         }
       }
     }
    
  2. Führen Sie den folgenden Azure PowerShell- oder Azure CLI-Befehl aus, um eine Richtliniendefinition mithilfe der Datei AuditAutomationHRWJobExecution.json zu erstellen.

     az policy definition create --name 'audit-enforce-jobs-on-automation-hybrid-runbook-workers' --display-name 'Audit Enforce Jobs on Automation Hybrid Runbook Workers' --description 'This policy enforces job execution on Automation account user Hybrid Runbook Workers.' --rules 'AuditAutomationHRWJobExecution.json' --mode All
    

    Der Befehl erstellt eine Richtliniendefinition mit dem Namen Audit Enforce Jobs on Automation Hybrid Runbook Workers. Weitere Informationen zu anderen Parametern, die Sie verwenden können, finden Sie unter az policy definition create.

    az policy definition create speichert die Richtliniendefinition standardmäßig im ausgewählten Abonnement des Sitzungskontexts bei Aufruf ohne Speicherortparameter. Um die Definition an einem anderen Speicherort zu speichern, verwenden Sie die folgenden Parameter:

    • subscription zum Speichern in einem anderen Abonnement. Dieser Parameter erfordert einen GUID-Wert für die Abonnement-ID oder einen Zeichenfolgenwert für den Namen des Abonnements.
    • management-group zum Speichern in einer Verwaltungsgruppe. Dies erfordert einen Zeichenfolgenwert.

  1. Nach dem Erstellen der Richtliniendefinition können Sie eine Richtlinienzuweisung erstellen. Führen Sie dazu die folgenden Befehle aus:

    az policy assignment create --name '<name>' --scope '<scope>' --policy '<policy definition ID>'
    

    Der Parameter scope für az policy assignment create kann mit einer Verwaltungsgruppe, einem Abonnement, einer Ressourcengruppe oder einer einzelnen Ressource verwendet werden. Der Parameter verwendet einen vollständigen Ressourcenpfad. Das Muster für scope für die einzelnen Container ist unten aufgeführt. Ersetzen Sie {rName}, {rgName}, {subId} und {mgName} durch Ihre(n) Ressourcennamen, Ressourcengruppennamen, Abonnement-ID bzw. Namen der Verwaltungsgruppe. {rType} wird durch den Ressourcentyp der Ressource ersetzt, z. B. Microsoft.Compute/virtualMachines für eine VM.

    • Ressource: /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • Ressourcengruppe: /subscriptions/{subID}/resourceGroups/{rgName}
    • Abonnement: /subscriptions/{subID}
    • Verwaltungsgruppe: /providers/Microsoft.Management/managementGroups/{mgName}

    Sie können die ID der Azure Policy-Definition abrufen, indem Sie PowerShell mit dem folgenden Befehl verwenden:

    az policy definition show --name 'Audit Enforce Jobs on Automation Hybrid Runbook Workers'
    

    Die ID für die Richtliniendefinition, die Sie erstellt haben, sollte in etwa wie im folgenden Beispiel aussehen:

    "/subscription/<subscriptionId>/providers/Microsoft.Authorization/policyDefinitions/Audit Enforce Jobs on Automation Hybrid Runbook Workers"
    

  1. Melden Sie sich beim Azure-Portal an.

  2. Starten Sie den Azure Policy-Dienst über das Azure-Portal, indem Sie die Option Alle Dienste auswählen und dann nach Policy suchen und die entsprechende Option auswählen.

  3. Wählen Sie links auf der Seite die Option Konformität aus. Suchen Sie dann die von Ihnen erstellte Richtlinienzuweisung.

    Screenshot of Azure Policy dashboard.

Wenn einer der Automation-REST-Vorgänge ohne Verweis auf einen Hybrid Runbook Worker im Anforderungstext ausgeführt wird, wird ein 403-Antwortcode mit einem Fehler zurückgegeben, der dem folgenden Beispiel ähnelt und angibt, dass der Vorgang die Ausführung in einer Azure-Sandbox versucht hat:

{
  "error": {
    "code": "RequestDisallowedByPolicy",
    "target": "Start_VMS",
    "message": "Resource 'Start_VMS' was disallowed by policy. Policy identifiers: '[{\"policyAssignment\":{\"name\":\"Enforce Jobs on Automation Hybrid Runbook Workers\",\"id\":\"/subscriptions/75475e1e-9643-4f3d-859e-055f4c31b458/resourceGroups/MAIC-RG/providers/Microsoft.Authorization/policyAssignments/fd5e2cb3842d4eefbc857917\"},\"policyDefinition\":{\"name\":\"Enforce Jobs on Automation Hybrid Runbook Workers\",\"id\":\"/subscriptions/75475e1e-9643-4f3d-859e-055f4c31b458/providers/Microsoft.Authorization/policyDefinitions/4fdffd35-fd9f-458e-9779-94fe33401bfc\"}}]'.",
    "additionalInfo": [
      {
        "type": "PolicyViolation",
        "info": {
          "policyDefinitionDisplayName": "Enforce Jobs on Automation Hybrid Runbook Workers",
          "evaluationDetails": {
            "evaluatedExpressions": [
              {
                "result": "True",
                "expressionKind": "Field",
                "expression": "type",
                "path": "type",
                "expressionValue": "Microsoft.Automation/automationAccounts/jobs",
                "targetValue": "Microsoft.Automation/automationAccounts/jobs",
                "operator": "Equals"
              },
              {
                "result": "True",
                "expressionKind": "Value",
                "expression": "[length(field('Microsoft.Automation/automationAccounts/jobs/runOn'))]",
                "expressionValue": 0,
                "targetValue": 1,
                "operator": "Less"
              }
            ]
          },
          "policyDefinitionId": "/subscriptions/75475e1e-9643-4f3d-859e-055f4c31b458/providers/Microsoft.Authorization/policyDefinitions/4fdffd35-fd9f-458e-9779-94fe33401bfc",
          "policyDefinitionName": "4fdffd35-fd9f-458e-9779-94fe33401bfc",
          "policyDefinitionEffect": "Deny",
          "policyAssignmentId": "/subscriptions/75475e1e-9643-4f3d-859e-055f4c31b458/resourceGroups/MAIC-RG/providers/Microsoft.Authorization/policyAssignments/fd5e2cb3842d4eefbc857917",
          "policyAssignmentName": "fd5e2cb3842d4eefbc857917",
          "policyAssignmentDisplayName": "Enforce Jobs on Automation Hybrid Runbook Workers",
          "policyAssignmentScope": "/subscriptions/75475e1e-9643-4f3d-859e-055f4c31b458/resourceGroups/MAIC-RG",
          "policyAssignmentParameters": {}
        }
      }
    ]
  }
}

Der versuchte Vorgang wird auch im Aktivitätsprotokoll des Automation-Kontos protokolliert, ähnlich wie im folgenden Beispiel.

Example of Activity log for failed job execution.

Nächste Schritte

Informationen zur Arbeit mit Runbooks finden Sie unter Verwalten eines Runbooks in Azure Automation.