Utiliser Azure Policy pour forcer l'exécution d'un travail sur un Runbook Worker hybride

Important

Runbook Worker hybride utilisateur basé sur un agent (Windows et Linux) Azure Automation sera mis hors service le 31 août 2024 et ne sera plus pris en charge après cette date. Avant le 31 août 2024, vous devez terminer la migration des Runbooks Workers hybrides utilisateur basés sur un agent vers des workers basés sur des extensions. De plus, à partir du 1er novembre 2023, il ne sera plus possible de créer de nouveaux travailleurs hybrides basés sur des agents. Plus d’informations

Le démarrage d'un runbook sur un Runbook Worker hybride s'effectue à l'aide d'une option Exécuter sur qui vous permet de spécifier le nom d'un groupe Runbook Worker hybride lors d'un lancement à partir du portail Azure, d'Azure PowerShell ou de l'API REST. Quand un groupe est spécifié, l’un des Workers de ce groupe récupère et exécute le runbook. Si votre runbook ne spécifie pas cette option, Azure Automation l'exécute dans le bac à sable Azure.

Toute personne de votre organisation qui dispose du rôle d'Opérateur de travaux Automation ou d'un rôle supérieur peut créer des travaux de runbook. Pour gérer l'exécution d'un runbook en ciblant un groupe Runbook Worker hybride de votre compte Automation, vous pouvez utiliser Azure Policy. Cela permet de faire respecter les normes internes et de s'assurer que les travaux d'automatisation sont contrôlés et gérés par les personnes désignées. Et n'importe qui ne peut pas exécuter un runbook sur un bac à sable Azure ; l'exécution est uniquement possible sur des Runbook Workers hybrides.

Cet article contient une définition Azure Policy personnalisée pour vous aider à contrôler ces activités à l'aide des opérations suivantes de l'API REST Automation. Plus précisément :

Cette stratégie est basée sur la propriété runOn. La stratégie valide la valeur de la propriété, qui doit contenir le nom d'un groupe Runbook Worker hybride existant. Si la valeur est Null, elle est interprétée comme la demande de création du travail, du calendrier des travaux, ou du webhook si elle est destinée au bac à sable Azure, et la demande est refusée.

Autorisations requises

Vous devez être Propriétaire de l'abonnement pour être autorisé à accéder aux ressources Azure Policy.

Créer et attribuer la définition de stratégie

Nous allons ici composer la règle de stratégie, puis l'attribuer à un groupe d'administration ou à un abonnement, après quoi nous pourrons éventuellement spécifier un groupe de ressources dans l'abonnement. Si vous n’êtes pas encore familiarisé avec le langage de stratégie, consultez la structure de définition de stratégie pour savoir comment structurer la définition de stratégie.

  1. Utilisez l'extrait de code JSON suivant pour créer un fichier JSON nommé AuditAutomationHRWJobExecution.json.

     {
       "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. Exécutez la commande Azure PowerShell ou Azure CLI suivante pour créer une définition de stratégie à l'aide du fichier AuditAutomationHRWJobExecution.json.

     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
    

    La commande crée une définition de stratégie nommée Audit Enforce Jobs on Automation Hybrid Runbook Workers. Pour plus d’informations sur les autres paramètres utilisables, consultez az policy definition create.

    Lorsqu’il est appelé sans paramètre d’emplacement, par défaut, az policy definition create enregistre la définition de stratégie dans l’abonnement sélectionné du contexte de sessions. Pour enregistrer la définition dans un autre emplacement, utilisez les paramètres suivants :

    • subscription : enregistrer dans un autre abonnement. Nécessite une valeur GUID pour l’ID d’abonnement ou une valeur chaîne pour le nom de l’abonnement.
    • --management-group : enregistrer dans un groupe d’administration. Une valeur de chaîne est nécessaire.

  1. Après avoir créé votre définition de stratégie, vous pouvez créer une attribution de stratégie en exécutant les commandes suivantes :

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

    Le paramètre Scope sur az policy assignment create peut être défini pour un groupe d’administration, un abonnement, un groupe de ressources ou une seule ressource. Le paramètre utilise un chemin de ressource complet. Pour chaque conteneur, le modèle pour scope est le suivant. Remplacez {rName}, {rgName}, {subId} et {mgName} par le nom de la ressource, le nom du groupe de ressources, l’ID de l’abonnement et le nom du groupe d’administration, respectivement. {rType} est remplacé par le type de la ressource, comme Microsoft.Compute/virtualMachines pour une machine virtuelle.

    • Ressource : /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • Groupe de ressources : /subscriptions/{subID}/resourceGroups/{rgName}
    • Abonnement : /subscriptions/{subID}
    • Groupe d'administration : /providers/Microsoft.Management/managementGroups/{mgName}

    Vous pouvez obtenir l’ID de définition de stratégie Azure à l’aide de PowerShell avec la commande suivante :

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

    L’ID de définition de stratégie pour la définition de stratégie que vous avez créée doit ressembler à ce qui suit :

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

  1. Connectez-vous au portail Azure.

  2. Lancez le service Azure Policy dans le portail Azure en sélectionnant Tous les services, puis en recherchant et en cliquant sur Stratégie.

  3. Sélectionnez Conformité dans la partie gauche de la page. Recherchez ensuite l'attribution de stratégie que vous avez créée.

    Screenshot of Azure Policy dashboard.

Lorsque l'une des opérations REST Automation est exécutée sans référence à un Runbook Worker hybride dans le corps de la demande, un code de réponse 403 est renvoyé avec une erreur semblable à l'exemple suivant pour indiquer que l'opération a tenté de s'exécuter sur un bac à sable Azure :

{
  "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": {}
        }
      }
    ]
  }
}

La tentative d'opération est également enregistrée dans le journal d'activité du compte Automation, comme dans l'exemple suivant.

Example of Activity log for failed job execution.

Étapes suivantes

Pour savoir comment utiliser des runbooks, voir Gérer les runbooks dans Azure Automation.