特定のユーザを Azure Policy から除外する

azure
Published: 2025-11-23

はじめに

Azure Policy には、特定のリソースをポリシーの対象から除外する仕組みがあります。

Azure Policy 適用除外の構造

スコープとリソースセレクタを利用することで、ポリシーから特定のリソースだけを除外したり、特定のリージョンのリソースだけを除外したりできます。

これまでの除外は、除外で指定できる要素が「操作される対象」だけでした。ですが Ignite 2025 にあわせて Identity Based Exemptions という機能がパブリックプレビューになりました。

Azure Governance @ Ignite 2025

このアップデートによって「操作される側」だけではなく「操作する側」の情報を利用して除外を設定できるようになりました。「利用者にはルールを強制したいけど、管理者は対象外にしたい」というようなシナリオにも対応できるようになります。

設定方法のドキュメントが見当たらなかったので、試行錯誤しつつ実際に試してみました。

設定例

ポータルは対応していなそうなので、Bicep で設定します。以下のようにリソースセレクタの中に除外したいユーザの ID を指定する形です。

targetScope = 'subscription'

resource userexemption 'Microsoft.Authorization/policyExemptions@2024-12-01-preview' = {
  name: 'exemtion-for-admin'
  scope: subscription()
  properties: {
    policyAssignmentId: '/subscriptions/MY-SUB-ID/providers/microsoft.authorization/policyassignments/df03d5f796544aa785091b64'
    exemptionCategory: 'Waiver'
    displayName: 'Exemption for Admin User'
    description: 'This exemption is granted to the admin user for specific policy assignment.'
    expiresOn: '2025-12-31T23:59:59Z'
    resourceSelectors: [
      {
        name: 'Admin User'
        selectors: [
          {
            kind: 'UserPrincipalId'
            in: [
              'cc8d70b0-3ca8-4910-0000-6d2464889fcc'
            ]
          }
        ]
      }
    ]
  }
}

動作確認

まずはサブスクリプションに対して「Allowed locations」のポリシーを割り当てます。対象リージョンは東日本と西日本にします。これらのリージョン以外にリソースをデプロイしようとするとエラーになります。

その後、eastus リージョンに仮想ネットワークを作成するテンプレートをデプロイできるかを Test-AzResourceGroupDeployment コマンドで確認します。利用する Bicep テンプレートは以下の通りです。

resource vnet 'Microsoft.Network/virtualNetworks@2025-01-01' = {
  name: 'myVNet'
  location: 'eastus'
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
  }
}

上記の除外を設定する前は、「Allowded Location」のポリシーによってデプロイが失敗するという結果になりました。

> Test-AzResourceGroupDeployment -ResourceGroupName test1118 -TemplateFile C:\Users\MatsumotoYusuke\source\repos\vnet.bicep

InvalidTemplateDeployment - The template deployment failed because of policy violation. Please see details for more information.
RequestDisallowedByPolicy - Resource 'myVNet' was disallowed by policy. Policy identifiers: '[{"policyAssignment":{"name":"許可されている場所","id":"/subscriptions 
/MY-SUB-ID/providers/Microsoft.Authorization/policyAssignments/df03d5f796544aa785091b64"},"policyDefinition":{"name":"Allowed locations" 
,"id":"/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c","version":"1.0.0"}}]'.

ですが、上記の除外を設定した後だとエラーが出ません。きちんと操作する側の情報を利用して除外できています。

> Test-AzResourceGroupDeployment -ResourceGroupName test1118 -TemplateFile C:\Users\MatsumotoYusuke\source\repos\vnet.bicep     
>

Bicep のインテリセンスで指定できる項目を調べていたところ GroupPrincipalId という項目もありました。設定例は以下の通りです。

targetScope = 'subscription'

resource userexemption 'Microsoft.Authorization/policyExemptions@2024-12-01-preview' = {
  name: 'exemtion-for-admin'
  scope: subscription()
  properties: {
    policyAssignmentId: '/subscriptions/MY-SUB-ID/providers/microsoft.authorization/policyassignments/df03d5f796544aa785091b64'
    exemptionCategory: 'Waiver'
    displayName: 'Exemption for Admin User'
    description: 'This exemption is granted to the admin user for specific policy assignment.'
    expiresOn: '2025-12-31T23:59:59Z'
    resourceSelectors: [
      {
        name: 'Admin User'
        selectors: [
          {
            kind: 'GroupPrincipalId'
            in: [
              '52a59d55-5f17-4778-92a2-6d5852c07676'
            ]
          }
        ]
      }
    ]
  }
}

以下の通り、GroupPrincipalId も思った通りの動きをしました。

# 除外追加前
> Test-AzResourceGroupDeployment -ResourceGroupName test1118 -TemplateFile C:\Users\MatsumotoYusuke\source\repos\vnet.bicep

InvalidTemplateDeployment - The template deployment failed because of policy violation. Please see details for more information.
RequestDisallowedByPolicy - Resource 'myVNet' was disallowed by policy. Policy identifiers: '[{"policyAssignment":{"name":"許可されている場所","id":"/subscriptions 
/MY-SUB-ID/providers/Microsoft.Authorization/policyAssignments/df03d5f796544aa785091b64"},"policyDefinition":{"name":"Allowed locations" 
,"id":"/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c","version":"1.0.0"}}]'.

# 除外追加後
> Test-AzResourceGroupDeployment -ResourceGroupName test1118 -TemplateFile C:\Users\MatsumotoYusuke\source\repos\vnet.bicep
> 

まとめ

パブリックプレビューになった Azure Policy の Identity Based Exemptions を試しました。なかなかの地味 Ignite ですが、よりきめの細かい除外ができるようになるいい感じのアップデートです。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。