仮想マシンのマネージド ID 拡張機能の使用を止めて Azure Instance Metadata Service の使用を開始する方法How to stop using the virtual machine managed identities extension and start using the Azure Instance Metadata Service

マネージド ID の仮想マシン拡張機能Virtual machine extension for managed identities

仮想マシン内のマネージド ID のトークンを要求するために、マネージド ID の仮想マシン拡張機能を使用します。The virtual machine extension for managed identities is used to request tokens for a managed identity within the virtual machine. このワークフローは次のステップで構成されます。The workflow consists of the following steps:

  1. 最初に、リソース内のワークロードがローカル エンドポイント http://localhost/oauth2/token を呼び出し、アクセス トークンを要求します。First, the workload within the resource calls the local endpoint http://localhost/oauth2/token to request an access token.
  2. 仮想マシン拡張機能は、マネージド ID の資格情報を使用して、Azure AD からアクセス トークンを要求します。The virtual machine extension then uses the credentials for the managed identity, to request an access token from Azure AD..
  3. アクセス トークンが呼び出し側に返されます。これは、Azure Key Vault または Azure Storage のような Azure AD 認証をサポートするサービスの認証に使用することができます。The access token is returned to the caller, and can be used to authenticate to services that support Azure AD authentication, like Azure Key Vault or Azure Storage.

次のセクションに示されているいくつかの制限により、マネージド ID の VM 拡張機能は非推奨になりました。その代わりに Azure Instance Metadata Service (IMDS) の同等のエンドポイントを使用します。Due to several limitations outlined in the next section, the managed identity VM extension has been deprecated in favor of using the equivalent endpoint in the Azure Instance Metadata Service (IMDS)

拡張機能のプロビジョニングProvision the extension

マネージド ID を持つように仮想マシンまたは仮想マシン スケール セットを構成する場合、必要に応じて、Set-AzVMExtension コマンドレットで -Type パラメーターを使用して、Azure リソースのマネージド ID VM 拡張機能をプロビジョニングするように選択することもできます。When you configure a virtual machine or virtual machine scale set to have a managed identity, you may optionally choose to provision the managed identities for Azure resources VM extension using the -Type parameter on the Set-AzVMExtension cmdlet. 仮想マシンのタイプに応じて ManagedIdentityExtensionForWindows または ManagedIdentityExtensionForLinux を渡し、-Name パラメーターを使用して名前を付けることができます。You can pass either ManagedIdentityExtensionForWindows or ManagedIdentityExtensionForLinux, depending on the type of virtual machine, and name it using the -Name parameter. -Settings パラメーターは、トークン取得用に OAuth トークン エンドポイントによって使用されるポートを指定します。The -Settings parameter specifies the port used by the OAuth token endpoint for token acquisition:

   $settings = @{ "port" = 50342 }
   Set-AzVMExtension -ResourceGroupName myResourceGroup -Location WestUS -VMName myVM -Name "ManagedIdentityExtensionForWindows" -Type "ManagedIdentityExtensionForWindows" -Publisher "Microsoft.ManagedIdentity" -TypeHandlerVersion "1.0" -Settings $settings 

以下の JSON をテンプレートの resources セクションに追加することで (Linux バージョンの場合、名前と型の要素に ManagedIdentityExtensionForLinux を使用します)、Azure Resource Manager デプロイ テンプレートを使用して、VM 拡張機能をプロビジョニングすることもできます。You can also use the Azure Resource Manager deployment template to provision the VM extension, by adding the following JSON to the resources section to the template (use ManagedIdentityExtensionForLinux for the name and type elements for the Linux version).

```json
{
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "[concat(variables('vmName'),'/ManagedIdentityExtensionForWindows')]",
    "apiVersion": "2018-06-01",
    "location": "[resourceGroup().location]",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
    ],
    "properties": {
        "publisher": "Microsoft.ManagedIdentity",
        "type": "ManagedIdentityExtensionForWindows",
        "typeHandlerVersion": "1.0",
        "autoUpgradeMinorVersion": true,
        "settings": {
            "port": 50342
        }
    }
}
```

仮想マシン スケール セットを使用している場合、Add-AzVmssExtension コマンドレットを使用して、Azure リソースのマネージド ID 仮想マシン スケール セット拡張機能をプロビジョニングすることもできます。If you're working with virtual machine scale sets, you can also provision the managed identities for Azure resources virtual machine scale set extension using the Add-AzVmssExtension cmdlet. 仮想マシン スケール セットのタイプに応じて ManagedIdentityExtensionForWindows または ManagedIdentityExtensionForLinux を渡し、-Name パラメーターを使用して名前を付けることができます。You can pass either ManagedIdentityExtensionForWindows or ManagedIdentityExtensionForLinux, depending on the type of virtual machine scale set, and name it using the -Name parameter. -Settings パラメーターは、トークン取得用に OAuth トークン エンドポイントによって使用されるポートを指定します。The -Settings parameter specifies the port used by the OAuth token endpoint for token acquisition:

$setting = @{ "port" = 50342 }
$vmss = Get-AzVmss
Add-AzVmssExtension -VirtualMachineScaleSet $vmss -Name "ManagedIdentityExtensionForWindows" -Type "ManagedIdentityExtensionForWindows" -Publisher "Microsoft.ManagedIdentity" -TypeHandlerVersion "1.0" -Setting $settings 

Azure Resource Manager デプロイ テンプレートを使用して、仮想マシン スケール セット拡張機能をプロビジョニングするには、以下の JSON をテンプレートの extensionpProfile セクションに追加します (Linux バージョンの場合、名前と型の要素に ManagedIdentityExtensionForLinux を使用します)。To provision the virtual machine scale set extension with the Azure Resource Manager deployment template, add the following JSON to the extensionpProfile section to the template (use ManagedIdentityExtensionForLinux for the name and type elements for the Linux version).

```json
"extensionProfile": {
    "extensions": [
        {
            "name": "ManagedIdentityWindowsExtension",
            "properties": {
                "publisher": "Microsoft.ManagedIdentity",
                "type": "ManagedIdentityExtensionForWindows",
                "typeHandlerVersion": "1.0",
                "autoUpgradeMinorVersion": true,
                "settings": {
                    "port": 50342
                },
                "protectedSettings": {}
            }
        }
```

仮想マシン拡張機能のプロビジョニングは、DNS 検索エラーが原因で失敗することがあります。Provisioning of the virtual machine extension might fail due to DNS lookup failures. この場合、仮想マシンを再起動してからやり直してください。If this happens, restart the virtual machine, and try again.

拡張機能を削除するRemove the extension

この拡張機能を削除するには、Azure CLI または Powershell 用の Remove-AzVMExtension を使用して、仮想マシン スケール セット用の az vm extension delete または az vmss extension delete で、-n ManagedIdentityExtensionForWindows または -n ManagedIdentityExtensionForLinux スイッチを使用します (VM の種類に応じます)。To remove the extension, use -n ManagedIdentityExtensionForWindows or -n ManagedIdentityExtensionForLinux switch (depending on the type of virtual machine) with az vm extension delete, or az vmss extension delete for virtual machine scale sets using Azure CLI, or Remove-AzVMExtension for Powershell:

az vm identity --resource-group myResourceGroup --vm-name myVm -n ManagedIdentityExtensionForWindows
az vmss extension delete -n ManagedIdentityExtensionForWindows -g myResourceGroup -vmss-name myVMSS
Remove-AzVMExtension -ResourceGroupName myResourceGroup -Name "ManagedIdentityExtensionForWindows" -VMName myVM

仮想マシンの拡張機能を使用するトークンの取得Acquire a token using the virtual machine extension

以下は、Azure リソース VM 拡張機能エンドポイントにマネージド ID を使用するサンプル要求です。The following is a sample request using the managed identities for Azure resources VM Extension Endpoint:

GET http://localhost:50342/oauth2/token?resource=https%3A%2F%2Fmanagement.azure.com%2F HTTP/1.1
Metadata: true
要素Element 説明Description
GET HTTP 動詞。エンドポイントからデータを取得する必要があることを示します。The HTTP verb, indicating you want to retrieve data from the endpoint. この例では、OAuth アクセス トークンです。In this case, an OAuth access token.
http://localhost:50342/oauth2/token Azure リソース エンドポイントのマネージド ID (50342 は既定のポートであり、構成可能です)。The managed identities for Azure resources endpoint, where 50342 is the default port and is configurable.
resource クエリ文字列パラメーター。ターゲット リソースのアプリ ID URI です。A query string parameter, indicating the App ID URI of the target resource. 発行されたトークンの aud (audience) 要求にも表示されます。It also appears in the aud (audience) claim of the issued token. この例では、アプリ ID URI が https://management.azure.com/ の Azure Resource Manager にアクセスするためのトークンを要求しています。This example requests a token to access Azure Resource Manager, which has an App ID URI of https://management.azure.com/.
Metadata HTTP 要求ヘッダー フィールド。サーバー側のリクエスト フォージェリ (SSRF) 攻撃に対する軽減策として Azure リソースのマネージド ID に必要です。An HTTP request header field, required by managed identities for Azure resources as a mitigation against Server Side Request Forgery (SSRF) attack. この値は、"true" に設定し、すべて小文字にする必要があります。This value must be set to "true", in all lower case.
object_id (省略可能) クエリの文字列パラメーター。トークン用の管理対象 ID の object_id を示します。(Optional) A query string parameter, indicating the object_id of the managed identity you would like the token for. VM に複数のユーザーが割り当てたマネージド ID がある場合は必須です。Required, if your VM has multiple user-assigned managed identities.
client_id (省略可能) クエリの文字列パラメーター。トークン用の管理対象 ID の client_id を示します。(Optional) A query string parameter, indicating the client_id of the managed identity you would like the token for. VM に複数のユーザーが割り当てたマネージド ID がある場合は必須です。Required, if your VM has multiple user-assigned managed identities.

応答のサンプル:Sample response:

HTTP/1.1 200 OK
Content-Type: application/json
{
  "access_token": "eyJ0eXAi...",
  "refresh_token": "",
  "expires_in": "3599",
  "expires_on": "1506484173",
  "not_before": "1506480273",
  "resource": "https://management.azure.com/",
  "token_type": "Bearer"
}
要素Element 説明Description
access_token 要求されたアクセス トークン。The requested access token. セキュリティで保護された REST API を呼び出すとき、トークンは Authorization 要求ヘッダー フィールドに "ベアラー" トークンとして埋め込まれ、API が呼び出し元を認証できるようにします。When calling a secured REST API, the token is embedded in the Authorization request header field as a "bearer" token, allowing the API to authenticate the caller.
refresh_token Azure リソースのマネージド ID には使用されません。Not used by managed identities for Azure resources.
expires_in アクセス トークンが発行されてから期限切れになるまでの有効継続時間 (秒単位)。The number of seconds the access token continues to be valid, before expiring, from time of issuance. 発行時刻はトークンの iat 要求で確認できます。Time of issuance can be found in the token's iat claim.
expires_on アクセス トークンが期限切れになるまでの期間。The timespan when the access token expires. 日付は "1970-01-01T0:0:0Z UTC" からの秒数として表されます (トークンの exp 要求に対応)。The date is represented as the number of seconds from "1970-01-01T0:0:0Z UTC" (corresponds to the token's exp claim).
not_before アクセス トークンが有効になり、承認されるまでの期間。The timespan when the access token takes effect, and can be accepted. 日付は "1970-01-01T0:0:0Z UTC" からの秒数として表されます (トークンの nbf 要求に対応)。The date is represented as the number of seconds from "1970-01-01T0:0:0Z UTC" (corresponds to the token's nbf claim).
resource アクセス トークンの要求対象リソース。要求の resource クエリ文字列パラメーターと一致します。The resource the access token was requested for, which matches the resource query string parameter of the request.
token_type トークンの種類。つまり "ベアラー" アクセス トークン。リソースが、このトークンのベアラーへのアクセスを提供できることを意味します。The type of token, which is a "Bearer" access token, which means the resource can give access to the bearer of this token.

仮想マシン拡張機能のトラブルシューティングTroubleshoot the virtual machine extension

障害が発生した後に仮想マシン拡張機能が再起動するRestart the virtual machine extension after a failure

Windows と特定のバージョンの Linux で拡張機能が停止した場合は、次のコマンドレットを使用して手動で再起動できます。On Windows and certain versions of Linux, if the extension stops, the following cmdlet may be used to manually restart it:

Set-AzVMExtension -Name <extension name>  -Type <extension Type>  -Location <location> -Publisher Microsoft.ManagedIdentity -VMName <vm name> -ResourceGroupName <resource group name> -ForceRerun <Any string different from any last value used>

各値の説明:Where:

  • Windows の拡張機能の名前と種類: ManagedIdentityExtensionForWindowsExtension name and type for Windows is: ManagedIdentityExtensionForWindows
  • Linux の拡張機能の名前と種類: ManagedIdentityExtensionForLinuxExtension name and type for Linux is: ManagedIdentityExtensionForLinux

Azure リソース拡張機能のマネージド ID のスキーマ エクスポートを試行すると、"自動スクリプト" が失敗する"Automation script" fails when attempting schema export for managed identities for Azure resources extension

仮想マシンで Azure リソースのマネージド ID が有効になっている場合、その仮想マシン またはリソース グループに対して "自動スクリプト" 機能を使用しようとすると、次のエラーが表示されます。When managed identities for Azure resources is enabled on a virtual machine, the following error is shown when attempting to use the “Automation script” feature for the virtual machine, or its resource group:

Azure リソースのマネージド ID の自動スクリプトのエクスポート エラー

現時点では、Azure リソース仮想マシン拡張機能のマネージド ID では、そのスキーマをリソース グループ テンプレートにエクスポートする機能はサポートされていません。The managed identities for Azure resources virtual machine extension does not currently support the ability to export its schema to a resource group template. その結果、生成されたテンプレートには、リソース上で Azure リソースのマネージド ID を有効にする構成パラメーターは表示されません。As a result, the generated template does not show configuration parameters to enable managed identities for Azure resources on the resource. これらのセクションは、テンプレート を使用して Azure 仮想マシン上で Azure リソースのマネージド ID を構成するの例に従って手動で追加できます。These sections can be added manually by following the examples in Configure managed identities for Azure resources on an Azure virtual machine using a templates.

Azure リソース仮想マシン拡張機能のマネージド ID (2019 年 1 月に非推奨になる予定) でスキーマのエクスポート機能が利用可能になると、VM 拡張機能を含むリソース グループのエクスポートの一覧に表示されます。When the schema export functionality becomes available for the managed identities for Azure resources virtual machine extension (planned for deprecation in January 2019), it will be listed in Exporting Resource Groups that contain VM extensions.

仮想マシン拡張機能の制限Limitations of the virtual machine extension

仮想マシン拡張機能の使用に関する重大な制限がいくつかあります。There are several major limitations to using the virtual machine extension.

  • 最も重大な制限は、トークンを要求するために使用する資格情報が仮想マシンに保存されることです。The most serious limitation is the fact that the credentials used to request tokens are stored on the virtual machine. 仮想マシンにうまく侵害できた攻撃者は、資格情報を抜き取るにことができてしまいます。An attacker who successfully breaches the virtual machine can exfiltrate the credentials.
  • さらに、この仮想マシン拡張機能はいくつかの Linux ディストリビューションでサポートされておらず、それらの各ディストリビューションで拡張機能の変更、ビルド、テストを行うには膨大な開発費用がかかります。Furthermore, the virtual machine extension is still unsupported by several Linux distributions, with a huge development cost to modify, build and test the extension on each of those distributions. 現在、次の Linux ディストリビューションのみサポートされています。Currently, only the following Linux distributions are supported:
    • CoreOS StableCoreOS Stable
    • CentOS 7.1CentOS 7.1
    • Red Hat 7.2Red Hat 7.2
    • Ubuntu 15.04Ubuntu 15.04
    • Ubuntu 16.04Ubuntu 16.04
  • 仮想マシン拡張機能をプロビジョニングする必要があるため、マネージド ID を持つ仮想マシンのデプロイを行う際に、パフォーマンスに影響が生じる可能性があります。There is a performance impact to deploying virtual machines with managed identities, as the virtual machine extension also has to be provisioned.
  • 仮想マシン拡張機能がサポートできるユーザー割り当て済みマネージド ID は、仮想マシンごとに 32 個までです。Finally, the virtual machine extension can only support having 32 user-assigned managed identities per virtual machine.

Azure Instance Metadata ServiceAzure Instance Metadata Service

Azure Instance Metadata Service (IMDS) は、実行中の仮想マシン インスタンスに関する情報を提供します。これらの情報を使用して仮想マシンの管理と構成を行うことができる REST エンドポイントです。The Azure Instance Metadata Service (IMDS) is a REST endpoint that provides information about running virtual machine instances that can be used to manage and configure your virtual machines. このエンドポイントは、仮想マシンからのみアクセスすることができる、よく知られているルーティング不可能な IP アドレス (169.254.169.254) で使用できます。The endpoint is available at a well-known non-routable IP address (169.254.169.254) that can be accessed only from within the virtual machine.

Azure IMDS を使用トークンを要求することには、いくつかの利点があります。There are several advantages to using Azure IMDS to request tokens.

  1. サービスを仮想マシンの外部に配置できるため、マネージド ID で使用する資格情報を仮想マシン上で保管せずに済みます。The service is external to the virtual machine, therefore the credentials used by managed identities are no longer present on the virtual machine. 代わりに、Azure 仮想マシンのホスト コンピューター上にホストされ、保護されます。Instead, they are hosted and secured on the host machine of the Azure virtual machine.
  2. Azure IaaS でサポートされている Windows および Linux のすべてのオペレーティング システムで、マネージド ID を使用できます。All Windows and Linux operating systems supported on Azure IaaS can use managed identities.
  3. VM 拡張機能をプロビジョニングする必要がなくなったため、デプロイにかかる時間が短縮され、簡単になります。Deployment is faster and easier, since the VM extension no longer needs to be provisioned.
  4. IMDS エンドポイントでは、最大 1000 個のユーザー割り当てマネージド ID を 1 つの仮想マシンに割り当てられます。With the IMDS endpoint, up to 1000 user-assigned managed identities can be assigned to a single virtual machine.
  5. 仮想マシン拡張機能の使用とは対照的に、IMDS を使用する要求に対して大きな変更を加えなくて済みます。したがって、現在仮想マシン拡張機能を使用している既存のデプロイに簡単に移植できます。There is no significant change to the requests using IMDS as opposed to those using the virtual machine extension, therefore it is fairly simple to port over existing deployments that currently use the virtual machine extension.

これらの理由から、仮想マシン拡張機能が非推奨になると、Azure IMDS サービスが、トークンを要求するための標準的な手段となります。For these reasons, the Azure IMDS service will be the defacto way to request tokens, once the virtual machine extension is deprecated.

次の手順Next Steps