資格情報を処理せずにアプリケーションからリソースに接続する

マネージド ID がサポートされている Azure リソースには、Microsoft Entra 認証をサポートしている Azure リソースに接続するためにマネージド ID を指定するオプションが常に用意されています。 マネージド ID のサポートにより、開発者はコードで資格情報を管理しなくて済みます。 マネージド ID は、それをサポートしている Azure リソースを操作する場合に推奨される認証オプションです。 マネージド ID の概要をご覧ください

このページでは、Azure Key Vault、Azure Storage、Microsoft SQL Server に接続できるように App Service を構成する方法について説明します。 マネージド ID をサポートしていて、Microsoft Entra 認証をサポートしているリソースに接続する任意の Azure リソースに対して同じ原則を使用できます。

コード サンプルでは、Azure Identity クライアント ライブラリを使用します。これは、接続で使用されるアクセス トークンの取得など、多くの手順が自動的に処理されるため、推奨される方法です。

マネージド ID ではどのようなリソースに接続できますか?

マネージド ID は、Microsoft Entra 認証をサポートする任意のリソースに接続できます。 一般に、マネージド ID で接続できるようにするためにリソースで必要な特別なサポートはありません。

一部のリソースでは、Microsoft Entra 認証がサポートされておらず、またクライアント ライブラリでトークンによる認証もサポートされていない場合があります。 マネージド ID を使用して、コードやアプリケーション構成に保存することなく資格情報に安全にアクセスする方法のガイダンスを続けてお読みください。

マネージド ID を作成する

マネージド ID には、システム割り当てとユーザー割り当ての 2 種類があります。 システム割り当て ID は、1 つの Azure リソースに直接リンクされます。 Azure リソースが削除されると、ID も削除されます。 ユーザー割り当てマネージド ID は複数の Azure リソースに関連付けることができ、そのライフサイクルはそれらのリソースから独立しています。

この記事では、ユーザー割り当てマネージド ID を作成して構成する方法について説明します。これは、ほとんどのシナリオで推奨される方法です。 使用しているソース リソースがユーザー割り当てマネージド ID をサポートしていない場合は、そのリソース プロバイダーのドキュメントを参照して、システム割り当てマネージド ID を持つように構成する方法を確認する必要があります。

ユーザー割り当てマネージド ID の作成

Note

新しいユーザー割り当てマネージド ID を作成するには、"マネージド ID 共同作成者" などのロールが必要です。

  1. ポータルの上部にある検索バーから「マネージド ID」を検索し、一致する結果を選択します。

Screenshot of searching for managed identities in the portal.

  1. [作成] ボタンを選択します。

Screenshot showing a managed identity create button in the portal.

  1. サブスクリプションとリソース グループを選択し、マネージド ID の名前を入力します。

Screenshot showing a managed identity create screen in the portal.

  1. [確認 + 作成] を選択して検証テストを実行し、[作成] ボタンを選択します。

  2. ID が作成されると、確認画面が表示されます。

Screenshot showing a managed identity confirmation screen after creation in the portal.

これで、Azure ソース リソースに関連付けることができる ID が作成されました。 ユーザー割り当てマネージド ID の管理に関する詳細をご覧ください

ユーザー割り当てマネージド ID を使用するようにソース リソースを構成する

ポータルを介してマネージド ID を使用するように Azure リソースを構成するには、次の手順に従います。 コマンド ライン インターフェイス、PowerShell、または ARM テンプレートを使用してリソースの ID を構成する方法については、特定のリソースの種類のドキュメントを参照してください。

Note

システム割り当て ID を使用するように Azure リソースを構成するには、"書き込み" アクセス許可が必要です。 ユーザー割り当て ID を Azure リソースに関連付けるには、"マネージド ID オペレーター" などのロールが必要です。

  1. ポータルの上部にある検索バーを使用してリソースを見つけます

Screenshot showing a resource being searched for in the portal.

  1. ナビゲーションの ID リンクを選択します

Screenshot showing the link to the identity screen for a resource in the portal.

  1. [ユーザー割り当て] タブを選択します

  2. [追加] ボタンを選択します

Screenshot showing a user-assigned identity screen in the portal.

  1. 前に作成したユーザー割り当て ID を選択し、[追加] を選択します

Screenshot showing a user-assigned identity being selected in the portal.

  1. ID がリソースに関連付けられて、一覧が更新されます。

Screenshot showing a user-assigned identity has been associated with the Azure resource in the portal.

これで、ソース リソースに、ターゲット リソースへの接続に使用できるユーザー割り当て ID が追加されました。

ID にアクセス許可を追加する

Note

ロールの割り当てを追加するには、ターゲット リソースの "ユーザー アクセス管理者" や "所有者" などのロールが必要です。 必ず、アプリケーションの実行に必要な最小限の特権を付与してください。

App Service にマネージド ID が設定されたので、この ID に適切なアクセス許可を付与する必要があります。 これからこの ID を使用してAzure Storage を操作するため、Azure ロール ベースのアクセス制御 (RBAC) システムを使用します。

  1. ポータルの上部にある検索バーを使用して、接続先のリソースを見つけます
  2. 左側のナビゲーションにある [アクセス制御 (IAM)] リンクを選択します。

Screenshot showing a resource summary screen in the portal.

  1. 画面の上部付近にある [追加] ボタンを選択し、[ロールの割り当てを追加] を選択します。

Screenshot showing the add role assignment navigation in the portal.

  1. ロールの一覧が表示されます。 [表示] リンクを選択すると、ロールに付与されている具体的なアクセス許可を確認できます。 ID に付与するロールを選択し、[次へ] ボタンを選択します。

Screenshot showing a role being selected in the portal.

  1. ロールを付与するユーザーを選択するように求められます。 [マネージド ID] オプションを選択し、[メンバーの追加] リンクを選択します。

Screenshot showing the identity type being selected in the portal.

  1. 右側にコンテキスト ペインが表示され、マネージド ID の種類で検索できます。 [マネージド ID] オプションで [ユーザー割り当てマネージド ID] を選択します。

Screenshot showing managed identity being selected in the portal.

  1. 前に作成した ID と [選択] ボタンを選択します。 コンテキスト ペインが閉じ、ID が一覧に追加されます。

Screenshot showing an identity being added to a resource in the portal.

  1. [確認 + 作成] ボタンを選択してロール割り当ての概要を表示し、もう一度確認します。
  2. [ロールの割り当て] オプションを選択すると、リソースのロール割り当ての一覧が表示されます。

Screenshot showing the role assignment has been added in the portal.

これで、マネージド ID に、Azure ターゲット リソースにアクセスするための適切なアクセス許可が付与されました。 Azure ロール ベースのアクセス制御の詳細をご覧ください

コードでマネージド ID を使用する

ご利用の App Service に、アクセス許可を備えているマネージド ID が追加されました。 コードに資格情報を格納する代わりに、このマネージド ID をコードで使用して、ターゲット リソースと対話できます。

お好みのプログラミング言語用の Azure ID ライブラリを使用することをお勧めします。 サポートされている言語は、.NETJavaJavaScriptPythonGoC++ などです。 このライブラリはアクセス トークンを自動で取得するため、ターゲット リソースへの接続が簡単になります。

開発環境で Azure ID ライブラリを使用する

Azure ID ライブラリでは、C++ ライブラリを除き、DefaultAzureCredential という種類がサポートされています。 DefaultAzureCredential では、環境変数や対話型のサインインなどの複数のメカニズムを介した認証が自動的に試行されます。 この資格情報の種類は、独自の資格情報を使用する開発環境で使用できます。 また、マネージド ID を使用する Azure 運用環境でも使用できます。 アプリケーションをデプロイするときにコードを変更する必要はありません。

ユーザー割り当てマネージド ID を使用している場合は、ID のクライアント ID をパラメーターとして渡すことによって、認証するユーザー割り当てマネージド ID を明示的に指定する必要もあります。 ポータルで ID を参照することで、クライアント ID を取得できます。

Screenshot showing the client ID for the managed identity in the portal.

Azure ID ライブラリの詳細については、以下をお読みください。

Azure Storage で BLOB にアクセスする

using Azure.Identity;
using Azure.Storage.Blobs;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);                        

var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");

if (blobClient1.Exists())
{
    var downloadedBlob = blobClient1.Download();
    string blobContents = downloadedBlob.Value.Content.ToString();                
}

Azure Key Vault に格納されているシークレットにアクセスする

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);        

var client = new SecretClient(
    new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
    credential);
    
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;

Azure SQL Database にアクセスする

using Azure.Identity;
using Microsoft.Data.SqlClient;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};

AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
    new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));                        

using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
    AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
    Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();	

Microsoft Entra ID またはライブラリのトークン ベースの認証をサポートしていないリソースに接続する

一部の Azure リソースでは、まだ Microsoft Entra 認証がサポートされていない場合や、そのクライアント ライブラリでトークンによる認証をサポートしていない場合があります。 通常、こうしたリソースは、ユーザー名とパスワードまたは接続文字列内のアクセス キーを必要とするオープンソース テクノロジです。

コードやアプリケーション構成に資格情報を格納しないようにするには、資格情報をシークレットとして Azure Key Vault に格納します。 上記の例を使用すると、マネージド ID を使用して Azure KeyVault からシークレットを取得し、接続文字列に資格情報を渡すことができます。 この方法は、コードや環境で資格情報を直接処理する必要がないことを意味します。

トークンを直接処理する場合のガイドライン

一部のシナリオでは、組み込みのメソッドを使用してターゲット リソースに接続するのではなく、マネージド ID のトークンを手動で取得する必要がある場合があります。 このようなシナリオとしては、使用しているプログラミング言語や接続先のターゲット リソース用のクライアント ライブラリが存在しない場合や、Azure で実行されていないリソースに接続する場合などが挙げられます。 トークンを手動で取得する場合は、以下のガイドラインに従ってください。

取得したトークンをキャッシュする

パフォーマンスと信頼性を確保するために、アプリケーションでトークンをローカル メモリにキャッシュするか、ディスクに保存する場合は暗号化することをお勧めします。 マネージド ID トークンは 24 時間有効であり、新しいトークンを定期的に要求しても、キャッシュされたものがトークン発行エンドポイントから返されるため、メリットはありません。 要求の制限を超えると、レート制限が適用され、HTTP 429 エラーが出されます。

トークンを取得するときに、トークンの生成時に返される expires_on (または同等のプロパティ) が示す期限の 5 分前にトークン キャッシュの有効期限が切れるように設定できます。

トークン検査

アプリケーションはトークンのコンテンツに依存しないようにする必要があります。 トークンのコンテンツは、トークンを要求しているクライアントではなく、アクセス対象 (ターゲット リソース) のみが使用するためのものです。 トークンのコンテンツは、将来変更されたり、暗号化されたりする可能性があります。

トークンを公開または移動しない

トークンは資格情報と同様に扱う必要があります。 ユーザーやその他のサービス (ログ/監視ソリューションなど) に公開しないでください。 ターゲット リソースに対して認証するとき以外は、それが使用されているソース リソースから移動しないでください。

次の手順