💻

Azure CLI を使って Azure RBAC のロール定義を一覧で出力する

2021/04/19に公開

はじめに

この記事では、Azure CLI を使用して Azure RBAC のロール定義を一覧形式でファイル出力する方法について記載しています。
Azure RBAC の組み込みロール定義については、こちらの Microsoft Docs のページで紹介がされています。ただし、正直、毎回こちらのページにアクセスするのも面倒なので、ローカル PC に自分の管理している Azure RBAC のロール定義情報を一覧でファイル出力しておき、いつでもサクッと確認したいと思うことは誰でも思うでしょう(いや思うはず)。
そこで、この記事では、Azure CLI を使用して Azure RBAC のロール定義情報を一覧で取得し、取得した情報を外部ファイルに出力する方法について調べた結果を記事に残しています。

https://docs.microsoft.com/ja-jp/azure/role-based-access-control/role-definitions-list#azure-cli

Azure RBAC のロールを一覧表示する方法

Azure RBAC には、100 を超える組み込みロール (Microsoft Azure 側で既定で用意されているロール) が存在します。
また、この組み込みロールに加えて、カスタムロールとよばれる定義を自分で作成したロールも Azure RBAC に含めることができます。
組み込みロール、およびカスタムロールを含めた Azure RBAC のロール情報は、以下の環境を使用して、一覧で確認することができます。

  • Azure ポータル
  • Azure PowerShell
  • Azure CLI
  • REST API

今回は、Azure CLI を使った方法について記載しています。Azure ポータルや Azure PowerShell など、他の環境で Azure RBAC のロール定義を一覧で確認したいという方は こちらを参照してください。

https://docs.microsoft.com/ja-jp/azure/role-based-access-control/role-definitions-list

実行環境準備

Azure RBAC のロール定義一覧を取得するための、Azure CLI 環境を用意します。
ホスト OS に直接、Azure CLI をインストールするという方は、こちらを参照してください。

https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli

今回、私は Docker コンテナー上に作成した Azure CLI 環境を使用して、以降の手順を実施しています。
ホスト OS を汚したくないという方や Docker コンテナー上で Azure CLI を実行したい方は、以前私が公開したこちらの記事内容を参考に、コンテナー環境を作成してください。

https://zenn.dev/ymasaoka/articles/get-started-with-azurecli-docker

Azure RBAC ロール定義一覧の出力コマンド

Azure CLI で az login コマンドを実行し、Azure にサインインした後、以下のコマンドを実行するだけで Azure RBAC ロール定義の一覧を出力できます。
今回の例では、JSON 形式のフォーマットにて、ロール定義を一覧出力してみます。

az role definition list --query '[].{assignableScopes:assignableScopes, description:description, id:id, name:name, permissions:permissions, roleName:roleName, roleType:roleType}' > list_roll_definition_rbac.json

上記コマンドの場合、コマンド実行後、list_roll_definition_rbac.json という JSON ファイルが出力され、ファイル内に以下のような Azure RBAC のロール定義情報が出力されているはずです。

list_roll_definition_rbac.json
{
  "assignableScopes": [
    "/"
  ],
  "description": "acr push",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/8311e382-0749-4cb8-b61a-304f252e45ec",
  "name": "8311e382-0749-4cb8-b61a-304f252e45ec",
  "permissions": [
    {
      "actions": [
        "Microsoft.ContainerRegistry/registries/pull/read",
        "Microsoft.ContainerRegistry/registries/push/write"
      ],
      "dataActions": [],
      "notActions": [],
      "notDataActions": []
    }
  ],
  "roleName": "AcrPush",
  "roleType": "BuiltInRole"
}

これで、コマンド実行時における最新の Azure RBAC ロール定義情報を簡単にサクッと調べたり、他の用途で活用したりすることができます。

コマンド解説

ここからは、実行した Azure CLI のコマンドについて、オプションなどを含め、解説をしていきます。
コマンドリファレンスは Microsoft Docs 上でも(もちろん)公開されていますので、公式の情報を確認されたい方はこちらを参照ください。

この記事では、Azure RBAC のロール定義を一覧で出力する際に関連するコマンド情報、およびそのオプションについて解説します。

https://docs.microsoft.com/ja-jp/cli/azure/role?view=azure-cli-latest

az role

今回実行した Azure CLI のコマンド az role は、Azure Active Directory とサービスプリンシパルを使用して、アクセス制御のユーザーロールを管理 する際に使用するコマンドです。(Azure RBAC 触るなら覚えましょう)

さまざまなことをこの az role コマンドを使用して実行することができます。
az role の後ろに、assignment あるいは definition を追加して、ロールの割り当て/定義を管理していくことになります。
assignmentロール割り当ての管理definitionロール定義の管理 です。(まあここは英単語からしてイメージがつくと思います)
また assignmentdefinition の後ろに、createlistdelete コマンド実行でやりたい内容の動詞句的な英単語を追加することになります。

今回は、Azure RBAC のロール定義情報の一覧を確認したいという目的だったので、実行したコマンドは az role definition list となるわけです。
以下に、az role のコマンド情報を記載しておきますので、気になる方は他のコマンドも確認してみてください。

コマンド 説明
az role assignment create ユーザー、グループ、またはサービス プリンシパルに対して、新しいロール割り当てを作成
az role assignment delete ロールの割り当てを削除
az role assignment list ロールの割り当てを一覧表示
az role assignment list-changelogs ロールの割り当ての changelogs を一覧表示
az role assignment update ユーザー、グループ、またはサービスプリンシパルに対する既存のロールの割り当てを更新
az role definition create カスタムロールの定義を作成
az role definition delete ロールの定義を削除
az role definition list ロールの定義を一覧表示
az role definition update ロールの定義を更新

Parameters

今回使用した az role definition list コマンドは、このコマンドの後ろに以下の パラメーター を追加することができます。
パラメーターを追加することで、一覧出力される内容の絞り込み条件指定などを行うことが可能になります。

残念ながら、今回のコマンド実行では az role definition list コマンドに対応するパラメータの指定はないですが、今後のために覚えておくといいと思います。
なお、パラメーターはコマンドによって必須のもの、省略可能なものがありますが、今回の az role definition list コマンドの場合はパラメーターは全て省略可能なものになります。

ちなみに、パラメーターを含めた az role definition list コマンドの構文は以下の通りです。

az role definition list [--custom-role-only {false, true}]
                        [--name {Azure RBAC definition name}]
                        [--query-examples {Keyword}]
                        [--resource-group {Resource group name}]
                        [--scope {scope}]
                        [--subscription {Subscription ID or name}]

custom-role-only

az role definition list出力結果をカスタムロールのみに絞り込むかどうかを指定します。
true を指定した場合、実行結果には Azure RBAC のカスタムロールの定義のみが出力されるようになります。

az role definition list --custom-role-only true
出力結果(例)
[
  {
    "assignableScopes": [
      "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    ],
    "description": "Perform VM actions and read storage and network information.",
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "permissions": [
      {
        "actions": [
          "Microsoft.Compute/*/read",
          "Microsoft.Compute/virtualMachines/start/action",
          "Microsoft.Compute/virtualMachines/restart/action",
          "Microsoft.Network/*/read",
          "Microsoft.Storage/*/read",
          "Microsoft.Authorization/*/read",
          "Microsoft.Resources/subscriptions/resourceGroups/read",
          "Microsoft.Resources/subscriptions/resourceGroups/resources/read",
          "Microsoft.Insights/alertRules/*",
          "Microsoft.Support/*"
        ],
        "dataActions": [
          "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/*"
        ],
        "notActions": [],
        "notDataActions": [
          "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write"
        ]
      }
    ],
    "roleName": "Contoso On-call",
    "roleType": "CustomRole",
    "type": "Microsoft.Authorization/roleDefinitions"
  }
]

name

az role definition list出力結果を指定したロール定義の名前で絞り込みます。
ただし、1 点注意しなければならないのは、絞り込む際に指定する名前はロール名ではなく ID を使用しなければならない という点です。
というのも、人間が分かりやすいように命名している名前は roleName プロパティに保存されており、name プロパティとは異なる要素になっているため、このパラメーターでは指定できないのです。
ここがかなり残念ポイントであるため、今後の改善に期待したいところです。

az role definition list --name "8311e382-0749-4cb8-b61a-304f252e45ec"

または

az role definition list -n "8311e382-0749-4cb8-b61a-304f252e45ec"
出力結果(例)
[
  {
    "assignableScopes": [
      "/"
    ],
    "description": "acr push",
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/8311e382-0749-4cb8-b61a-304f252e45ec",
    "name": "8311e382-0749-4cb8-b61a-304f252e45ec",
    "permissions": [
      {
        "actions": [
          "Microsoft.ContainerRegistry/registries/pull/read",
          "Microsoft.ContainerRegistry/registries/push/write"
        ],
        "dataActions": [],
        "notActions": [],
        "notDataActions": []
      }
    ],
    "roleName": "AcrPush",
    "roleType": "BuiltInRole",
    "type": "Microsoft.Authorization/roleDefinitions"
  }
]

query-examples

キーワードを入力することで、実際に --query パラメーターを使用して出力結果をクエリする際に使用できる JMESPath 文字列を提案してくれます。
(要するに、クエリ構文を使ってコマンド出力の内容を調整する際に使える、要素指定や条件指定の構文を提案してくれる、ということです)

例えば、キーワードとして role とした際に、--query パラメーター内で指定できる関連内容を知りたい場合に下記のようなコマンドを実行すると、キーワードに合致する出力結果を返してくれます。

az role definition list --query-examples "role"
出力結果(例)
Query string                                             Help
-------------------------------------------------------  ---------------------------------------------------
[].roleType                                              Show the value of roleType field.
[?roleType=='CustomRole']                                Show the resources that satisfy the condition.
[?contains(@.roleType, 'something')==\`true\`].roleType  Show the roleType field that contains given string.
[].roleName                                              Show the value of roleName field.
[?roleName=='Contoso On-call']                           Show the resources that satisfy the condition.
[?contains(@.roleName, 'something')==\`true\`].roleName  Show the roleName field that contains given string.

resource-group

ここでは大きく触れませんが、Azure RBAC のロールは、さまざまなスコープでロールを割り当て/定義することができるようになっています。

このパラメーターを指定することで、リソースグループ名を使ってコマンドの出力結果をリソース グループのレベルでロールが定義されているもののみを対象にすることができます。

az role definition list --resource-group "my-sample-rg"

または

az role definition list -g "my-sample-rg"
出力結果(例)
[
  {
    "assignableScopes": [
      "/"
    ],
    "description": "Lets you perform detect, verify, identify, group, and find similar operations on Face API. This role does not allow create or delete operations, which makes it well suited for endpoints that only need inferencing capabilities, following 'least privilege' best practices.",
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/9894cab4-e18a-44aa-828b-cb588cd6f2d7",
    "name": "9894cab4-e18a-44aa-828b-cb588cd6f2d7",
    "permissions": [
      {
        "actions": [],
        "dataActions": [
          "Microsoft.CognitiveServices/accounts/Face/detect/action",
          "Microsoft.CognitiveServices/accounts/Face/verify/action",
          "Microsoft.CognitiveServices/accounts/Face/identify/action",
          "Microsoft.CognitiveServices/accounts/Face/group/action",
          "Microsoft.CognitiveServices/accounts/Face/findsimilars/action"
        ],
        "notActions": [],
        "notDataActions": []
      }
    ],
    "roleName": "Cognitive Services Face Recognizer",
    "roleType": "BuiltInRole",
    "type": "Microsoft.Authorization/roleDefinitions"
  }
]

scope

先述の --resource-group はリソース グループというスコープ固定でしたが、こちらでは、Azure RBAC ロール定義の対象スコープを任意で指定して絞り込みを行うことができます。
ただし、--resource-group パラメーターの時とは異なり、このパラメーターを使用する場合は スラッシュ(/) 文字で区切られた一連の識別子で構成される階層構造でスコープを指定する必要があります。

az role definition list --scope "/providers/Microsoft.Management/managementGroups/marketing-group"
出力結果(例)
[
  {
    "assignableScopes": [
      "/"
    ],
    "description": "The Microsoft.ProjectBabylon data source administrator can manage data sources and data scans. This role is in preview and subject to change.",
    "id": "/providers/Microsoft.Authorization/roleDefinitions/05b7651b-dc44-475e-b74d-df3db49fae0f",
    "name": "05b7651b-dc44-475e-b74d-df3db49fae0f",
    "permissions": [
      {
        "actions": [
          "Microsoft.ProjectBabylon/accounts/read"
        ],
        "dataActions": [
          "Microsoft.ProjectBabylon/accounts/scan/read",
          "Microsoft.ProjectBabylon/accounts/scan/write"
        ],
        "notActions": [],
        "notDataActions": []
      }
    ],
    "roleName": "Project Babylon Data Source Administrator",
    "roleType": "BuiltInRole",
    "type": "Microsoft.Authorization/roleDefinitions"
  }
]

スコープの形式についての詳細は、こちらを参照してください。

https://docs.microsoft.com/ja-jp/azure/role-based-access-control/scope-overview#scope-format

subscription

先述の --resource-group と同様で、Azure RBAC ロール定義のスコープ対象をサブスクリプション固定で絞り込みを行うことができます。
指定する内容は、サブスクリプション ID または サブスクリプション名 のどちらかで OK です。

az role definition list --subscription "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

または

az role definition list --subscription "Pay-As-You-Go-1"
出力結果(例)
[
  {
    "assignableScopes": [
      "/"
    ],
    "description": "Full access to Azure Web PubSub Service REST APIs",
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/providers/Microsoft.Authorization/roleDefinitions/12cf5a90-567b-43ae-8102-96cf46c7d9b4",
    "name": "12cf5a90-567b-43ae-8102-96cf46c7d9b4",
    "permissions": [
      {
        "actions": [],
        "dataActions": [
          "Microsoft.SignalRService/WebPubSub/clientConnection/read",
          "Microsoft.SignalRService/WebPubSub/clientConnection/send/action",
          "Microsoft.SignalRService/WebPubSub/clientConnection/write",
          "Microsoft.SignalRService/WebPubSub/group/read",
          "Microsoft.SignalRService/WebPubSub/group/send/action",
          "Microsoft.SignalRService/WebPubSub/group/write",
          "Microsoft.SignalRService/WebPubSub/hub/send/action",
          "Microsoft.SignalRService/WebPubSub/user/read",
          "Microsoft.SignalRService/WebPubSub/user/send/action"
        ],
        "notActions": [],
        "notDataActions": []
      }
    ],
    "roleName": "Web PubSub Service Owner (Preview)",
    "roleType": "BuiltInRole",
    "type": "Microsoft.Authorization/roleDefinitions"
  }
]

Global parameters

先程までは、az role definition list コマンドが許容しているパラメーターについて解説していました。
しかし、ここまでお読みいただいてお分かりの方もいらっしゃる通り、--output--query のパラメーターについては解説がありませんでした。

これらのパラメーターは グローバル パラメーター というもので、Azure CLI すべてのコマンド共通で使用できるパラメーター になります。
Azure CLI のグローバル パラメーターは、全部で 6 つあります。

グローバル パラメーター 説明
--debug すべてのデバッグ ログを表示するようにログの詳細レベルを上昇
--help または -h このヘルプ メッセージを表示して終了
--only-show-errors エラーのみを表示し、警告は抑制
--output または -o コマンド実行結果の出力形式を指定
--query コマンドの実行結果に対して JMESPath クエリを実行
--verbose ログの詳細レベルを上昇(詳細なデバック ログを出力する場合は --debug を利用)

この記事では、記事内で登場した --output および --query パラメーターのみ解説します。

output

実行したコマンドの出力結果の形式を指定できます。
通常、出力結果の形式を指定しない場合は、既定で JSON フォーマットで結果が出力されますが、このパラメーターを使用することで、以下 6 つの形式に出力形式を変更することができます。

  • json
  • jsonc
  • yaml
  • table
  • tsv
  • none

各出力形式の詳細については、こちらの Microsoft Docs の内容を参照してください。

https://docs.microsoft.com/ja-jp/cli/azure/format-output-azure-cli

query

Azure CLI では、--query 引数を使用して、コマンドの実行結果に対して JMESPath クエリを実行し、出力結果を加工することができます。
JMESPath とは、 CLI の出力結果からデータを選択して変更できるようにする JSON 用のクエリ言語 のことです。詳細については、こちらを参照してください。

https://jmespath.org/

また、Microsoft Docs でも、こちらのページで触れられていますので、気になる方は参照されてください。

https://docs.microsoft.com/ja-jp/cli/azure/query-azure-cli

Azure RBAC ロールの定義について

--query パラメーター内で指定していた '[].{assignableScopes:assignableScopes, description:description, id:id, name:name, permissions:permissions, roleName:roleName, roleType:roleType}' は、既にお分かりの方もいらっしゃると思いますが、コマンドの出力結果から、結果として表示する要素(項目)を指定しているものでした。

この各要素は、Azure RBAC のロール定義の各プロパティになります。
今回は特に触れませんでしたが、今後、Azure RBAC を触るにあたっては理解が必須の内容ですので、まだ知らないという方は、こちらのページで Azure RBAC のロール定義について学習すると良いと思います。

https://docs.microsoft.com/ja-jp/azure/role-based-access-control/role-definitions

まとめ

今回は、Azure CLI を使用して Azure RBAC のロール定義を一覧形式でファイル出力する方法について解説しました。
Azure Active Directory を使用してアプリケーションなどの認証を統合したり、ユーザーごとに Azure サービスの利用権限や管理権限を制御したい時などには、サービスプリンシパルを利用していくことになると思います。その際に、社内のコンプライアンスやセキュリティ要件に Azure 既定の組み込みロールでは対応できるのかどうか、正直わからないということもあるでしょう。
また、サービスプリンシパルを活用してさまざまな Azure RBAC ロールを作成したはいいものの、現在、どんなロールが存在しているのか全体を把握できていないといった事例もあるかもしれません。

Azure ポータルから確認するのも有りかもしれませんが、こういった時はファイルに内容を落としておくと、後々いろいろと楽だったりします。
Azure RBAC について学習/調査する場合は、ぜひ 1 度は az role definition list コマンドを実行してみてください。

Discussion