Sysdig脅威リサーチチーム(TRT)は先日、1件の漏洩したサービスプリンシパル認証情報から攻撃が始まり、翌朝にはテナント全体が乗っ取られるという事案を目撃しました。この攻撃者は、ディレクトリに対するグローバル管理者(GA)権限とすべてのリソースに対するルートレベルのアクセス権という、二つの制御プレーンの完全な支配権をテナントから奪い取りました。数十ものIDに永続化の仕掛けを埋め込み、本来なら彼らを監視しているはずだったテレメトリパイプラインの鍵まで手に入れたのです。
この攻撃を止めること自体は簡単でした。しかし、攻撃の分析は実のところかなり複雑で、最終的には一つの問いに行き着きました。その問いには多くの答えが存在します。
この攻撃の後、いったい誰が、何が、このテナントに実際に触れることができるのか?
Azureにおいて、この問いに単一の答えはありません。答えを見つけるための単一の場所も存在しないのです。権限は少なくとも5つのバラバラなシステムに存在しており、Azureはそれらを統合していません。これらの権限システムは識別子すら共有しておらず、ログもデータモデルも異なります。攻撃者はこれらの間を飛び移っても捕まりません。それはまさに、防御側が一度に複数のシステムを見ることが滅多にないからです。
それでは、一つの認証情報がどのように5つの権限システムすべてを渡り歩いたのか、そしてクラウドIDにおける「単一の管理画面」がなぜ今も概ね理想論にとどまっているのかを見ていきましょう。
発端――一つの認証情報、多くの手
侵入口は地味で、極めてありふれたものでした。漏洩したサービスプリンシパルのクライアントシークレットです。サービスプリンシパルはAzureにおける非人間ID(NHI)であり、アプリやオートメーション、CI/CDパイプラインが認証に使うアカウントです。Sysdig 2026年版クラウドネイティブセキュリティ・利用状況レポートによれば、Azureのサービスプリンシパルのうち38%強がリスクありと見なされています。つまり、長期間有効なシークレットや証明書を保持していたり、過剰な権限を持っていたり、あるいはこうしたIDが地球の裏側からログインしても誰にもプッシュ通知が届かなかったりする、ということです。
この特定のシークレットは、攻撃者に発見されるまで約2週間にわたり露出していました。その間、シークレットは商用VPN、Torの出口ノード、米国・ドイツ・スウェーデン・香港・オランダに点在する小規模ホスティングプロバイダーなど、次々と入れ替わる匿名化インフラから再利用されていました。この出所の多様性そのものが一つの発見です。これは追跡可能な単一の人物の仕業ではなく、何らかの共有プールまたは自動化されたプールに置かれた認証情報が、複数の独立した便乗的な利用者によって拾われ、再利用されていたことを示しています。そのほとんどは偵察活動しか行っていませんでした。ARMを列挙し、Graphを探り、ストレージやKey Vaultを一覧表示する程度です。
そして、あるセッションが偵察をやめ、権限昇格を開始しました。
Sysdig TRTが観測した内容
以下の時刻はすべてUTCです。以下の各操作はすべて成功として返されています。
フェーズ1: ディレクトリの権限昇格(03:27~03:50)
- 03:27 ― オランダのホスティングASNからサービスプリンシパルとして最初の有効なサインインが発生。
- 03:28 ― ロールへのメンバー追加(自分自身)。
- 03:29:57 ― PIMを介さないロールへのメンバー追加(永続) → ディレクトリルートでグローバル管理者に昇格。初回ログインからEntraディレクトリ全体の支配権を得るまで、わずか約2分半でした。(注: サービスプリンシパルがどうやって自分自身にGA権限を付与できたのか? それは、まさにそれを可能にするGraph API権限をすでに保持していたからです。詳細は後述の「第5の面」を参照してください。)
- 03:29~03:50 ― 攻撃者が制御するクライアントシークレットが26個のアプリケーション登録に追加されました(この数字が重要である理由は後述します)。
フェーズ2: リソースプレーンの権限昇格と鍵の収集(04:32~04:37)
- 04:32:37 ―
Microsoft.Authorization/elevateAccess/action→ Azureリソースに対するルートでのユーザーアクセス管理者権限を取得。 - 04:32:44 ― サブスクリプションスコープで
roleAssignments/write(Owner相当のロールを自分自身に割り当て)。 - 04:33 ― 4つのストレージアカウントで
storageAccounts/listKeysを実行。 - 04:33:37~38 ― 両方のEvent Hubネームスペースの
rootmanagesharedaccesskeyに対してlistKeysを実行。これらはまさにテナント自身の監査テレメトリを運んでいるものでした。 - 04:34 ― 3つのKey Vaultで
Microsoft.KeyVault/vaults/accessPolicies/write(自己追加)を実行し、続けて同じVaultに対してroleAssignments/writeを実行。その後、データプレーンでのシークレット読み取りが行われました。
フェーズ3: 永続化と再訪(09:57頃まで)
- その日の朝を通じてアクセスが続きました。埋め込まれたシークレットの一つは、別の出口経路から後に再利用され、バックドアが機能することが確認されています。その後、攻撃者は沈黙しました。
最初のログインからディレクトリ全体、すべてのサブスクリプションリソース、ストレージキー、Event Hubキー、Key Vaultアクセスの掌握に至るまで、攻撃者はある朝のうちに、実働時間にしておよそ1時間の労力しか費やしていません。マルウェアもエクスプロイトもゼロデイも使わず、正規のAzure APIを通じて権限を付与・昇格・収集しただけです。
インシデント発生後、09:57時点で攻撃者が支配しているものすべてを特定するには、少なくとも5つの異なる場所を参照して完全な答えを得る必要があります。しかも、それらのどれも「自分が持っていない部分は他の場所にある」とは教えてくれません。
本当の問題――決して交わらない5つの権限プレーン
プレーン1: Entraディレクトリロール
グローバル管理者(GA)の付与は、Entra ID(旧Azure AD)のディレクトリロール管理内に存在します。これは大半の人が「Azureの権限」として思い浮かべるプレーンです。グローバル管理者、特権ロール管理者、そして人やアプリケーションに割り当てるディレクトリロールがこれに当たります。
インシデント後にこのプレーンだけを確認すると、GA付与を見つけて「その割り当てを削除すればクリーンだ」と結論づけてしまうでしょう。しかしそれは大きな誤りです。攻撃者はすでにこのプレーンを離れ、次のプレーンに移動しているからです。
プレーン2: Azureロールベースアクセス制御(RBAC)
Azure RBACはリソース制御プレーンです。これには、サブスクリプション、リソースグループ、リソースに割り当てるOwner/Contributor/User Access Administratorといったロールが含まれます。これはEntraディレクトリロールとは完全に別のシステムであり、ロール定義もアサインメントストアもスコープモデルも異なります。GAだからといって、デフォルトでサブスクリプションのOwnerになるわけではありません。
プレーン1とプレーン2を橋渡しするのが、(私たちの見解では)Azure全体の中でも最も奇妙で、最も監視の目が行き届いていない操作の一つ、elevateAccessです。
GAはMicrosoft.Authorization/elevateAccess/actionを呼び出すだけで、テナント内のすべてのサブスクリプション(現在および将来のもの)に対して、ルートスコープ(/)でのユーザーアクセス管理者権限を即座に自分自身に付与できます。単一のAPI呼び出しで済むのです。これは「自分自身のサブスクリプションから締め出されてしまった」場合の正規の復旧手段として存在していますが、同時に「ディレクトリを支配する」から「すべてのリソースを支配する」へと渡るための、これ以上ないほどクリーンな方法でもあります。
ここに可視性の落とし穴があります。elevateAccessは期待される場所には表示されません。これは通常のロール割り当てではないため、サブスクリプションのRBACブレードにOwnerとして表示され、見つけて削除できるようなものにはなりません。また、他のリソースプレーンの操作が記録されているエクスポート済みのAzureActivity(Azureリソース)ログにも現れません。elevateAccessはポータルのディレクトリアクティビティログには表示されますが、このログはAzure Activity Log APIを通じてはエクスポートされず、ロール管理カテゴリの下でEntra監査ログに記録されます。
これはまさに断片化の縮図です。2つの権限システムを橋渡しする操作が、そのどちらの「通常の」表示にも現れないのです。
プレーン3: Key Vault
ユーザーは、Entraロールと Azure RBACを監査すれば「権限」を網羅したと思い込みがちです。しかし実際にはそうではありません。一部のリソースは、そのリソース自体に固有の、3つ目の独立した権限モデルを備えているからです。
Key Vaultはその典型的な例です。Vaultは2つのアクセスモードのいずれかを取り得ます。RBAC(Azure RBAC経由、プレーン2)か、アクセスポリシー(Vault自体に保存された権限リストで、プリンシパルにシークレット・キー・証明書に対するget/list/setを付与するもの)です。これらは、同一リソースに対する並列した独立の認可モデルなのです。
Sysdig TRTが観測した事例では、攻撃者はvaults/accessPolicies/writeを使って自分自身を3つのVaultのアクセスポリシーに追加し、さらに同じVaultに対してroleAssignments/writeも実行し、両方のモデルを一度にカバーしていました。つまり、単一のリソースタイプの中でさえ、「誰がこれらのシークレットを読めるのか?」という問いへの答えは、別々に確認しなければならない2つの異なる権限ストアの和集合になっているのです。アクセスポリシーのエントリを見落とせば、「クリーンアップした」つもりでも、RBACブレードには決して表示されないドアが開いたままになります。
プレーン4: ベアラーキーとSAS
これは「単一の管理画面」という発想を完全に破壊するものです。というのも、これはそもそもIDシステムですらないからです。
ストレージアカウント、Event Hubs、Service Bus、Cosmos DBなどは共有キーと共有アクセス署名(SAS)をサポートしています。これらは長大かつ高権限のシークレットであり、それを保持している者は誰でもデータプレーンへのアクセス権を得られます。プリンシパルも、ロール割り当ても、いかなるIAMビュー上のエントリも存在しません。鍵を持っていれば、それだけで認可されているのです。
攻撃者は4つのストレージアカウントと両方のEvent Hubネームスペースに対してlistKeysを呼び出し、データおよびテレメトリ転送に対するベアラー認証情報を持ち去りました。ここでもし利用者が「このストレージアカウントに誰がアクセスできるか」を調べるツールに問い合わせれば、そのツールは自信満々にRBACのロール割り当てを表示し、アカウントは施錠されていると答えるでしょう。ところがその裏では、アカウントキーのコピーが攻撃者の手の内にあり、フル読み書き権限を与えていて、しかもいかなるアクセスレビューにもRBACレポートにもIDグラフにも現れないのです。
共有キーは、いわば権限のロンダリングです。ID(サービスプリンシパル等)に紐づいた権限付与(listKeys――これは権限を要求し、ログにも残ります)を、その後どこにも現れなくなる、IDを持たないベアラーシークレットへと変換してしまうのです。鍵を発行する行為そのものは、アクティビティログ上のその一瞬だけ可視です。しかしその後の使用はすべて匿名になります。もしlistKeys呼び出しが発生したまさにその瞬間を監視していなければ、その結果生じるアクセスは永遠に不可視のままです。
そしてIDを持たないというだけでなく、輪をかけて悪いことに、デフォルトでは記録すらされません。Azureはコントロールプレーンでの付与(listKeys呼び出しはアクティビティログに記録されます)は記録しますが、発行された鍵をデータプレーンで使用する行為――Blobを読む、Event Hubを吸い出す――は、リソースごとのデータプレーン診断を明示的に有効化していない限り記録されません。そしてこの診断は、ストレージ、Event Hubs、その他多くのリソースタイプでデフォルトでは無効です。このインシデントでは、Event Hubネームスペースに診断設定がまったくなかったため、盗まれたルートキーの使用はいかなる痕跡も残さなかったはずです。ストレージアカウントもデータプレーンのログが取られていませんでした。つまりlistKeys呼び出しは、ベアラーキーを見つける最良のチャンスであるだけでなく、標準設定のままでは唯一のチャンスなのです。このコントロールプレーンのイベント一つを見逃せば、それが生み出したアクセスは、IDを持たず、かつ永久に不可視という、二重の盲点になってしまいます。
プレーン5: Graph APIアプリケーション権限
5つ目の権限システムは、そもそも「権限」だとは最も認識されにくいものであり、しかもフェーズ1をそもそも可能にしたのがこれなのです。
漏洩したサービスプリンシパルは、Microsoft Graphアプリケーション権限RoleManagement.ReadWrite.Directoryを保持していました。ポータル上では素っ気なく「すべてのディレクトリRBAC設定の読み取りと書き込み」と説明されています。この単一のアプリケーション権限は、実質的にテナント乗っ取りに等しいものです。このアプリケーションに、誰にでもあらゆるディレクトリロールを割り当てることを許してしまい、自分自身にGAを付与することすら可能にします。03:29に発生したプレーン1でのGA自己付与は、攻撃者がたまたま行き着いた特権ではなく、はるか以前に管理者が同意していたGraph権限の、まさに意図された機能そのものだったのです。Graph APIの権限はそれ自体が独自の面であり、スコープモデルも同意システムもポータル上の場所も別で、上述の他の4つのプレーンのどこにも表示されません。
残酷なのは、通常見に行く場所からはこれが見えないということです。防御担当者ならこう辿るであろう手順で、この一つのアプリを掘り下げてみましょう。
このアプリケーションの「ロールと管理者」ペインは、一見「このアプリは何ができるのか?」に答える場所のように見えますが、信頼できる情報源ではありません。ここに表示されるのはここで割り当て可能なアプリ管理ロール(クラウドアプリケーション管理者)のみで、脚注には、ディレクトリレベルのロールは「ディレクトリレベルでのみ割り当て可能」と説明されています。よく読んでください。もしこのアプリがGAやUser Access Administratorを保持していても、このペインには表示されないのです。最も強力なロールは、アプリ単位のビューからは単純に見えません。逆方向から、つまりディレクトリロールのメンバーシップを確認することを、あらかじめ知っていなければならないのです。
そして、実際に乗っ取りを可能にした機能は、ロールですらありません。もう一つ別のブレードにあります。
これが同じアプリの「APIのアクセス許可」です。そこにあるのはRoleManagement.ReadWrite.Directoryで、管理者の同意を得ており、まったく別のブレード、別のモデル、別の思考カテゴリーに置かれています。このアプリのロールを監査している防御担当者には、何も異常には映りません。乗っ取りの鍵は、ずっと隣のタブに置かれていたのです。
つまり、単一のIDにまで対象を絞り込んで「このアプリ一つで何ができるのか?」という最もシンプルな問いを立てても、答えは互いを参照しないプレーンにまたがって塗りつぶされたままであり、最も危険な機能は、ユーザーが最も開こうとしない場所に潜んでいるのです。この断片化はテナント全体にわたる5つのプレーン間だけの話ではありません。単一のアプリケーションの詳細ページの内部でも再現されているのです。
そしてNHIの氾濫という問題
フェーズ1でさらりと触れた一文に立ち戻りましょう。攻撃者は26個のアプリケーション登録にシークレットを埋め込みました。
これは永続化であり、しかもまさに私たちがここまで説明してきた断片化を前提に設計されたものです。各アプリケーション登録は、独自の認証情報リストと(しばしば忘れ去られた)独自の権限フットプリントを持つ、独立した非人間IDです。GA付与を削除しても、これらには何の影響もありません。漏洩した元のシークレットをローテーションしても同様です。それぞれが、別個の有効な再侵入経路なのです。
そして、「自分のテナント内のすべてのアプリケーション登録上のすべての認証情報」を一覧表示するAzureの単一のビューは存在しません。26個すべてを見つけるには、アプリケーション登録を列挙し、そのpasswordCredentialsを一つずつ調べるか、たまたま監査ログを取得していた場合はそこから再構築するしかありません。永続化の被害範囲そのものが、大半のIDダッシュボードが後回しにしているプレーン(アプリ/SPの認証情報)を力任せに列挙することでしか把握できないのです。
Sysdig 2026年版クラウドネイティブセキュリティ・利用状況レポートによれば、NHIはクラウド環境内で管理されているIDの約97%を占め、最も長期間有効なシークレットを保持しており、権限全体の中で最も計装が行き届いていない領域です。この事案は1つの漏洩したNHIから始まり、26個のバックドア化されたNHIで終わりました。そして、それらを明確に把握するためのツールは、標準では概ね存在していないのが実情です。
これは可視性の問題であり、単なる攻撃者側の問題ではない
攻撃者は身を隠すために特に巧妙なことをしたわけではありません。すべての行動は記録され、正規のAPI呼び出しでした。全体像を組み立てるのが難しかった理由は構造的なものです。「今、誰が、何がアクセス権を持っているのか」を再構築するために、私たちは互いに会話しない5つの異なる面に問い合わせなければなりませんでした。
- Entraディレクトリロール → Entra監査ログ(
AuditLogs) - Azure RBAC + 鍵の収集 → Azureアクティビティログ(
AzureActivity) - Key Vaultのデータプレーンアクセス → リソース診断ログ(
AzureDiagnostics) - NHIの認証情報永続化 → アプリケーション登録の列挙(または監査ログからの再構築)
- Graph APIアプリケーション権限 → 各アプリのAPI権限設定(または
AuditLogs内のAdd app role assignment/同意イベント)
そしてelevateAccess、つまり最も重大な単一のイベントは、あなたを油断させないためかのように、リソースプレーンの権限付与であるにもかかわらずEntraのテーブルに存在しています。
防御担当者がよく抱く次の2つの問いのいずれにも答えてくれる、Azureネイティブの画面は存在しません。
- このプリンシパルが到達できるものすべてを見せてほしい――ディレクトリロール、あらゆるスコープでのRBAC、リソースローカルのポリシー、そして発行済みのベアラーキーを含めて。
- このリソースに到達できるものすべてを見せてほしい――アクセスポリシーのエントリ、RBACの割り当て、そしてそれに紐づいてどこかに漂っているIDを持たない鍵を含めて。
これらの問いは5つのプレーンすべてにまたがっており、そのプレーン間には共有の結合キーがありません。サービスプリンシパルのオブジェクトID、RBAC割り当てのスコープパス、Key Vaultアクセスポリシーのエントリ、ストレージアカウントのキーは、突き合わせる共通点をほとんど持ちません。この断片化はAzureのUIだけの話ではなく、私たちの大半がAzureをどう監視するかにも波及しています。なぜなら、私たちは与えられたプレーンの形状に沿って検知の仕組みを構築してしまうからです。
今回の調査を救った唯一の要素は、地味なものでした。私たちはコントロールプレーンのログを、攻撃者が手を出せない、変更不可能なテナント外のストレージに取得していたのです。攻撃者はテレメトリパイプラインのEvent Hubルートキーを握っており、稼働中のワークスペースを盲目化したり汚染したりすることもできました。しかし恒久保存されたコピーは彼らの被害範囲の外にあったため、全体の連鎖を完全に再構築することができました。証跡の耐久性は、攻撃者が支配するプレーンから独立していなければなりません。これが教訓のゼロ番目であり、このブログ記事が書かれた唯一の理由です。
これにどう対処すべきか
Azureの権限モデル自体を直すことはできませんが、それに驚かされない状態を作ることはできます。具体的には以下の通りです。
1. 5つのプレーンすべてを一つの資産として棚卸しする。 EntraロールとAzure RBACだけをカバーするアクセスレビューは、リソースローカルのポリシー(Key Vaultなど)、ベアラーキー、Graph APIアプリケーション権限を完全に見落としています。これら5つすべてを一つの権限グラフの一部として扱ってください。攻撃者にとってはまさにそうなのですから。
2. NHIをファーストクラスのIDとして扱い、そのGraph権限も含めて監視する。 サービスプリンシパルとその認証情報は、ユーザーアカウントと同等の精査が必要です。すべてのアプリケーション登録のシークレット/証明書を棚卸しし、認証情報の追加にアラートを設定し、長期間有効なシークレットを期限切れにしてください。そして、それらが保持しているGraph APIアプリケーション権限を監査してください。管理者が同意したRoleManagement.ReadWrite.Directory(あるいはAppRoleAssignment.ReadWrite.All、Application.ReadWrite.Allなど)は実質的にテナント乗っ取りに等しく、短く意図的に管理された許可リストに載せるべきものです。これらのいずれかに対する管理者同意の付与そのものが、アラートを設定すべき高シグナルのイベントです。まさにその権限を保持していた漏洩NHIこそが、今回の事案全体の玄関口だったのです。
3. プレーン間の橋渡しを監視する。攻撃者が渡り歩くのはそこであり、可視性が最も薄い場所だからです。 アラートを設定すべき、高シグナルかつ低ノイズなイベントは以下の通りです。
Microsoft.Authorization/elevateAccess/action― 正当な利用はほぼゼロで、Entra→リソースの橋渡しです。発生するたびにアラートを出してください。- 特権的なディレクトリロールの付与(グローバル管理者、特権ロール管理者、User Access Administrator)、特に付与先がサービスプリンシパルである場合。
vaults/accessPolicies/writeとKey VaultのroleAssignments/write、つまりリソースローカルの自己付与。- ストレージ、Event Hubなどでの
listKeys/SAS発行――ID紐づきの権限付与がIDを持たない鍵へと変わる瞬間です。この鍵を見られる唯一のチャンスであり、これを過ぎれば不可視になります。
4. IDを持たないプレーンを干上がらせる。 可能な場所では、ストレージアカウントの共有キーアクセスを無効にし、Entraベース(RBAC)のデータプレーン認証を優先してください。そうすればアクセスは、実際にレビューし取り消すことのできるIDに紐づいたままになります。排除する共有キー一つひとつが、単一の管理画面に戻ってくる行になります。
5. 露出する前にロギングをオンにする。デフォルトではオンになっていません。 Azureのデフォルト設定は、まさに今回の攻撃者が活動した場所であなたを静かに盲目にします。コントロールプレーンは記録されますが、必ずしもクエリやアラートを設定できる場所にルーティングされているとは限りません。データプレーンとGraphプレーンはほぼオフのままです。以下は「あれば良いもの」ではなく、稼働開始前の必須要件として扱ってください。
- アクティビティログとEntraの監査・サインインログをワークスペースにルーティングする。 これらはデフォルトでポータル内に保持されますが、診断設定を作成するまではクエリやアラートの対象にはなりません(サインインログにはEntra P1が必要です)。ここに
elevateAccess、特権ロールの付与、listKeys呼び出しが記録されています。 MicrosoftGraphActivityLogsを有効化する(テナント診断設定、P1)。これはデフォルトでオフになっており、Graphプレーンでの偵察やアプリ登録の改ざんを確認できる唯一の場所です。この事案では、途中からしかログが流れ始めておらず、権限昇格を完全に見逃していました。- ベアラーキーを発行するリソースでデータプレーン診断を有効化する: ストレージ、Event Hubs、Key Vaultです。これらもすべてデフォルトでオフです。これがなければ、盗まれた鍵のあらゆる使用は不可視になります(プレーン4を参照)。今回、実際に得られたデータプレーンのシグナル――Key Vaultのシークレット読み取り――は、そのロギングがポリシーによって明示的に義務付けられていたからこそ存在していたにすぎません。標準設定のままなら、それすら暗闇の中だったでしょう。
6. テレメトリを統合し、プレーンごとではなくIDごとに相関させる。 AuditLogs、AzureActivity、リソース診断ログ、Microsoft Graphアクティビティログは、それぞれが一つの断片を保持しているだけです。価値があるのはそのどれか一つの中にではなく、それらを一つのID中心のタイムラインに縫い合わせることにあります。そうすれば「SPが自分自身にGAを付与 → ルートUAAに昇格 → Ownerを割り当て → 鍵を収集」という流れが、5つの表に散らばった5つの無関係なログ行としてではなく、一つの権限昇格ストーリーとして読み取れるようになります。これはまさに、クラウド検知・対応(CDR)やクラウドインフラ権限管理(CIEM)ツールが埋めようとしているギャップそのものです。Azureが分離したままにしているプレーンをまたぐ権限グラフとイベントストリームを提供するのです。
プレーンをまたいで発火するSysdigの検知
調査を難しくしているこの断片化は、検知を難しくしている原因でもあります。検知レイヤーがすべてのプレーンを一つのストリームとして読み取らない限りは。Sysdigのエージェントレス・クラウド検知は、Entra監査ログとAzureアクティビティログの両方を取り込み、単一のID起点のタイムラインに対してFalcoルールを評価します。この特性こそがすべてなのです。elevateAccessイベント(Entraプレーンに存在)とlistKeysによる鍵収集(Activityプレーンに存在)が、同一のプリンシパルに対する同一のタイムライン上に着地するため、権限昇格は、2つのシステムの2つの無関係なログ行としてではなく、一つのストーリーとして読み取れるようになります。
今回の事案の正確なキルチェーンをたどると、攻撃者の各動きに対して発火するSysdigの検知ルールは以下の通りです。
| 攻撃者の動き | プレーン | Sysdig検知ルール |
|---|---|---|
| SPが自分自身にグローバル管理者を付与 | Entraディレクトリ | Entra Add Member to Administrative Role(ユーザーまたはサービスプリンシパルが管理者ロールに追加された場合に発火) |
| elevateAccess → ルートでのUser Access Administrator | Entra↔RBACの橋渡し | Entra Elevate Access to User Access Administrator at Root † |
| サブスクリプションスコープでのroleAssignments/write | Azure RBAC | Azure Create/Update a Role Assignment |
| storageAccounts/listKeys ×4 | ベアラーキーの発行 | Azure Read the Access Keys for a Storage Account |
| Event Hub listKeys | ベアラーキーの発行 | Azure Read the Keys for an Event Hub Namespace † |
| Key Vault accessPolicies/writeの自己付与 | リソースローカルポリシー | Azure Modify a Key Vault Access Policy † |
| Function App host/listKeys | ベアラーキーの発行 | Azure Read the Host Keys for a Function App † |
最も価値の高いエントリはelevateAccessルール(†)です。この動きこそが今回の乗っ取り全体の要でした。「ディレクトリを支配する」から「すべてのリソースを支配する」へと渡った、まさにその単一の呼び出しであり、それはまさに別のプレーンのログ(Activityではなく、Entra監査)に隠れているものなのです。Entraプレーンでこれを監視すると同時に、Activityプレーンで鍵の収集を監視する検知があれば、2つのプレーンにまたがる攻撃を、一つのアラート可能な連鎖として一つにまとめ直すことができます。これがまさに、ネイティブのコンソールでは得られないプレーン横断の相関分析です。
†印が付いた4つの検知は、今回の事案が露呈させたギャップに直接対応する形で、私たちがSysdigのオープンソースFalcoルールに寄与したものです。プレーン間の橋渡し(elevateAccess)、リソースローカルの自己付与(Key Vaultアクセスポリシー)、そして専用ルールが存在していなかった2つのベアラーキー発行(Event Hubルートキーと Function Appホストキー)です。これらは上述のプレーン2、3、4に正確に対応する盲点を塞ぐものであり、中でもテレメトリパイプライン自身の鍵(Event Hub)の収集は、攻撃者が次にあなたの可視性そのものを狙ってくる手口だけに、最も大声でアラートを出す価値があります。
まとめ
- 「誰がアクセス権を持っているか」はAzureにおいて一発のクエリで答えられる問いではありません。 権限は少なくとも5つのバラバラなシステム――Entraディレクトリロール、Azure RBAC、リソースローカルのアクセスポリシー、IDを持たないベアラーキー、Graph APIアプリケーション権限――に存在しており、これらは識別子を共有せず、異なる場所にログを記録します(あるいは表示されます)。今回の乗っ取り全体を可能にしたのはGraph権限であり、それはアプリ自身のロールペインからは見えません。
- 最も危険な動きは、プレーンをまたぐものです。
elevateAccessは単一の呼び出しでディレクトリとリソースの制御を橋渡しし、影響を与えるのとは反対側のプレーンに記録されます。橋渡しを探してください。 - ベアラーキーは恒久的な盲点です。 盗まれたストレージやEvent Hubの鍵は、それ以降二度とどのIAMビューにも現れないアクセス権を与えます。
listKeys呼び出しこそが、それを見られる唯一の瞬間です。IDベースのデータプレーン認証を優先し、共有キーを無効化してください。 - NHIは柔らかい急所です。 1つの漏洩したサービスプリンシパルが扉を開き、26個のバックドア化されたIDがそれを開けたままにしていました。それらを見つけるには、プレーンごとに認証情報を列挙するしかありません。
- 継ぎ目をまたぐ可視性を構築してください。 監視の仕組みがAzureの権限プレーンの形状に沿ったものであれば、それらの間を渡り歩く攻撃者は、あなたの視界の外に出てしまいます。5つのプレーンすべてにわたってIDで相関させてください。さもなければ、あなたが持っているのは単一の管理画面ではなく、5枚のパネルと多くの希望的観測にすぎません。
- 橋渡しの場所で検知してください。 重要な動きはそれぞれ単独でも高シグナル・低ノイズです。
elevateAccess、特権ロールの付与、Key Vaultアクセスポリシーの自己付与、listKeys。真の効果は、EntraプレーンとActivityプレーンを一つのIDタイムラインとして評価することから生まれます。そうすればプレーンをまたぐ連鎖は、連鎖としてアラートされます。Sysdigのセキュアクラウドルールは、上記の連鎖のすべてのステップをカバーしています。
翻訳元: https://webflow.sysdig.com/blog/no-single-pane-of-glass-anatomy-of-an-azure-permission-takeover



