Azure CLI を使って Azure RBAC のロール定義を一覧で出力する
はじめに
この記事では、Azure CLI
を使用して Azure RBAC のロール定義を一覧形式でファイル出力する方法について記載しています。
Azure RBAC の組み込みロール定義については、こちらの Microsoft Docs のページで紹介がされています。ただし、正直、毎回こちらのページにアクセスするのも面倒なので、ローカル PC に自分の管理している Azure RBAC のロール定義情報を一覧でファイル出力しておき、いつでもサクッと確認したいと思うことは誰でも思うでしょう(いや思うはず)。
そこで、この記事では、Azure CLI を使用して Azure RBAC のロール定義情報を一覧で取得し、取得した情報を外部ファイルに出力する方法について調べた結果を記事に残しています。
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 のロール定義を一覧で確認したいという方は こちらを参照してください。
実行環境準備
Azure RBAC のロール定義一覧を取得するための、Azure CLI 環境を用意します。
ホスト OS に直接、Azure CLI をインストールするという方は、こちらを参照してください。
今回、私は Docker コンテナー上に作成した Azure CLI 環境を使用して、以降の手順を実施しています。
ホスト OS を汚したくないという方や Docker コンテナー上で Azure CLI を実行したい方は、以前私が公開したこちらの記事内容を参考に、コンテナー環境を作成してください。
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 のロール定義情報が出力されているはずです。
{
"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 のロール定義を一覧で出力する
際に関連するコマンド情報、およびそのオプションについて解説します。
az role
今回実行した Azure CLI のコマンド az role
は、Azure Active Directory とサービスプリンシパルを使用して、アクセス制御のユーザーロールを管理 する際に使用するコマンドです。(Azure RBAC 触るなら覚えましょう)
さまざまなことをこの az role
コマンドを使用して実行することができます。
az role
の後ろに、assignment
あるいは definition
を追加して、ロールの割り当て/定義を管理していくことになります。
assignment
が ロール割り当ての管理 、definition
が ロール定義の管理 です。(まあここは英単語からしてイメージがつくと思います)
また assignment
や definition
の後ろに、create
や list
、delete
コマンド実行でやりたい内容の動詞句的な英単語を追加することになります。
今回は、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"
}
]
スコープの形式についての詳細は、こちらを参照してください。
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 の内容を参照してください。
query
Azure CLI では、--query
引数を使用して、コマンドの実行結果に対して JMESPath クエリを実行し、出力結果を加工することができます。
JMESPath
とは、 CLI の出力結果からデータを選択して変更できるようにする JSON 用のクエリ言語 のことです。詳細については、こちらを参照してください。
また、Microsoft Docs でも、こちらのページで触れられていますので、気になる方は参照されてください。
Azure RBAC ロールの定義について
--query
パラメーター内で指定していた '[].{assignableScopes:assignableScopes, description:description, id:id, name:name, permissions:permissions, roleName:roleName, roleType:roleType}'
は、既にお分かりの方もいらっしゃると思いますが、コマンドの出力結果から、結果として表示する要素(項目)を指定しているものでした。
この各要素は、Azure RBAC のロール定義の各プロパティになります。
今回は特に触れませんでしたが、今後、Azure RBAC を触るにあたっては理解が必須の内容ですので、まだ知らないという方は、こちらのページで Azure RBAC のロール定義について学習すると良いと思います。
まとめ
今回は、Azure CLI を使用して Azure RBAC のロール定義を一覧形式でファイル出力する方法について解説しました。
Azure Active Directory を使用してアプリケーションなどの認証を統合したり、ユーザーごとに Azure サービスの利用権限や管理権限を制御したい時などには、サービスプリンシパルを利用していくことになると思います。その際に、社内のコンプライアンスやセキュリティ要件に Azure 既定の組み込みロールでは対応できるのかどうか、正直わからないということもあるでしょう。
また、サービスプリンシパルを活用してさまざまな Azure RBAC ロールを作成したはいいものの、現在、どんなロールが存在しているのか全体を把握できていないといった事例もあるかもしれません。
Azure ポータルから確認するのも有りかもしれませんが、こういった時はファイルに内容を落としておくと、後々いろいろと楽だったりします。
Azure RBAC について学習/調査する場合は、ぜひ 1 度は az role definition list
コマンドを実行してみてください。
Discussion