カスタム マシン構成ポリシー定義の作成方法

始める前に、マシン構成の概要に関するページと、マシン構成の修復オプションの詳細を読むことをお勧めします。

重要

Azure 仮想マシンには、マシン構成拡張機能が必要です。 すべてのマシンに対して大規模な拡張を展開するために、次のようなポリシー イニシアティブを割り当ててください: Deploy prerequisites to enable machine configuration policies on virtual machines

マシン構成パッケージを使って構成を行うには、Azure VM ゲスト構成拡張のバージョン 1.26.24 以降、または Arc エージェントのバージョン 1.10.0 以降が必要です。

AuditIfNotExists または DeployIfNotExists を使用するカスタム マシンの構成ポリシー定義は、一般公開 (GA) サポート状態です。

コンプライアンスの監査や Azure または Arc 対応マシンの状態の管理を行う独自のポリシーの作成は、次の手順に従います。

PowerShell 7 と必要な PowerShell モジュールをインストールする

はじめに、マシン構成の作成環境を設定し、お使いの OS で必要なバージョンの PowerShell と GuestConfiguration モジュールをインストールしたことを確認してください。

マシン構成パッケージの成果物を作成して公開する

まだ行っていない場合は、「カスタム コンピューター構成パッケージ成果物を作成する方法」の手順に従って、カスタム コンピューター構成パッケージを作成して発行します。 次に、「マシン構成パッケージの成果物をテストする方法」の手順に従って、開発環境でパッケージを検証します。

注意

この記事のコード例では、$contentUri 変数を参照しています。 パッケージ成果物を作成してテストするための前のチュートリアルと同じ PowerShell セッションを使用している場合、その変数にはパッケージへの URI が既に含まれている可能性があります。

PowerShell セッションで $contentUri 変数がパッケージの URI に設定されていない場合は、変数を設定する必要があります。 この例では、ストレージ アカウントの接続文字列New-AzStorageContext コマンドレットを使用してストレージ コンテキストを作成します。 次に、発行されたパッケージのストレージ BLOB を取得し、そのオブジェクトのプロパティを使用してコンテンツ URI を取得します。

$connectionString = '<storage-account-connection-string>'
$context = New-AzStorageContext -ConnectionString $connectionString
$getParams = @{
    Context   = $context
    Container = '<container-name>'
    Blob      = '<published-package-file-name>'
}
$blob = Get-AzStorageBlob @getParams
$contentUri = $blob.ICloudBlob.Uri.AbsoluteUri

マシン構成に関するポリシー要件

ポリシー定義の metadata セクションには、ゲスト構成の割り当てのプロビジョニングとレポートを自動化するために、マシン構成サービスに関する 2 つのプロパティが含まれている必要があります。 category プロパティは Guest Configuration に設定する必要があり、guestConfiguration という名前のセクションにはマシン構成の割り当てに関する情報を含める必要があります。 このテキストは、New-GuestConfigurationPolicy コマンドレットによって自動的に作成されます。

次の例は New-GuestConfigurationPolicy によって自動的に生成される metadata セクションを示します。

"metadata": {
    "category": "Guest Configuration",
    "guestConfiguration": {
        "name": "test",
        "version": "1.0.0",
        "contentType": "Custom",
        "contentUri": "CUSTOM-URI-HERE",
        "contentHash": "CUSTOM-HASH-VALUE-HERE",
        "configurationParameter": {}
    }
}

定義の効果が DeployIfNotExists に設定されている場合は、then セクションにマシン構成の割り当てに関するデプロイの詳細を含める必要があります。 このテキストは、New-GuestConfigurationPolicy コマンドレットによって自動的に作成されます。

Azure Policy の定義を作成する

マシン構成のカスタム ポリシー パッケージを作成してアップロードした後、マシン構成ポリシーの定義を作成します。 New-GuestConfigurationPolicy コマンドレットは、カスタム ポリシー パッケージを受け取り、ポリシー定義を作成します。

New-GuestConfigurationPolicyPolicyid パラメーターには一意の文字列が必要です。 グローバル一意識別子 (GUID) が必要になります。 新しく定義する場合には、New-GUID コマンドレットを使って新たな GUID を生成してください。 定義を更新する場合は、PolicyId に同じ一意の文字列を使用して、正しい定義が確実に更新されるようにしてください。

New-GuestConfigurationPolicy コマンドレットのパラメーター:

  • PolicyId: GUID。
  • ContentUri: マシン構成コンテンツ パッケージの公開 HTTP(S) URI。
  • DisplayName: ポリシーの表示名。
  • 説明:ポリシーの説明。
  • Parameter: ハッシュ テーブルで提供されるポリシー パラメーター。
  • PolicyVersion: ポリシーのバージョン。
  • パス:ポリシー定義が作成されるターゲット パス。
  • Platform: マシン構成ポリシーとコンテンツ パッケージのターゲット プラットフォーム (Windows または Linux)。
  • Mode: (大文字と小文字を区別: ApplyAndMonitorApplyAndAutoCorrectAudit) ポリシーで構成を監査すべきかデプロイすべきかを選択する。 既定値は、Audit です。
  • Tag は、ポリシー定義に 1 つ以上のタグ フィルターを追加します
  • カテゴリは、ポリシー定義のカテゴリ メタデータ フィールドを設定します

Mode パラメーターについて詳しくは、マシン構成の修復オプションの構成方法に関するページをご覧ください。

規定されたパスで、カスタム構成パッケージを使って監査を行うポリシー定義を作成してください。

$PolicyConfig      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My audit policy'
  Description   = 'My audit policy'
  Path          = './policies/auditIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyConfig

規定されたパスで、カスタム構成パッケージを使って構成を展開するポリシー定義を作成してください:

$PolicyConfig2      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My deployment policy'
  Description   = 'My deployment policy'
  Path          = './policies/deployIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
  Mode          = 'ApplyAndAutoCorrect'
}

New-GuestConfigurationPolicy @PolicyConfig2

コマンドレットの出力では、定義の表示名とポリシー ファイルのパスが含まれるオブジェクトが返されます。 監査ポリシー定義を作成する Definition JSON ファイルは auditIfNotExists.json という名前であり、構成を適用するためのポリシー定義を作成するファイルは deployIfNotExists.json という名前です。

タグを使用したマシン構成ポリシーのフィルター処理

GuestConfiguration モジュールのコマンドレットによって作成されたポリシー定義には、必要に応じてタグ用のフィルターを含めることができます。 New-GuestConfigurationPolicyTag パラメーターでは、個々のタグ エントリを含むハッシュ テーブルの配列がサポートされています。 タグは、ポリシー定義の if セクションに追加されており、ポリシーの割り当てで変更することはできません。

タグをフィルター処理するポリシー定義のスニペットの例を次に示します。

"if": {
  "allOf" : [
    {
      "allOf": [
        {
          "field": "tags.Owner",
          "equals": "BusinessUnit"
        },
        {
          "field": "tags.Role",
          "equals": "Web"
        }
      ]
    },
    {
      // Original machine configuration content
    }
  ]
}

カスタム マシン構成ポリシーの定義でのパラメーターの使用

マシン構成では、実行時に DSC 構成のプロパティをオーバーライドすることができます。 この機能は、パッケージの MOF ファイル内の値を静的と見なす必要がないことを意味します。 オーバーライドする値は Azure Policy を通じて提供されます。DSC 構成の作成方法およびコンパイル方法は変更されません。

マシン構成は、パラメーターに対して次の値の種類をサポートしています。

  • String
  • Boolean
  • 倍精度浮動小数点型
  • Float

New-GuestConfigurationPolicyGet-GuestConfigurationPackageComplianceStatus のコマンドレットには、Parameters という名前のパラメーターが含まれています。 このパラメーターによって、各パラメーターの詳細をすべて含むハッシュ テーブル定義を受け取り、Azure Policy 定義に使用される各ファイルの必要なセクションが作成されます。

次の例では、サービスを監査するためのポリシー定義を作成します。ポリシーの割り当て時に一覧からユーザーが選択します。

# This DSC resource definition...
Service 'UserSelectedNameExample' {
    Name   = 'ParameterValue'
    Ensure = 'Present'
    State  = 'Running'
}

# ...can be converted to a hash table:
$PolicyParameterInfo     = @(
  @{
    # Policy parameter name (mandatory)
    Name                 = 'ServiceName'
    # Policy parameter display name (mandatory)
    DisplayName          = 'windows service name.'
    # Policy parameter description (optional)
    Description          = 'Name of the windows service to be audited.'
    # DSC configuration resource type (mandatory)
    ResourceType         = 'Service'
    # DSC configuration resource id (mandatory)
    ResourceId           = 'UserSelectedNameExample'
    # DSC configuration resource property name (mandatory)
    ResourcePropertyName = 'Name'
    # Policy parameter default value (optional)
    DefaultValue         = 'winrm'
    # Policy parameter allowed values (optional)
    AllowedValues        = @('BDESVC','TermService','wuauserv','winrm')
  })

# ...and then passed into the `New-GuestConfigurationPolicy` cmdlet
$PolicyParam = @{
  PolicyId      = 'My GUID'
  ContentUri    = $contentUri
  DisplayName   = 'Audit Windows Service.'
  Description   = "Audit if a Windows Service isn't enabled on Windows machine."
  Path          = '.\policies\auditIfNotExists.json'
  Parameter     = $PolicyParameterInfo
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyParam

Azure Policy 定義を公開する

最後に、New-AzPolicyDefinition コマンドレットを使用してポリシー定義を発行できます。 次のコマンドを実行すると、マシン構成ポリシーがポリシー センターに発行されます。

New-AzPolicyDefinition コマンドを実行するには、Azure でポリシー定義を作成できるアクセス権が必要です。 特定の承認要件については、Azure Policy の概要に関するページに記載されています。 推奨される組み込みロールは Resource Policy Contributor です。

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\auditIfNotExists.json'

または、このポリシーが "deploy if not exist" (存在しない場合はデプロイする) (DINE) ポリシーの場合は、次のコマンドを使ってください。

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\deployIfNotExists.json'

Azure で作成されるポリシー定義で、定義の割り当てが最後のステップとなります。 ポータルAzure CLI、および Azure PowerShell で定義を割り当てる方法を確認してください。

ポリシーのライフサイクル

ポリシー定義の更新をリリースする場合は、ゲスト構成パッケージと Azure Policy 定義の詳細の両方に対して変更を行います。

Note

マシン構成の割り当ての version プロパティは、Microsoft によって提供されるパッケージに対してのみ効果があります。 カスタム コンテンツのバージョン管理のベスト プラクティスは、ファイル名にバージョンを含めることです。

まず、New-GuestConfigurationPackage を実行するときに、以前のバージョンと異なる一意のパッケージの名前を指定します。 名前には、PackageName_1.0.0 などのバージョン番号を含めることができます。 この例の番号は、パッケージを一意にするためにのみ使用されており、パッケージを他のパッケージよりも新しいまたは古いものとして見なすように指定するものではありません。

次に、以下の各説明に従って、New-GuestConfigurationPolicy コマンドレットで使用するパラメーターを更新します。

  • Version: New-GuestConfigurationPolicy コマンドレットを実行するときは、現在発行されているバージョンより大きいバージョン番号を指定する必要があります。
  • contentUri: New-GuestConfigurationPolicy コマンドレットを実行するときは、パッケージの場所の URI を指定する必要があります。 ファイル名にパッケージのバージョンを含めると、各リリースでこのプロパティの値が変更されます。
  • contentHash: New-GuestConfigurationPolicy コマンドレットで、このプロパティが自動的に更新されます。 New-GuestConfigurationPackage によって作成されるパッケージのハッシュ値です。 このプロパティは、発行する .zip ファイルに対して適切なものである必要があります。 contentUri プロパティのみが更新された場合、拡張機能ではコンテンツ パッケージが拒否されます。

更新されたパッケージをリリースする最も簡単な方法は、この記事で説明されているプロセスを繰り返し、更新されたバージョン番号を指定することです。 このプロセスにより、すべてのプロパティが正しく更新されることが保証されます。

次のステップ