この悩みを根本から解決するのが Managed Identity(マネージドID) です。VM自体にMicrosoft Entra ID(旧称:Azure AD)のIDを付与することで、VMからAzureリソースへ鍵・パスワード・トークンを一切置かずに認証できます。
この記事では、Managed Identityの仕組みから、システム割り当て・ユーザー割り当ての有効化手順、Key VaultシークレットへのアクセスをVM内から試す実践例まで、RHEL 9.4実機の出力ログを交えながら解説します。
この記事のポイント
・Managed IdentityでVM自体をAzure ADのIDとして扱い、キーなしでリソースへアクセスできる
・az vm identity assignでシステム割り当てIDを有効化し、RBACロールを付与して権限を絞る
・VM内部の169.254.169.254(IMDSエンドポイント)でアクセストークンを自動取得する
・Key VaultはRBACモードで運用し「Key Vault Secrets User」ロールで最小権限を実現する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Managed Identityとは何か:鍵を置かない認証の仕組み
従来のクラウド認証では、Linux VMからAzure Storage・Key Vault・SQL Databaseにアクセスするために、サービスプリンシパルのシークレット(クライアントIDとクライアントシークレット)をVMのファイルに保存するのが一般的でした。しかしこの方式には致命的な弱点があります。・シークレットが漏れると認証情報として悪用される
・シークレットには有効期限があり、定期的なローテーション作業が発生する
・コードにハードコードしてしまいGitリポジトリに混入する事故が起きやすい
Managed Identity(マネージドID)は、VMそのものをMicrosoft Entra IDのプリンシパルとして登録する仕組みです。VMは起動時にAzureの内部メタデータサービス(IMDS:Instance Metadata Service)から自動的にアクセストークンを取得でき、外部の認証情報を一切必要としません。
| 認証方式 | 認証情報の保管場所 | ローテーション | 漏洩リスク |
|---|---|---|---|
| サービスプリンシパル(シークレット) | VMのファイルまたは環境変数 | 手動で定期実施が必要 | 高い |
| サービスプリンシパル(証明書) | VMの証明書ストア | 証明書更新が必要 | 中程度 |
| Managed Identity | なし(Azure基盤が管理) | 不要(自動) | 極めて低い |
・システム割り当てManaged Identity(System-assigned):VMと1対1で紐づく。VMを削除するとIDも自動削除される。1台のVMに固有のIDを持たせたい場合に適している
・ユーザー割り当てManaged Identity(User-assigned):独立したリソースとして作成し、複数のVMやその他のサービスに割り当て可能。「同じロールを複数のVMに持たせたい」場合に適している
システム割り当てManaged IdentityをLinux VMで有効化する
1. 既存のLinux VMにManaged Identityを有効化する
既存のVMにシステム割り当てManaged Identityを付与するにはaz vm identity assign を使います。# リソースグループ名とVM名は自環境に合わせて変更してください az vm identity assign \ --resource-group rg-managed-id-demo \ --name myLinuxVM
{ "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "userAssignedIdentities": {} }
systemAssignedIdentity の値がこのVMに割り当てられたManaged IdentityのオブジェクトID(プリンシパルID)です。後のRBAC設定で使用します。2. VM作成時にManaged Identityを付与する
新規VM作成時にManaged Identityを付与する場合は--assign-identity オプションを使います。az vm create \ --resource-group rg-managed-id-demo \ --name myLinuxVM \ --image RedHat:RHEL:9-lvm-gen2:latest \ --size Standard_B2s \ --admin-username azureuser \ --generate-ssh-keys \ --assign-identity
3. プリンシパルIDを確認する
後の手順でRBAC割り当てに必要なプリンシパルIDを確認します。az vm show \ --resource-group rg-managed-id-demo \ --name myLinuxVM \ --query identity.principalId \ -o tsv
# 出力例(検証機) xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
--assignee に指定します。Azure CLIでManaged Identityを使ってリソースにアクセスする
Managed IdentityはAzureリソースへのアクセス権(RBAC)を付与することで初めて機能します。VMにIDが付いただけでは何にもアクセスできません。1. Storage BlobをManaged Identityから読み取るRBAC設定
例として、ストレージアカウントのBlobをManaged Identityから読み取れるよう設定します。自分のPCのAzure CLIから実行してください。# ストレージアカウントのリソースIDを取得する STORAGE_ID=$(az storage account show \ --resource-group rg-managed-id-demo \ --name mystorageaccount2026 \ --query id -o tsv) # プリンシパルIDを変数に格納する PRINCIPAL_ID=$(az vm show \ --resource-group rg-managed-id-demo \ --name myLinuxVM \ --query identity.principalId -o tsv) # Storage Blob Data ReaderロールをVMのManaged Identityに割り当てる az role assignment create \ --role "Storage Blob Data Reader" \ --assignee $PRINCIPAL_ID \ --scope $STORAGE_ID
2. VM内からIMDSエンドポイントでトークンを取得する
VMにSSHログインした後、IMDS(Instance Metadata Service)エンドポイントにアクセスしてトークンを取得します。IMDSエンドポイントは169.254.169.254 というリンクローカルアドレスで、VM内からのみアクセス可能です。注意:このアドレスはLinuxのルーティングテーブルには通常現れません。Azureハイパーバイザーが自動的に処理するため、ss コマンドやポート確認ツールで探しても見えないのは正常な動作です。
# RHEL 9.4 の検証機内で実行(VMにSSHログイン後) TOKEN=$(curl -s \ 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://storage.azure.com/' \ -H 'Metadata: true' | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") # トークンの先頭50文字を確認する echo $TOKEN | cut -c1-50 # 出力例: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsI...(省略)
3. Azure CLIをManaged Identityで認証する
VM内にAzure CLIがインストールされている場合は、az login --identity でManaged Identityを使った認証が可能です。シークレット入力なしでAzureリソースを操作できます。# VM内のAzure CLIをManaged Identityで認証する az login --identity # 認証後はazコマンドを通常通り実行できる az group list --output table
[ManagedIdentityCredential] Successfully obtained access token Name Location Status -------------------- ----------- --------- rg-managed-id-demo japaneast Succeeded
Azure対応セミナーの詳細を見る >>
ユーザー割り当てManaged Identityの作成と割り当て
システム割り当てはVMと1対1で紐づくため、複数のVMに同じロールを持たせたい場合は都度RBAC設定が必要になります。ユーザー割り当てManaged Identityを使えば、IDを1回作成して複数のVMやサービスに割り当てられます。1. ユーザー割り当てManaged Identityを作成する
az identity create \ --name myUserIdentity \ --resource-group rg-managed-id-demo \ --location japaneast
{ "clientId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "id": "/subscriptions/xxxxxxxx-.../providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserIdentity", "location": "japaneast", "name": "myUserIdentity", "principalId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "resourceGroup": "rg-managed-id-demo", "tenantId": "cccccccc-cccc-cccc-cccc-cccccccccccc", "type": "Microsoft.ManagedIdentity/userAssignedIdentities" }
2. VMにユーザー割り当てManaged Identityを割り当てる
# IDのリソースIDを取得する IDENTITY_ID=$(az identity show \ --name myUserIdentity \ --resource-group rg-managed-id-demo \ --query id -o tsv) # VMに割り当てる az vm identity assign \ --resource-group rg-managed-id-demo \ --name myLinuxVM \ --identities $IDENTITY_ID
3. ユーザー割り当てIDでトークンを取得する際の注意点
VMにシステム割り当てとユーザー割り当ての両方が存在する場合、IMDSへのリクエストでclient_id を指定しないとシステム割り当てIDのトークンが返ります。ユーザー割り当てIDのトークンを明示的に取得するには client_id を指定します。# ユーザー割り当てIDのclientIdを確認する az identity show \ --name myUserIdentity \ --resource-group rg-managed-id-demo \ --query clientId -o tsv # aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa # client_idを指定してトークンを取得する(VM内から実行) curl -s \ "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net/&client_id=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" \ -H "Metadata: true"
Key VaultシークレットをLinux VMから取得する実践例
Managed Identityの最も典型的なユースケースが、Key VaultからシークレットをVM内で取得するパターンです。データベースの接続文字列・外部APIキーをKey Vaultに保管し、VM起動時のシェルスクリプトで取得して使います。1. Key Vaultを作成してシークレットを登録する(自分のPCから実行)
# Key VaultをRBACモードで作成する(--enable-rbac-authorization が重要) az keyvault create \ --name myDemoVault2026 \ --resource-group rg-managed-id-demo \ --location japaneast \ --enable-rbac-authorization true # テスト用シークレットを登録する az keyvault secret set \ --vault-name myDemoVault2026 \ --name "DbConnectionString" \ --value "Server=myserver.database.windows.net;Database=mydb;User Id=myuser;"
2. VMのManaged IdentityにKey Vault Secrets Userロールを付与する(自分のPCから実行)
Key VaultへのRBAC設定は「Key Vault Secrets User」ロールが最小権限です。シークレットの読み取りのみ許可し、書き込み・削除は行えません。本番環境ではVNetを使ったPrivate Endpointの設定を推奨します。Azure Private DNS ゾーンの設定をあわせて行うことで、VMからKey VaultのFQDNをプライベートIPで解決でき、パブリックインターネットを経由しない安全な通信が実現します。
# Key VaultのリソースIDを取得する VAULT_ID=$(az keyvault show \ --name myDemoVault2026 \ --resource-group rg-managed-id-demo \ --query id -o tsv) # VMのプリンシパルIDを取得する PRINCIPAL_ID=$(az vm show \ --resource-group rg-managed-id-demo \ --name myLinuxVM \ --query identity.principalId -o tsv) # Key Vault Secrets UserロールをVMのManaged Identityに付与する az role assignment create \ --role "Key Vault Secrets User" \ --assignee $PRINCIPAL_ID \ --scope $VAULT_ID
3. VM内からシークレットをIMDS経由で取得する
VMにSSHログインして、Key VaultからシークレットをIMDS経由のトークンで取得します。# RHEL 9.4 検証機内で実行(VMにSSHログイン後) # Step 1: Key Vault用のアクセストークンを取得する TOKEN=$(curl -s \ 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net/' \ -H 'Metadata: true' | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])") # Step 2: Key VaultのシークレットをREST APIで取得する curl -s \ "https://myDemoVault2026.vault.azure.net/secrets/DbConnectionString?api-version=7.4" \ -H "Authorization: Bearer $TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin)['value'])"
Server=myserver.database.windows.net;Database=mydb;User Id=myuser;
az login --identity 後に次の方法でも取得できます。az login --identity az keyvault secret show \ --vault-name myDemoVault2026 \ --name DbConnectionString \ --query value -o tsv
Managed Identity使用時のセキュリティ設計ポイント
1. 最小権限の原則を徹底する
RBACロールのスコープはできる限り狭く設定します。・サブスクリプションスコープ:全リソースへのアクセス → 原則禁止
・リソースグループスコープ:同じRG内の全リソースへのアクセス → 必要な場合のみ
・リソーススコープ:特定のKey VaultやStorage Accountのみ → 推奨
2. システム割り当てとユーザー割り当ての使い分け
・システム割り当て:そのVMだけが使う一時的なアクセスに向いている。VMを削除すればIDも消えるためリソース管理がシンプル・ユーザー割り当て:複数のVMや他のサービス(App Service・Azure Functions等)が同じリソースに同じ権限でアクセスする場合に使う。RBAC設定の重複を防げる
3. Key VaultはRBACモードで運用する
Key VaultにはアクセスポリシーモードとRBACモードの2種類があります。現在のMicrosoftの推奨はRBACモード(--enable-rbac-authorization true)です。アクセスポリシーモードはKey Vault単位での管理になり、Azure RBACの一元管理ができません。新規構築の場合は必ずRBACモードを選択してください。4. ロール浸透の待ち時間を考慮する
az role assignment create でロールを付与した直後は、Azure内のRBACキャッシュが更新されるまで数分かかります。即座にアクセスしても403エラーになることがあるため、ロール付与後は2~5分待ってから動作確認してください。よくあるエラーとトラブルシューティング
「curl: (7) Failed to connect to 169.254.169.254」
Managed IdentityがVM上で有効になっていない場合に発生します。# Managed Identityの有効化状態を確認する(自分のPCから実行) az vm show \ --resource-group rg-managed-id-demo \ --name myLinuxVM \ --query identity
null が返る場合は az vm identity assign でManaged Identityを有効化してください。VMの再起動は不要です。「(Forbidden) The vault is not accessible.」
RBACロールが付与されていない、またはロールが浸透するまでの待ち時間が経過していない場合に発生します。# ロールの付与状況を確認する(自分のPCから実行) az role assignment list \ --assignee $PRINCIPAL_ID \ --scope $VAULT_ID \ --output table
az role assignment create を実行してください。表示されているのに403エラーが続く場合は2~5分待ってから再試行してください。「AADSTS700016: Application not found in the directory」
ユーザー割り当てManaged Identityのclient_id の指定が誤っている場合に発生します。az identity show --query clientId で正確な値を確認してください。「ManagedIdentityCredential authentication unavailable」(Azure CLI)
az login --identity 実行時にこのエラーが出る場合、VMにManaged Identityが付与されていないか、Azure CLIのバージョンが古い可能性があります。# Azure CLIのバージョンを確認する az --version # 必要に応じてアップデートする(RHEL / Rocky Linux の場合) sudo dnf update azure-cli
まとめ:資格情報を置かない認証設計の全体像
| やりたいこと | コマンド・手順 |
|---|---|
| システム割り当てManaged Identityを有効化する | az vm identity assign --resource-group <RG> --name <VM名> |
| プリンシパルIDを確認する | az vm show --resource-group <RG> --name <VM名> --query identity.principalId -o tsv |
| RBACロールを付与する | az role assignment create --role "ロール名" --assignee <principalId> --scope <リソースID> |
| IMDSからアクセストークンを取得する | curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=<URI>' -H 'Metadata: true' |
| Azure CLIをManaged Identityで認証する | az login --identity |
| ユーザー割り当てIDを作成する | az identity create --name <名前> --resource-group <RG> |
| ユーザー割り当てIDをVMに割り当てる | az vm identity assign --identities <IDリソースID> --resource-group <RG> --name <VM名> |
| Key VaultシークレットをVM内で取得する | az keyvault secret show --vault-name <Vault名> --name <シークレット名> --query value -o tsv |
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Azure Key Vaultの使い方入門|az keyvaultでLinux VMから秘密情報を安全に参照する手順
- 前のページへ:AzureのVNetとLinux VMをazコマンドで構築する手順|リソースグループ作成からSSH接続まで
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます