Azure Policy を使用して Hybrid Runbook Worker でジョブの実行を適用する

重要

Azure Automation エージェント ベースのユーザー Hybrid Runbook Worker (Windows と Linux) は 2024 年 8 月 31 日に廃止され、その日以降はサポートされません。 2024 年 8 月 31 日より前に、既存のエージェント ベースのユーザー Hybrid Runbook Worker の、拡張機能ベースの Worker への移行を、完了する必要があります。 さらに、2023 年 11 月 1 日からは、新しいエージェント ベースのハイブリッド worker を作成できなくなります。 詳細情報 を参照してください。

Hybrid Runbook Worker で Runbook を起動すると、Azure portal から開始するときに Hybrid Runbook Worker グループの名前を Azure PowerShell または REST API で指定できる Run on オプションが使用されます。 グループを指定すると、そのグループ内の worker の 1 つによって Runbook が取得されて実行されます。 Runbook でこのオプションが指定されていない場合は、Azure Automation によって Azure サンドボックスで Runbook が実行されます。

Automation ジョブ オペレーター以上のメンバーである組織内のすべてのユーザーは、Runbook ジョブを作成できます。 Automation アカウント内の Hybrid Runbook Worker グループをターゲットにした Runbook の実行を管理するには、Azure Policy を使用します。 これは、組織の標準を適用し、指定されたユーザーによってオートメーション ジョブが制御および管理され、Runbook の実行が Azure サンドボックス上ではできず、Hybrid Runbook Worker 上でのみできるようにするのに役立ちます。

この記事には、次の Automation REST API 操作を使用して、これらのアクティビティを制御するのに役立つカスタム Azure Policy 定義が含まれています。 具体的には、次のように使用します。

このポリシーは、runOn プロパティに基づいています。 ポリシーは、プロパティの値を検証します。これには、既存の Hybrid Runbook Worker グループの名前が含まれます。 値が null の場合は、ジョブ、ジョブ スケジュール、または Webhook の作成要求が Azure サンドボックスを対象にすると解釈され、要求は拒否されます。

必要なアクセス許可

Azure Policy リソースへのアクセス許可を得るには、サブスクリプション レベルで所有者ロールのメンバーである必要があります。

ポリシー定義を作成して割り当てる

ここでは、ポリシー ルールを作成し、管理グループまたはサブスクリプションに割り当て、必要に応じてサブスクリプションでリソース グループを指定します。 ポリシー言語に慣れていない場合は、ポリシー定義の構造に関するページでポリシー定義の構成方法を確認してください。

  1. 次の JSON スニペットを使用して、AuditAutomationHRWJobExecution.json という名前の 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. 次の Azure PowerShell または Azure CLI コマンドを実行して、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
    

    このコマンドは、Audit Enforce Jobs on Automation Hybrid Runbook Workers という名前のポリシー定義を作成します。 使用できるその他のパラメーターの詳細については、「az policy definition create」を参照してください。

    場所のパラメーターを指定せずに呼び出す場合、az policy definition create は、既定により、セッション コンテキストの選択されたサブスクリプションにポリシー定義を保存することになります。 定義を別の場所に保存するには、次のパラメーターを使用します。

    • subscription - 別のサブスクリプションに保存します。 サブスクリプション ID の GUID 値、またはサブスクリプション名の string 値を指定する必要があります。
    • management-group - 管理グループに保存します。 string 値が必要です。

  1. ポリシー定義を作成したら、次のコマンドを実行してポリシー割り当てを作成できます。

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

    az policy assignment createscope パラメーターは、管理グループ、サブスクリプション、リソース グループ、または単一のリソースに使用できます。 このパラメーターは完全なリソース パスを使用します。 各コンテナーの scope のパターンは、次のとおりです。 {rName}{rgName}{subId}、および {mgName} を、それぞれリソース名、リソース グループ名、サブスクリプション ID、および管理グループ名と置き換えます。 {rType} は、そのリソースのリソースの種類 (VM の場合は Microsoft.Compute/virtualMachines など) に置き換えられます。

    • リソース - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • リソース グループ - /subscriptions/{subID}/resourceGroups/{rgName}
    • サブスクリプション - /subscriptions/{subID}
    • 管理グループ - /providers/Microsoft.Management/managementGroups/{mgName}

    Azure Policy の定義 ID は、PowerShell で次のコマンドを実行して取得できます。

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

    作成したポリシー定義のポリシー定義 ID は、次の例のようになります。

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

  1. Azure portal にサインインします。

  2. Azure portal で [すべてのサービス] を選択し、 [Policy] を検索して選択することで、Azure Policy サービスを起動します。

  3. ページの左側にある [コンプライアンス] を選択します。 そして、作成したポリシーの割り当てを探します。

    Screenshot of Azure Policy dashboard.

いずれかの Automation REST 操作が、要求本文で Hybrid Runbook Worker を参照せずに実行されると、Azure サンドボックスで操作を実行しようとしたことを示す次の例のようなエラーで、403 応答コードが返されます。

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

試行された操作は、次の例のように、Automation アカウントのアクティビティ ログにも記録されます。

Example of Activity log for failed job execution.

次のステップ

Runbook を操作するには、「Azure Automation で Runbook を管理する」を参照してください。