AzureのManaged IdentityでLinux VMから鍵なしにリソースへアクセスする方法|資格情報を置かない認証設計

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのManaged IdentityでLinux VMから鍵なしにリソースへアクセスする方法|資格情報を置かない認証設計
「AzureのLinux VMにアクセスキーを置いているが、キーが漏れたら全リソースが危ない」「cronから定期的にAzureリソースにアクセスするスクリプトを書いたが、認証情報をどこに置けばいいか分からない」——Azureを使い始めたLinuxエンジニアが最初に直面するセキュリティ上の悩みです。

この悩みを根本から解決するのが 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」ロールで最小権限を実現する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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には2種類あります。

システム割り当て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

実行後の出力例(RHEL 9.4 検証機):

{ "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

このIDは後のRBAC設定で --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

Managed Identityを使えば、Linux上の設定ファイルや環境変数から認証情報を完全に排除できます。AzureでのLinuxサーバー構築を体系的に学びたい方はこちらもご覧ください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
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;

Azure CLIがVM内に入っている場合は 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
Managed Identityを導入することで、VM上の設定ファイルや環境変数から認証情報を完全に排除できます。特にKey Vaultとの組み合わせは、シークレット管理の負担を大幅に削減します。Azure上でのLinuxサーバー構築・運用を体系的に身につけたい方は、下記のセミナーも参考にしてください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。