Azure のロール ベース アクセス制御(RBAC)には、特定の条件下でロールの割り当て管理を他者に委任する機能があります。
今回は、この「条件付き委任」について分析し、検証してみます。
本記事は GitHub Copilot を活用して作成しています。
登壇資料はこちらです
YonaYona Azure をゆるっと学ぶ会 - connpass
想定される読者
- Azure RBAC の基本的な知識がある方
- Azure 環境での権限管理に課題を感じている方
- 論理的な権限制御に興味がある方
- Azure ABAC(Attribute-Based Access Control)に関心がある方
RBAC 条件付き委任とは
従来の RBAC の課題
従来の RBAC では、権限の委任は「全か無か」の世界でした。
例えば、「ユーザー アクセス管理者」ロールを付与すると、そのスコープ内で すべての ロール割り当てを管理できてしまいます。
---
title: 従来の RBAC における権限委任
---
graph TD
Admin[管理者] -->|ユーザー アクセス管理者ロールを付与| Delegate[委任先ユーザー]
Delegate -->|"`すべてのロールを
割り当て可能`"| User1[ユーザー]
Delegate -->|"`すべてのロールを
割り当て可能`"| User2[グループ]
Delegate -->|"`すべてのロールを
割り当て可能`"| User3[サービス プリンシパル]
classDef admin fill:#ff6b6b,color:#fff,stroke:none
classDef delegate fill:#4ecdc4,color:#fff,stroke:none
classDef user fill:#45b7d1,color:#fff,stroke:none
class Admin admin
class Delegate delegate
class User1,User2,User3 user
条件付き委任の登場
Azure ABAC を活用した条件付き委任では、特定の条件を満たす場合のみ ロール割り当てを許可できます。
---
title: 条件付き委任における権限制御
---
graph TD
Admin[管理者] -->|条件付きユーザー アクセス管理者| Delegate[委任先ユーザー]
Delegate -->|条件チェック| Condition{条件評価}
Condition -->|条件を満たす| Allow[ロール割り当て許可]
Condition -->|条件を満たさない| Deny[ロール割り当て拒否]
Allow --> User1["`特定のユーザー/グループ/
サービス プリンシパルのみ`"]
Allow --> Role1[特定のロールのみ]
classDef admin fill:#ff6b6b,color:#fff,stroke:none
classDef delegate fill:#4ecdc4,color:#fff,stroke:none
classDef condition fill:#ffa726,color:#fff,stroke:none
classDef allow fill:#66bb6a,color:#fff,stroke:none
classDef deny fill:#ef5350,color:#fff,stroke:none
classDef target fill:#45b7d1,color:#fff,stroke:none
class Admin admin
class Delegate delegate
class Condition condition
class Allow allow
class Deny deny
class User1,Role1 target
条件式の Deep Dive
基本的な条件演算子
Azure ABAC ではいくつかの演算子を組み合わせて複雑な条件を構築できます。
条件の論理構造
条件付き委任の論理構造は以下のように表現します:
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
これはユーザーが操作を行ったときに評価されます
ではこの条件式がどのように動作するのかを見ていきます
<action>
ではないアクションを実行するとき、!(ActionMatches)
が true になり、全体も true になる。
(
(
!(ActionMatches{'<action>'}) <-- ここが true になる
)
OR
(
<attribute> <operator> <value>
)
)
<action>
を実行するとき、!(ActionMatches)
が false になり、<attribute> <operator> <value>
次第で全体が true になるか決まる
(
(
!(ActionMatches{'<action>'}) <-- ここが false になる
)
OR <-- or なので 下記次第で全体が true になる
(
<attribute> <operator> <value> <-- ここ次第で全体が true/false が決まる
)
)
では、「共同作成者 (b24988ac-6180-42a0-ab88-20f7382dd24c) または閲覧者 (acdd72a7-3385-48ef-bd42-f606fba81ae7) ロールのみ付与できる」というシナリオを想定してみます
条件式は下記になります
具体的な条件式の例:
(
(
!(ActionMatches{'Microsoft.Authorization/roleAssignments/write'})
)
OR
(
@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {b24988ac-6180-42a0-ab88-20f7382dd24c, acdd72a7-3385-48ef-bd42-f606fba81ae7}
)
)
AND
(
(
!(ActionMatches{'Microsoft.Authorization/roleAssignments/delete'})
)
OR
(
@Resource[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {b24988ac-6180-42a0-ab88-20f7382dd24c, acdd72a7-3385-48ef-bd42-f606fba81ae7}
)
)
ここで出てきている ForAnyOfAnyValues
というのは左側の値と右側の値を比較し真偽を返す演算子です
@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {b24988ac-6180-42a0-ab88-20f7382dd24c, acdd72a7-3385-48ef-bd42-f606fba81ae7}
においては、操作対象ロールの GUID が b24988ac-6180-42a0-ab88-20f7382dd24c または acdd72a7-3385-48ef-bd42-f606fba81ae7 であれば true になります
このように付与できるロールに制限をかけることができます
「条件を満たす操作だけを許可する」と想像すると
(ActionMatches{’<attribute> <operator> <value>
が真であれば true。それ以外は false としたくなります。
なぜ わざわざ否定から入っているのでしょうか
ベン図などで整理してみるとわかるのですが、<action>
ではないアクションを実行するときもちゃんと true になるように考慮すると、確認してきたような論理式になります
ぱっと見だとわかりずらいですが、色々と考慮されているんだなーと思いました
ざっくり手順
- 前提条件の確認
- 条件付きロールの割り当て
- 動作検証
という流れで検証してみます
1. 前提条件の確認
条件付き委任を実装する前に、以下を確認します:
- 必要な権限(所有者またはユーザー アクセス管理者)を持っている
- 委任先ユーザーに与える条件が決まっている
- 割り当て可能プリンシパル:ユーザー
- 割り当て可能ロール:閲覧者
2. 条件付きロール割り当ての作成
Azure Portal を使用して条件付きロール割り当てを作成します。
- Azure Portal で対象のスコープ(サブスクリプション、リソース グループなど)に移動
- 「アクセス制御 (IAM)」を選択
- 「追加」→「ロールの割り当ての追加」をクリック
- [Role Based Access Control Administrator] を選択
- 委任先ユーザーを選択
- 「条件」タブで [選択されたプリンシパルへの選択されたロールの割り当てのみをユーザーに許可する (より少ない特権) ] > [ロールとプリンシパルの選択] を選択

- [ロールとプリンシパルのタイプの制約] を選択

- ロールの選択で「閲覧者」を選択し、プリンシパルのタイプで「ユーザー」を選択

- 割り当てをクリックして完了
条件つきロール割り当ては Microsoft.Authorization/roleAssignments/write
を含む任意のロールで利用できます。
組み込みロールでいえば「所有者」や「ユーザー アクセス管理者」などが該当します。
しかし、これらは高権限です。
例えば「所有者」はリソースの操作もできます
「ユーザーアクセス管理者」はユーザーアクセスだけかと思いきや Microsoft.Authorization/*
の権限を持っています
管理とガバナンスに対する Azure のアクセス許可 - Azure RBAC | Microsoft Learn に記載がありますが実はリソース ロックやポリシーの操作などもできてしまいます
一方で「ロール ベースのアクセス制御の管理者」は Microsoft.Authorization/roleAssignments/write
と Microsoft.Authorization/roleAssignments/delete
程度の権限しか与えられておらず余計なことができないようになっています。
そのため、条件付きロール割り当てを利用する場合は「ロール ベースのアクセス制御の管理者」を利用することをお勧めします
5. 検証とテスト
作成した条件付き委任が正しく動作するかテストします。
想定されている動作は下記のとおりです
テストシナリオ1: 条件を満たすケース
---
title: 条件を満たすロール割り当てテスト
---
sequenceDiagram
participant Admin as 管理者
participant Delegate as 委任先ユーザー
participant Target as 対象ユーザー
participant Azure as Azure RBAC
Admin->>Delegate: 条件付き権限を委任
Delegate->>Azure: 閲覧者 ロール割り当て要求
Azure->>Azure: 条件評価(プリンシパルのタイプ=ユーザー, ロール=閲覧者)
Azure->>Azure: ✅ 条件を満たす
Azure->>Target: 閲覧者 ロール割り当て成功
Azure-->>Delegate: 割り当て完了通知
テストシナリオ2: 条件を満たさないケース
---
title: 条件を満たさないロール割り当てテスト
---
sequenceDiagram
participant Admin as 管理者
participant Delegate as 委任先ユーザー
participant Target as 対象ユーザー
participant Azure as Azure RBAC
Admin->>Delegate: 条件付き権限を委任
Delegate-->>Azure: 閲覧者ロール以外は選択できない
実際に Azure Portal から操作してみます
画像のとおり、閲覧者しか選択できないようになっています
割り当て先の選択でも、わかりずらいですが、ユーザーしか選択できないようになっています
無事に条件付きで委任できることが確認できました
まとめ
Azure RBAC の条件付き委任は、従来の「全か無か」の権限管理から脱却し、より柔軟で安全な権限制御を実現します。
主なメリット:
- ✅ 細かい粒度での権限制御
- ✅ セキュリティリスクの軽減
- ✅ 管理者の負荷軽減
- ✅ 監査証跡の向上
実装のポイント:
- 論理的な条件設計
- 段階的なテストとvalidation
- 継続的な監査とレビュー