-
Notifications
You must be signed in to change notification settings - Fork 0
MS_AzureManagedID
- 戻る
- 仮想アカウント
-
Azure > RBAC
- Azure サービス プリンシパル
- Azure Managed ID
-
Azure サービス プリンシパルをラップする。
- Role Based Access Control (RBAC) のアクセス権を付与するために使用される。
- マネージド・サービス ID (MSI) の新しい名前 → マネージド ID。
-
簡単になると言うが、何が簡単になるのか?
-
仮想アカウント的な動きもする(→ システム割り当てマネージド ID)。
- Windows 認証のような感じになる。
- クライアント&サーバでサポートが無い場合、Key Vault 経由で使用する。
補足(「何が簡単になるのか?」への答え): 原文が自問しているこの点が、
マネージド ID の存在意義そのものである。【サービス プリンシパル(SPN)】 ① Azure AD にアプリを登録する ② シークレット(または証明書)を発行する ③ それをアプリの設定ファイル / Key Vault に置く ← 秘密が生まれる ④ 有効期限が来たら更新する ← 忘れると止まる 【マネージド ID】 ① リソースで「マネージド ID を有効にする」 ② そのプリンシパル ID に RBAC ロールを付ける (以上。秘密が存在しない)つまり**「秘密を持たない」ことが本質**である。
漏洩・ローテーション・失効という 3 つの問題が構造的に消える。
AKSクラスタ作成・操作に必要な権限 で
「SPN 方式は 1 年後に突然壊れる」と述べたのは、まさにこの ④ の話。補足(最新化): 現在の呼称は
Microsoft Entra マネージド ID である。
補足(「仮想アカウント的」という喩えについて): この喩えは的確である。
どちらも「パスワードを管理しなくてよい、リソースに紐づいた ID」であり、
資格情報のライフサイクルをプラットフォームが面倒を見る。
- 仮想アカウント — マシン アカウントの資格情報を使う
- マネージド ID — Azure プラットフォームが証明書を管理・ローテーションする
gMSA がドメイン環境で解いた問題を、
Azure で解いたものと考えるとよい。
紐付け ≒ 関連エンティティの ID 的な。
Azure AD によって生成される ID
-
初期プロビジョニングの間に
- Azure アプリケーション
- Azure サービス プリンシパル
結び付けられる。
- マネージド ID に対するAzure サービス プリンシパルオブジェクトのオブジェクト ID
- Role Based Access Control (RBAC) のアクセス権を付与するために使用される。
補足(2 つの ID の使い分け): 混同しやすいので整理する。
ID 何に使うか クライアント ID(アプリケーション ID) コード側でトークン取得時に「どの ID か」を指定する(ユーザー割り当ての場合に必須) プリンシパル ID(オブジェクト ID) Azure 側で RBAC のロール割り当て先として指定する 「ロールを付けたはずなのに 403 になる」場合、
プリンシパル ID を間違えているか、
ユーザー割り当てなのにクライアント ID を指定していないのが典型。
-
クライアント ID に対する証明書が登録される。
-
クライアントに、access_token を返す。
- クライアントを識別し、
- Azure AD に問い合わせ、
- access_token を返す。
補足(IMDS の実体): IMDS は
169.254.169.254というリンクローカル アドレスで待ち受ける
ローカル エンドポイントで、そのマシンからしかアクセスできない。アプリ ──HTTP──▶ http://169.254.169.254/metadata/identity/oauth2/token │ (プラットフォームが本人確認) ▼ access_token │ ▼ Key Vault / Storage / SQL Database「秘密を持たずに認証できる」のは、
VM の外からは絶対に到達できない経路でトークンを配るためである。
逆に言えば、SSRF 脆弱性でこの URL を叩かれると危険なので、
Web アプリでは外部入力による URL アクセスに注意が要る
(IMDS 側もMetadata: trueヘッダーを必須にして対策している)。SSRF への対策としては、次の 3 点を押さえる。
- IMDS 側の保護として、
Metadata: trueヘッダーの付与が
必須になっている(リダイレクトも不可)- アプリ側で外部から与えられた URL を取得しない設計にする
- マネージド ID に与える RBAC は最小限にする
(盗まれた場合の被害範囲がそのまま権限範囲になる)なお、実装ではこの URL を直接叩く必要はない。
Azure Identity ライブラリ(DefaultAzureCredential)が
環境に応じて自動的に処理する。// ローカル開発では Visual Studio / Azure CLI の資格情報、 // Azure 上ではマネージド ID を自動で使い分ける var client = new SecretClient( new Uri("https://<名前>.vault.azure.net/"), new DefaultAzureCredential());
Azure サービス インスタンス上で直接有効にされる。
-
この ID を有効にすると、Azure によって、
-
そのインスタンスのサブスクリプションの
Azure AD テナントに対し、対応するインスタンスの
「システム割り当てマネージド ID」が作成される。 -
「システム割り当てマネージド ID」が作成されると、
その資格情報がインスタンスにプロビジョニングされる。
-
-
「システム割り当てマネージド ID」のライフ サイクルは、
スタンドアロン Azure リソースとして作成される。
-
作成プロセスで、
使用されているサブスクリプションの Azure AD テナントに、
Azure が「ユーザー割り当てマネージド ID」を作成する。 -
作成された「ユーザー割り当てマネージド ID」は、
1 つまたは複数の Azure サービス インスタンスに割り当てることができる。 -
「ユーザー割り当てマネージド ID」のライフ サイクルは、
Azure サービス インスタンスのライフサイクルとは個別に管理される。
補足(どちらを選ぶか): ライフサイクルの違いが選択基準になる。
システム割り当て ユーザー割り当て ライフサイクル リソースと一蓮托生(消すと消える) 独立(リソースを作り直しても残る) 共有 1 リソース 1 ID 複数リソースで共有可能 ロール割り当て リソース作成のたびに必要 一度付ければ使い回せる 向く場面 単発・小規模 IaC で作り直す構成、スケールアウトする構成 ARM テンプレート や Bicep で環境を作り直す運用では、
システム割り当てだと作り直すたびにロール割り当てが失われる
(新しい ID が生成されるため)。
したがって、エンタープライズでは
ユーザー割り当てを先に作り、そこにロールを付けておく方が扱いやすい。一方、VMSS のようにインスタンスが増減する場合も、
ユーザー割り当てなら 1 つの ID を共有できる。
コチラに併記
- Azure リソースのマネージド ID のドキュメント
https://learn.microsoft.com/ja-jp/entra/identity/managed-identities-azure-resources/
移行メモ(重複ページの統合): 本ページは、同一の元ページが
MS_AzureManagedIdentityとMS_AzureManagedIDの
2 つのファイル名で二重に移行されていたものを統合した結果である。
元ページ名(Azure Managed ID)に合わせて
MS_AzureManagedIDを残し、
MS_AzureManagedIdentity側の固有記述
(仮想アカウント / gMSA との対比、
SSRF 対策の具体策)を取り込んだうえで当該ファイルを削除し、
参照元のリンクを本ページへ張り替えた。
Tags: 移行, セキュリティ, アカウント, クラウド, 認証基盤, Azure, Active Directory
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。