Application Insights 用 Microsoft Entra 認証

Application Insights で Microsoft Entra 認証がサポートされるようになりました。 Microsoft Entra ID を使用することで、認証されたテレメトリのみが Application Insights リソースに取り込まれるようすることができます。

さまざまな認証システムを使用すると、資格情報の管理が困難なため、煩雑であり、リスクも高まります。 ローカル認証の無効化を選択して、マネージド IDMicrosoft Entra ID を使用して排他的に認証されたテレメトリのみをリソースに取り込むようにすることが可能になりました。 この機能は、重要な運用上 (アラート自動スケーリング) とビジネス上の決定を行うために使用されるテレメトリのセキュリティと信頼性を強化するためのステップです。

前提条件

Microsoft Entra 認証済みのインジェストを有効にするには、次の準備作業が必要です。 以下を実行する必要があります。

サポートされていないシナリオ

次のソフトウェア開発キット (SDK) と機能は、Microsoft Entra 認証インジェストでの使用がサポートされていません。

Microsoft Entra ID ベースの認証を構成して有効にする

  1. ID がまだない場合は、マネージド ID またはサービス プリンシパルを使用して作成します。

    • マネージド ID を使用することをお勧めします。

      Azure サービスのマネージド ID を設定します (Virtual Machines または App Service)。

    • サービス プリンシパルを使用することはお勧めしません。

      リソースにアクセスできる Microsoft Entra アプリケーションとサービス プリンシパルの作成方法の詳細については、サービス プリンシパルの作成に関するページを参照してください。

  2. 必要なロールベースのアクセス制御 (RBAC) ロールを Azure ID、サービス プリンシパル、または Azure ユーザー アカウントに割り当てます。

    Azure ロールの割り当てに関するページの手順に従って、ターゲット Application Insights リソースをロール スコープとして設定して、監視メトリック パブリッシャー ロールを想定される ID、サービス プリンシパル、または Azure ユーザー アカウントに追加します。

    Note

    監視メトリック発行者ロールの名前には、"メトリック" が含まれていますが、すべてのテレメトリを Application Insights リソースに発行します。

  3. 次の言語に合わせて、構成ガイダンスに従います。

Note

Application Insights .NET SDK での Microsoft Entra ID のサポートは、バージョン 2.18-Beta3 以降に含まれています。

Application Insights .NET SDK では、Azure Identity によって提供される資格情報クラスがサポートされています。

  • ローカル開発には DefaultAzureCredential をお勧めします。
  • 予想される Azure ユーザー アカウントを使用して、Visual Studio で認証されていることを確認します。 詳細については、Visual Studio を使用した認証に関する記事を参照してください。
  • システム割り当ておよびユーザー割り当てのマネージド ID には ManagedIdentityCredential をお勧めします。
    • システム割り当ての場合は、パラメーターを指定せずに既定のコンストラクターを使用します。
    • ユーザー割り当ての場合は、クライアント ID をコンストラクターに渡します。

次の例は、.NET を使用して手動で TelemetryConfiguration を作成および構成する方法を示しています。

TelemetryConfiguration.Active.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://xxxx.applicationinsights.azure.com/";
var credential = new DefaultAzureCredential();
TelemetryConfiguration.Active.SetAzureTokenCredential(credential);

次の例は、.NET Core を使用して TelemetryConfiguration を構成する方法を示しています。

services.Configure<TelemetryConfiguration>(config =>
{
       var credential = new DefaultAzureCredential();
       config.SetAzureTokenCredential(credential);
});
services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions
{
    ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://xxxx.applicationinsights.azure.com/"
});

Microsoft Entra 認証を使用して Application Insights にクエリを実行する

Azure Monitor Application Insights エンドポイント https://api.applicationinsights.io を使用して、クエリ要求を送信できます。 エンドポイントにアクセスするには、Microsoft Entra ID を使って認証を行う必要があります。

認証を設定する

API にアクセスするには、クライアント アプリを Microsoft Entra ID に登録して、トークンを要求します。

  1. アプリを Microsoft Entra ID に登録します

  2. アプリの概要ページで、[API のアクセス許可] を選択します。

  3. [アクセス許可の追加] を選択します。

  4. [組織が使用している API] タブで Application Insights を検索し、一覧から "Application Insights API" を選択します。

  5. [委任されたアクセス許可] を選択します。

  6. [Data.Read] チェック ボックスをオンにします。

  7. [アクセス許可の追加] を選択します.

アプリが登録され、API を使用するアクセス許可が与えられたので、Application Insights リソースへのアクセス権をアプリに付与します。

  1. Application Insights リソースの [概要] ページで、[アクセス制御 (IAM)] を選択します。

  2. [ロールの割り当ての追加] を選択します。

  3. [閲覧者] ロールを選択してから、[メンバー] を選択します。

  4. [メンバー] タブで、[メンバーの選択] を選択します。

  5. [選択] ボックスにアプリの名前を入力します。

  6. アプリを選択し、[選択] を選択します。

  7. [レビューと割り当て] を選択します。

  8. Active Directory のセットアップとアクセス許可が完了したら、認可トークンを要求します。

注意

この例では、閲覧者ロールを適用しました。 このロールは多くの組み込みロールの 1 つであり、必要以上のアクセス許可が含まれる場合があります。 より詳細なロールとアクセス許可を作成できます。

承認トークンを要求する

開始する前に、要求を正常に行うために必要なすべての値があることを確認してください。 すべての要求には、次が必要です。

  • Microsoft Entra テナント ID。
  • App Insights アプリ ID - 現在 API キーを使っている場合は、同じアプリ ID です。
  • アプリの Microsoft Entra クライアント ID。
  • アプリの Microsoft Entra クライアント シークレット。

Application Insights API では、3 つの異なる Microsoft Entra ID OAuth2 フローで Microsoft Entra 認証がサポートされています。

  • クライアントの資格情報
  • Authorization code (承認コード)
  • 暗黙

クライアントの資格情報フロー

クライアント資格情報フローでは、トークンは Application Insights エンドポイントで使用されます。 前のステップでアプリを Microsoft Entra ID に登録したときにアプリに提供された資格情報を使い、1 回要求を行ってトークンを受け取ります。

https://api.applicationinsights.io エンドポイントを使用します。

クライアント資格情報トークン URL (POST 要求)
    POST /<your-tenant-id>/oauth2/token
    Host: https://login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=client_credentials
    &client_id=<app-client-id>
    &resource=https://api.applicationinsights.io
    &client_secret=<app-client-secret>

要求が成功すると、アクセス トークンが応答で送られてきます。

    {
        token_type": "Bearer",
        "expires_in": "86399",
        "ext_expires_in": "86399",
        "access_token": ""eyJ0eXAiOiJKV1QiLCJ.....Ax"
    }

そのトークンを Application Insights エンドポイントへの要求で使用します。

    POST /v1/apps/yous_app_id/query?timespan=P1D
    Host: https://api.applicationinsights.io
    Content-Type: application/json
    Authorization: Bearer <your access token>

    Body:
    {
    "query": "requests | take 10"
    }

応答の例:

  "tables": [
    {
      "name": "PrimaryResult",
      "columns": [
        {
          "name": "timestamp",
          "type": "datetime"
        },
        {
          "name": "id",
          "type": "string"
        },
        {
          "name": "source",
          "type": "string"
        },
        {
          "name": "name",
          "type": "string"
        },
        {
          "name": "url",
          "type": "string"
        },
        {
          "name": "success",
          "type": "string"
        },
        {
          "name": "resultCode",
          "type": "string"
        },
        {
          "name": "duration",
          "type": "real"
        },
        {
          "name": "performanceBucket",
          "type": "string"
        },
        {
          "name": "customDimensions",
          "type": "dynamic"
        },
        {
          "name": "customMeasurements",
          "type": "dynamic"
        },
        {
          "name": "operation_Name",
          "type": "string"
        },
        {
          "name": "operation_Id",
          "type": "string"
        },
        {
          "name": "operation_ParentId",
          "type": "string"
        },
        {
          "name": "operation_SyntheticSource",
          "type": "string"
        },
        {
          "name": "session_Id",
          "type": "string"
        },
        {
          "name": "user_Id",
          "type": "string"
        },
        {
          "name": "user_AuthenticatedId",
          "type": "string"
        },
        {
          "name": "user_AccountId",
          "type": "string"
        },
        {
          "name": "application_Version",
          "type": "string"
        },
        {
          "name": "client_Type",
          "type": "string"
        },
        {
          "name": "client_Model",
          "type": "string"
        },
        {
          "name": "client_OS",
          "type": "string"
        },
        {
          "name": "client_IP",
          "type": "string"
        },
        {
          "name": "client_City",
          "type": "string"
        },
        {
          "name": "client_StateOrProvince",
          "type": "string"
        },
        {
          "name": "client_CountryOrRegion",
          "type": "string"
        },
        {
          "name": "client_Browser",
          "type": "string"
        },
        {
          "name": "cloud_RoleName",
          "type": "string"
        },
        {
          "name": "cloud_RoleInstance",
          "type": "string"
        },
        {
          "name": "appId",
          "type": "string"
        },
        {
          "name": "appName",
          "type": "string"
        },
        {
          "name": "iKey",
          "type": "string"
        },
        {
          "name": "sdkVersion",
          "type": "string"
        },
        {
          "name": "itemId",
          "type": "string"
        },
        {
          "name": "itemType",
          "type": "string"
        },
        {
          "name": "itemCount",
          "type": "int"
        }
      ],
      "rows": [
        [
          "2018-02-01T17:33:09.788Z",
          "|0qRud6jz3k0=.c32c2659_",
          null,
          "GET Reports/Index",
          "http://fabrikamfiberapp.azurewebsites.net/Reports",
          "True",
          "200",
          "3.3833",
          "<250ms",
          "{\"_MS.ProcessedByMetricExtractors\":\"(Name:'Requests', Ver:'1.0')\"}",
          null,
          "GET Reports/Index",
          "0qRud6jz3k0=",
          "0qRud6jz3k0=",
          "Application Insights Availability Monitoring",
          "9fc6738d-7e26-44f0-b88e-6fae8ccb6b26",
          "us-va-ash-azr_9fc6738d-7e26-44f0-b88e-6fae8ccb6b26",
          null,
          null,
          "AutoGen_49c3aea0-4641-4675-93b5-55f7a62d22d3",
          "PC",
          null,
          null,
          "52.168.8.0",
          "Boydton",
          "Virginia",
          "United States",
          null,
          "fabrikamfiberapp",
          "RD00155D5053D1",
          "cf58dcfd-0683-487c-bc84-048789bca8e5",
          "fabrikamprod",
          "5a2e4e0c-e136-4a15-9824-90ba859b0a89",
          "web:2.5.0-33031",
          "051ad4ef-0776-11e8-ac6e-e30599af6943",
          "request",
          "1"
        ],
        [
          "2018-02-01T17:33:15.786Z",
          "|x/Ysh+M1TfU=.c32c265a_",
          null,
          "GET Home/Index",
          "http://fabrikamfiberapp.azurewebsites.net/",
          "True",
          "200",
          "716.2912",
          "500ms-1sec",
          "{\"_MS.ProcessedByMetricExtractors\":\"(Name:'Requests', Ver:'1.0')\"}",
          null,
          "GET Home/Index",
          "x/Ysh+M1TfU=",
          "x/Ysh+M1TfU=",
          "Application Insights Availability Monitoring",
          "58b15be6-d1e6-4d89-9919-52f63b840913",
          "emea-se-sto-edge_58b15be6-d1e6-4d89-9919-52f63b840913",
          null,
          null,
          "AutoGen_49c3aea0-4641-4675-93b5-55f7a62d22d3",
          "PC",
          null,
          null,
          "51.141.32.0",
          "Cardiff",
          "Cardiff",
          "United Kingdom",
          null,
          "fabrikamfiberapp",
          "RD00155D5053D1",
          "cf58dcfd-0683-487c-bc84-048789bca8e5",
          "fabrikamprod",
          "5a2e4e0c-e136-4a15-9824-90ba859b0a89",
          "web:2.5.0-33031",
          "051ad4f0-0776-11e8-ac6e-e30599af6943",
          "request",
          "1"
        ]
      ]
    }
  ]
}

承認コード フロー

サポートされる主な OAuth2 フローは、承認コードを使用して行われます。 この方法では、Azure Monitor Application Insights API の呼び出しに使用するトークンを取得するために 2 つの HTTP 要求が必要です。 2 つの URL (要求ごとに 1 つのエンドポイント) があります。 これらの形式については、次のセクションで説明します。

認可コード URL (GET 要求)
    GET https://login.microsoftonline.com/YOUR_Azure AD_TENANT/oauth2/authorize?
    client_id=<app-client-id>
    &response_type=code
    &redirect_uri=<app-redirect-uri>
    &resource=https://api.applicationinsights.io

認可された URL に対して要求を行うとき、client_id は、アプリのプロパティ メニューからコピーした、Microsoft Entra アプリのアプリケーション ID です。 redirect_uri は、同じ Microsoft Entra アプリのホーム ページまたはログイン URL です。 要求が成功すると、このエンドポイントによって、承認コードが URL に追加された、サインアップ時に指定したサインイン ページにリダイレクトされます。 次の例を参照してください。

    http://<app-client-id>/?code=AUTHORIZATION_CODE&session_state=STATE_GUID

この時点で、アクセス トークンを要求するために使う認可コードを取得します。

認可コード トークン URL (POST 要求)
    POST /YOUR_Azure AD_TENANT/oauth2/token HTTP/1.1
    Host: https://login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=authorization_code
    &client_id=<app client id>
    &code=<auth code fom GET request>
    &redirect_uri=<app-client-id>
    &resource=https://api.applicationinsights.io
    &client_secret=<app-client-secret>

すべての値は以前と同じですが、いくつかの追加があります。 承認コードは、リダイレクトが成功した後に前の要求で受け取ったコードと同じです。 コードを、Microsoft Entra アプリから取得したキーと結合します。 キーを保存しなかった場合は、それを削除し、Microsoft Entra アプリ メニューの [キー] タブから新しいものを作成できます。 応答は、次のスキーマを持つトークンを含む JSON 文字列です。 トークン値の型が示されています。

応答の例:

    {
        "access_token": "eyJ0eXAiOiJKV1QiLCJ.....Ax",
        "expires_in": "3600",
        "ext_expires_in": "1503641912",
        "id_token": "not_needed_for_app_insights",
        "not_before": "1503638012",
        "refresh_token": "eyJ0esdfiJKV1ljhgYF.....Az",
        "resource": "https://api.applicationinsights.io",
        "scope": "Data.Read",
        "token_type": "bearer"
    }

この応答のアクセス トークン部分は、Authorization: Bearer ヘッダーで Application Insights API に提示するものです。 また、将来、使っているものが古くなったときに新しい access_token と refresh_token を取得するために、更新トークンを使うこともできます。 この要求の形式とエンドポイントは次のとおりです。

    POST /YOUR_AAD_TENANT/oauth2/token HTTP/1.1
    Host: https://login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=<app-client-id>
    &refresh_token=<refresh-token>
    &grant_type=refresh_token
    &resource=https://api.applicationinsights.io
    &client_secret=<app-client-secret>

応答の例:

    {
      "token_type": "Bearer",
      "expires_in": "3600",
      "expires_on": "1460404526",
      "resource": "https://api.applicationinsights.io",
      "access_token": "eyJ0eXAiOiJKV1QiLCJ.....Ax",
      "refresh_token": "eyJ0esdfiJKV1ljhgYF.....Az"
    }

暗黙的コード フロー

Application Insights API では、OAuth2 の暗黙的フローがサポートされています。 このフローでは、1 つの要求のみが必要ですが、更新トークンは取得できません。

暗黙のコード認可 URL
    GET https://login.microsoftonline.com/YOUR_AAD_TENANT/oauth2/authorize?
    client_id=<app-client-id>
    &response_type=token
    &redirect_uri=<app-redirect-uri>
    &resource=https://api.applicationinsights.io

要求が成功すると、次のように URL 内のトークンを使用してリダイレクト URI へのリダイレクトが生成されます。

    http://YOUR_REDIRECT_URI/#access_token=YOUR_ACCESS_TOKEN&token_type=Bearer&expires_in=3600&session_state=STATE_GUID

この access_token は、要求を認可するために Application Insights API に渡されるときに、Authorization: Bearer ヘッダー値として機能します。

ローカル認証の無効化

Microsoft Entra 認証が有効になると、ローカル認証を無効にすることを選択できます。 この構成では、Microsoft Entra によって排他的に認証されたテレメトリを取り込むことができ、データ アクセス (API キー経由など) に影響を及ぼします。

ローカル認証は、Azure portal、Azure Policy、またはプログラムを使用して無効にできます。

Azure portal

  1. Application Insights リソースの左側のメニューで、[構成][プロパティ] を選びます。 ローカル認証が有効になっている場合は、[有効 (クリックして変更)] を選択します。

    [構成] セクションの [プロパティ] と、[有効 (選択して変更)] ローカル認証ボタンを示すスクリーンショット。

  2. [無効] を選択し、変更を適用します。

    [有効/無効] ボタンがあるローカル認証を示すスクリーンショット。

  3. リソースでローカル認証を無効にすると、対応する情報が [概要] ペインに表示されます。

    [無効 (選択して変更)] ローカル認証ボタンがある [概要] タブを示すスクリーンショット。

Azure Policy

DisableLocalAuth に対する Azure Policy は、このプロパティが true に設定されていないと、新しい Application Insights リソースを作成する機能をユーザーに対して拒否します。 ポリシー名は Application Insights components should block non-AAD auth ingestion です。

このポリシー定義をサブスクリプションに適用するには、新しいポリシー割り当てを作成してポリシーを割り当てます

次の例は、ポリシー テンプレートの定義を示しています。

{
    "properties": {
        "displayName": "Application Insights components should block non-AAD auth ingestion",
        "policyType": "BuiltIn",
        "mode": "Indexed",
        "description": "Improve Application Insights security by disabling log ingestion that are not AAD-based.",
        "metadata": {
            "version": "1.0.0",
            "category": "Monitoring"
        },
        "parameters": {
            "effect": {
                "type": "String",
                "metadata": {
                    "displayName": "Effect",
                    "description": "The effect determines what happens when the policy rule is evaluated to match"
                },
                "allowedValues": [
                    "audit",
                    "deny",
                    "disabled"
                ],
                "defaultValue": "audit"
            }
        },
        "policyRule": {
            "if": {
                "allOf": [
                    {
                        "field": "type",
                        "equals": "Microsoft.Insights/components"
                    },
                    {
                        "field": "Microsoft.Insights/components/DisableLocalAuth",
                        "notEquals": "true"                        
                    }
                ]
            },
            "then": {
                "effect": "[parameters('effect')]"
            }
        }
    }
}

プログラムによる有効化

プロパティ DisableLocalAuth は、Application Insights リソースでローカル認証を無効にするために使用されます。 このプロパティを true に設定すると、すべてのアクセスで Microsoft Entra 認証を使うことが必須になります。

次の例は、LocalAuth を無効にして、ワークスペースベースの Application Insights リソースを作成するために使用できる Azure Resource Manager テンプレートを示しています。

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string"
        },
        "type": {
            "type": "string"
        },
        "regionId": {
            "type": "string"
        },
        "tagsArray": {
            "type": "object"
        },
        "requestSource": {
            "type": "string"
        },
        "workspaceResourceId": {
            "type": "string"
        },
        "disableLocalAuth": {
            "type": "bool"
        }
     
    },
    "resources": [
        {
        "name": "[parameters('name')]",
        "type": "microsoft.insights/components",
        "location": "[parameters('regionId')]",
        "tags": "[parameters('tagsArray')]",
        "apiVersion": "2020-02-02-preview",
        "dependsOn": [],
        "properties": {
            "Application_Type": "[parameters('type')]",
            "Flow_Type": "Redfield",
            "Request_Source": "[parameters('requestSource')]",
            "WorkspaceResourceId": "[parameters('workspaceResourceId')]",
            "DisableLocalAuth": "[parameters('disableLocalAuth')]"
            }
    }
 ]
}

トークン対象ユーザー

Application Insights にテレメトリを送信するために Microsoft Entra ID からアクセス トークンを取得するカスタム クライアントを開発する場合は、次の表を参照して、特定のホスト環境に適した対象ユーザー文字列を決定します。

Azure クラウド バージョン トークンの対象ユーザーの値
Azure パブリック クラウド https://monitor.azure.com
21Vianet によって運営される Microsoft Azure クラウド https://monitor.azure.cn
Azure US Government cloud https://monitor.azure.us

ソブリン クラウドを使用している場合は、接続文字列にも対象ユーザー情報があります。 接続文字列は、次の構造に従います。

InstrumentationKey={profile.InstrumentationKey};IngestionEndpoint={ingestionEndpoint};LiveEndpoint={liveDiagnosticsEndpoint};AADAudience={aadAudience}

対象ユーザー パラメーター AADAudience は、特定の環境によって異なる場合があります。

トラブルシューティング

このセクションでは、サポート チケットを送信する前に問題解決のために実行できる各種トラブルシューティングのシナリオと手順について説明します。

インジェスト HTTP エラー

インジェスト サービスでは、SDK 言語に関係なく、特定のエラーを返します。 ネットワーク トラフィックは、Fiddler などのツールを使用して収集できます。 フィルターにかけて、接続文字列に設定されたインジェスト エンドポイントへのトラフィックに絞り込む必要があります。

HTTP/1.1 400 Authentication not supported (認証がサポートされていません)

このエラーは、リソースが Microsoft Entra 専用に設定されていることを示しています。 SDK が正しくない API に送信しているため、SDK を正しく構成する必要があります。

Note

"v2/track" は Microsoft Entra ID をサポートしていません。 SDK が正しく構成されると、テレメトリは "v2.1/track" に送信されます。

次に、SDK の構成を確認する必要があります。

HTTP/1.1 401 Authorization required (認証が必要です)

このエラーは、SDK は正しく構成されているが、有効なトークンを取得できないことを示しています。 このエラーは、Microsoft Entra ID に関する問題を示している可能性があります。

次に、SDK ログの例外、または Azure ID からのネットワーク エラーを特定する必要があります。

HTTP/1.1 403 Unauthorized (権限がありません)

このエラーは、SDK が Application Insights リソースまたはサブスクリプションに対するアクセス許可を付与されていない資格情報を使用していることを意味します。

まず、Application Insights リソースのアクセスの制御を確認します。 監視メトリック発行者ロールが付与された資格情報を使用して SDK を構成する必要があります。

言語固有のトラブルシューティング

[イベント ソース] と置き換えます。

Application Insights .NET SDK は、イベント ソースを使用してエラー ログを出力します。 イベント ソース ログの収集の詳細については、データが存在しない場合のトラブルシューティングに関するページの「PerfView を使用してログを収集する」を参照してください。

SDK でトークンの取得に失敗した場合、例外メッセージ Failed to get AAD Token. Error message: がログに記録されます。

次のステップ