AzureのマネージドIDは、パスワードやシークレットを管理することなく、Azureリソース間で安全に認証するための仕組みです。
Azure FunctionsやApp Serviceだけでなく、Azure VMにもマネージドIDを割り当てることができます。
本記事では、Azure VMのマネージドIDについて、具体的な利用方法や認証の仕組みを解説します。
1. Azure VMのマネージドIDとは?
Azure VMにマネージドIDを割り当てると、VM上で動作するプログラムが、そのIDを使ってAzure StorageやKey Vaultなどにアクセスできます。
例えば、Azure VM上のPythonプログラムからAzure Blob Storageにアクセスするケースです。
- Azure VMにマネージドIDを割り当てる
- マネージドIDに「ストレージ BLOB データ閲覧者」などのRBACロールを割り当てる
- VM上のPythonプログラムがマネージドIDで認証する
- Azure Blob Storageにアクセスする
重要なのは、マネージドIDを利用するのはVM上のプログラムであり、ID自体はAzure VMというリソースに割り当てられているという点です。
なお、マネージドIDには次の2種類があります。
| 種類 | 特徴 |
|---|---|
| システム割り当て | VMに紐づくID。VMを削除するとIDも削除される |
| ユーザー割り当て | 独立して管理するID。複数のVMで共有できる |
2. VM上のプログラムはどのようにマネージドIDを利用する?
Pythonの場合、Azure Identityライブラリを使用して、次のように記述できます。
from azure.identity import ManagedIdentityCredential
credential = ManagedIdentityCredential()
このコードによって、実行環境であるVMのマネージドIDを利用するための認証情報オブジェクトを作成できます。
実際にAzure Storageなどにアクセスする際、Azure SDKがアクセストークンを取得して認証します。
プログラムにパスワードやシークレットを埋め込む必要はありません。
上記はシステム割り当てマネージドIDを利用する基本例です。ユーザー割り当ての場合は、利用するIDをクライアントIDなどで明示的に指定します。クライアントIDを指定する例は次のとおりです(クライアントIDは、ユーザ割り当てのマネージドIDを識別するための識別子(GUID)です。IDを識別するためのIDという感じで非常にわかりにくいですが。。。)
from azure.identity import ManagedIdentityCredential
credential = ManagedIdentityCredential(
client_id="対象IDのクライアントID"
)
クライアントIDは、利用するマネージドIDを選択するための公開識別子であり、パスワードやシークレットではありません。対象のユーザー割り当てマネージドIDを、あらかじめVMに割り当てておく必要があります。
3. 別のVMからマネージドIDを勝手に利用できない?
例えば、次の構成を考えます。
- VM-A:システム割り当てマネージドID「ID-A」を有効化
- VM-B:システム割り当てマネージドID「ID-B」を有効化
両方のVMで同じPythonコード(ManagedIdentityCredential())を実行した場合、VM-AではID-A、VM-BではID-Bが利用されます。
VM-BからIMDS経由で、VM-Aのシステム割り当てマネージドIDのアクセストークンを直接取得することはできません。
これは、Azure Instance Metadata Service(IMDS)という仕組みによって実現されています。
4. IMDSによる認証の仕組み
IMDSは、Azure VMが自身のメタデータやマネージドIDのアクセストークンを取得するためのサービスです。
エンドポイントには、以下のIPアドレスが使用されます。
169.254.169.254
マネージドIDを利用する際の流れは次のとおりです。
- VM上のPythonプログラムがAzure SDKを呼び出す
- Azure SDKがIMDSにアクセストークンを要求する
- AzureがそのVMに割り当てられたマネージドIDに基づいてトークンを取得する
- Pythonプログラムが取得したトークンを使ってAzure Storageなどにアクセスする
ここで重要なのが、IMDSのエンドポイントはVM内部からアクセスする仕組みになっている点です。
VM-AとVM-Bが同じ169.254.169.254にアクセスしても、Azureの基盤側でアクセス元VMが識別され、それぞれのVMに対応した処理が行われます。
したがって、別のVMのIMDSに直接アクセスして、そのVMのマネージドIDのトークンを取得することはできません。
なお、ユーザー割り当てマネージドIDは、Azure側で明示的に複数のVMに割り当てることが可能です。
5. セキュリティ上の注意点
マネージドIDはシークレットを管理する必要がないため便利ですが、注意点もあります。
VM上で動作するプログラムは、原則としてそのVMのマネージドIDを利用できます。
そのため、VMが侵害され、悪意のあるプログラムが実行された場合、マネージドIDの権限が悪用される可能性があります。
また、IMDSからトークンを取得できる範囲と、取得済みのトークンを利用できる範囲は別です。アクセストークンが盗まれた場合、別のVMや環境からでも、有効期限まで悪用される可能性があります。トークンをログなどに出力せず、適切に保護する必要があります。
対策として、マネージドIDには必要最小限のRBAC権限を割り当てることが重要です。
また、マネージドIDによる認証とネットワークアクセス制御は別の仕組みです。必要に応じてストレージアカウントのファイアウォールやプライベートエンドポイントなども設定します。
まとめ
Azure VMのマネージドIDのポイントは次のとおりです。
- マネージドIDはAzure VMというリソースに割り当てられる
- VM上で動作するプログラムが、そのIDを使ってAzureサービスに認証できる
- パスワードやシークレットをプログラムに埋め込む必要がない
- IMDSによって、実行元VMに対応したアクセストークンを取得する
- 他のVMのシステム割り当てマネージドIDのトークンを、IMDS経由で直接取得することはできない
- VMの侵害やトークンの漏えいによってIDを悪用される可能性があるため、最小権限とトークンの保護が重要
マネージドIDは、Azure VMそのものにIDを割り当て、そのVM上のプログラムがIDを安全に利用できるようにする仕組みと理解すると分かりやすいでしょう。

コメント