APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Resource Graph でストレージアカウントに付与された権限一覧を表示する

Azure には Resource Graph というサービスがあります。 このサービス、Azure ではお馴染みの Kusto Query Language (KQL) を使って、Azure リソースの設定内容や変更イベントの確認できるとても便利なものです。

learn.microsoft.com

Azure Resource Graph 自体は数年前に GA されていますが、Azure RBAC は昨年の 2023年10月にサポートされました。

techcommunity.microsoft.com

Azure RBAC のサポートにより、リソースに付与されたロールを Azure Resource Graph から確認できるようになりました。 今回は Azure Resource Graph を使って、ストレージアカウントに直接付与されたロールの一覧を表示してみましょう。

クエリ例

早速ですが、ストレージアカウントに直接付与されたロール一覧を表示するクエリを見てみましょう。 あくまで一例ですので、適宜修正してご利用ください。

(はてなブログは KQL のシンタックスハイライトに対応しておらず少し見づらいですね…)

AuthorizationResources
| where type =~ 'microsoft.authorization/roleassignments'
| extend scope = tolower(tostring(properties['scope']))
| extend principalType = tostring(properties['principalType'])
| extend principalId = tostring(properties['principalId'])
| extend roleDefinitionId = tostring(properties['roleDefinitionId'])
| where scope contains 'microsoft.storage/storageaccounts'
| extend resourceName = trim(@"^.*microsoft\.storage/storageaccounts/", scope)
| join kind=leftouter(
    ResourceContainers
    | where type=~'microsoft.resources/subscriptions'
    | extend subscriptionName = tostring(name)
    | project subscriptionId, subscriptionName
) on $left.subscriptionId == $right.subscriptionId
| join kind=leftouter(
    AuthorizationResources
    | where type =~ 'microsoft.authorization/roledefinitions'
    | extend roleName = tostring(properties['roleName'])
    | extend roleDefinitionId = tostring(id)
    | extend roleType = tostring(properties['type'])
    | project roleDefinitionId, roleName, roleType
) on $left.roleDefinitionId == $right.roleDefinitionId
| project tenantId, subscriptionName, resourceGroup, resourceName, roleName, roleType, principalType, principalId
| order by tenantId, subscriptionName, resourceGroup, resourceName, roleName, roleType, principalType, principalId

こちらのクエリを Azure Resource Graph Explorer で実行すると次のような結果になります。

クエリ実行結果

ストレージアカウントのリソース名は伏せていますが、リソースに対して割り当てられたロールが1行ごとに表示されているのが確認できました。

クエリの内容

このクエリでは2種類のテーブルを結合して結果を出力しています。

  • AuthorizationResources
  • ResourceContainers

AuthorizationResources テーブルには次の Type を含む Azure RBAC に関連した情報が格納されています。

  • microsoft.authorization/classicadministrators
  • microsoft.authorization/roleassignments
  • microsoft.authorization/roledefinitions

今回確認したいのはロールの割り当て状況なので、where type =~ 'microsoft.authorization/roleassignments' でレコードを絞り込んでいます(サンプル2行目)。

AuthorizationResources テーブルの properties 列に含まれる情報から scoperoleDefinitionId などを取得しつつ、ストレージアカウントを示す microsoft.storage/storageaccounts が含まれている scope に絞り込みます。 これにより、ストレージアカウント自体やストレージコンテナーに割り当てられているロールを抽出できます(サンプル7行目)。

リソース名は scope 列に含まれていますが、サブスクリプション ID なども表示されているため trim() でリソース名より前の文字列を削除します(サンプル8行目)。

これだけでもリソースごとのロール一覧を表示できますが、実行結果にはサブスクリプション ID やロール ID しか表示されず、ロール名などの人が認識しやすい情報が入っていません。 そこで、テーブルを結合して必要な情報を取得します。 この辺りは SQL と一緒ですね。

サブスクリプション名は ResourceContainers テーブルに対して where type=~'microsoft.resources/subscriptions' で絞り込むことで抽出できます(サンプル11行目)。

ロール名は AuthorizationResources テーブルの microsoft.authorization/roledefinitions に格納されているため、where type =~ 'microsoft.authorization/roledefinitions' で絞り込みます(サンプル17行目)。

必要な情報は手に入ったので、あとはどのように表示するか project と order で指定します。

注意点

現状、Azure Resource Graph では Microsoft Entra ID の情報は引っ張ってこれないようで、ロールを割り当てられたプリンシパル ID からプリンシパル名を紐づけることができません。

そのため、上記のクエリではどのプリンシパルにロールが割り当てられているかはプリンシパル ID でしか確認できず、詳しいプリンシパルを知りたい場合は別途 ID から検索する必要があります。

おわりに

Azure Resource Graph を使うことでストレージアカウントに付与されたロール一覧を確認できました。

横断的に権限の状況を確認したり、今回は対象外でしたがリソースの更新イベントを検知したりするのに便利なので、ぜひ Azure Resource Graph を使って運用を楽にしていきましょう。


【PR】
私達ACS事業部はAzure・AKSなどのクラウドネイティブ技術を活用した内製化のご支援をしております。

www.ap-com.co.jp

一緒に働いていただける仲間も募集中です!
まだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。
我々の事業部のCultureDeckはコチラ。

www.ap-com.co.jp

本記事の投稿者: 埜下 太一
Azure をメインにインフラ系のご支援を担当しています。
個人ブログ