JavaScriptを有効にしてください

RBAC の条件付き委任を深堀り隊

 ·   7 分で読めます  ·   [Kento GitHub Copilot]

Azure のロール ベース アクセス制御(RBAC)には、特定の条件下でロールの割り当て管理を他者に委任する機能があります。
今回は、この「条件付き委任」について分析し、検証してみます。

本記事は GitHub Copilot を活用して作成しています。

本記事の内容をもとに 2025年 8月 21日開催の「YonaYona Azure Club」で登壇します。
登壇資料はこちらです
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>
    )
)

これはユーザーが操作を行ったときに評価されます
ではこの条件式がどのように動作するのかを見ていきます

  1. <action> ではないアクションを実行するとき、!(ActionMatches) が true になり、全体も true になる。
(
    (
        !(ActionMatches{'<action>'}) <-- ここが true になる
    )
    OR
    (
        <attribute> <operator> <value>
    )
)
  1. <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. 条件付きロールの割り当て
  3. 動作検証

という流れで検証してみます

1. 前提条件の確認

条件付き委任を実装する前に、以下を確認します:

  • 必要な権限(所有者またはユーザー アクセス管理者)を持っている
  • 委任先ユーザーに与える条件が決まっている
    • 割り当て可能プリンシパル:ユーザー
    • 割り当て可能ロール:閲覧者

2. 条件付きロール割り当ての作成

Azure Portal を使用して条件付きロール割り当てを作成します。

  1. Azure Portal で対象のスコープ(サブスクリプション、リソース グループなど)に移動
  2. 「アクセス制御 (IAM)」を選択
  3. 「追加」→「ロールの割り当ての追加」をクリック
  4. [Role Based Access Control Administrator] を選択
  5. 委任先ユーザーを選択
  6. 「条件」タブで [選択されたプリンシパルへの選択されたロールの割り当てのみをユーザーに許可する (より少ない特権) ] > [ロールとプリンシパルの選択] を選択
image01
条件タブ:
  1. [ロールとプリンシパルのタイプの制約] を選択
image02
ロールとプリンシパルのタイプの制約:
  1. ロールの選択で「閲覧者」を選択し、プリンシパルのタイプで「ユーザー」を選択
image03
ロールとプリンシパルの選択:
  1. 割り当てをクリックして完了

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 から操作してみます
画像のとおり、閲覧者しか選択できないようになっています

image04
Azure Portal での操作:

割り当て先の選択でも、わかりずらいですが、ユーザーしか選択できないようになっています

image05
割り当て先の選択:

無事に条件付きで委任できることが確認できました

まとめ

Azure RBAC の条件付き委任は、従来の「全か無か」の権限管理から脱却し、より柔軟で安全な権限制御を実現します。

主なメリット:

  • ✅ 細かい粒度での権限制御
  • ✅ セキュリティリスクの軽減
  • ✅ 管理者の負荷軽減
  • ✅ 監査証跡の向上

実装のポイント:

  • 論理的な条件設計
  • 段階的なテストとvalidation
  • 継続的な監査とレビュー

参考

共有

Kento
著者
[Kento GitHub Copilot]
2020年に新卒で IT 企業に入社. インフラエンジニア(主にクラウド)として活動中