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

マネージド 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 ID クライアント ライブラリを使用します。これは、接続で使用されるアクセス トークンの取得など、多くの手順が自動的に処理されるため、推奨される方法です。

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

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

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

マネージド ID を作成する

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

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

重要

マネージド ID の作成に使用されるアカウントには、新しいユーザー割り当てマネージド ID を作成するための "マネージド ID 共同作成者" などのロールが必要です。

任意のオプションを使用して、ユーザー割り当てマネージド ID を作成します。

ユーザー割り当てマネージド ID を作成したら、マネージド ID の作成時に返される clientIdprincipalId の値を書き留めます。 principalId はアクセス許可の追加時に使用し、clientId はアプリケーションのコードで使用します。

App Service にユーザー割り当てマネージド ID を構成する

コードでマネージド ID を使用する前に、それを使用する App Service に割り当てる必要があります。 ユーザー割り当てマネージド ID を使用するように App Service を構成するプロセスでは、アプリ構成でマネージド ID のリソース識別子を指定する必要があります。

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

ユーザー割り当てマネージド ID を使用するように App Service を構成したら、その ID に必要なアクセス許可を付与します。 このシナリオでは、この ID を使用して Azure Storage を操作するため、 Azure ロール ベースのアクセス制御 (RBAC) システムを使用して ユーザー割り当てマネージド ID にリソースへのアクセス許可を付与する必要があります。

重要

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

アクセスするリソースには、ID アクセス許可を付与する必要があります。 たとえば、キー コンテナーにアクセスするためにトークンを要求する場合、アプリや関数のマネージド ID を含むアクセス ポリシーも追加する必要があります。 それ以外の場合は、有効なトークンを使用する場合でも、キー コンテナーへの呼び出しは拒否されます。 同じことが Azure SQL データベースにも当てはまります。 どのリソースで Microsoft Entra トークンがサポートされるかについて詳しくは、「Microsoft Entra 認証をサポートする Azure サービス」を参照siteください。

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

上記の手順を完了すると、App Service には Azure リソースへのアクセス許可を持つマネージド ID があります。 マネージド ID を使用すると、コードに資格情報を格納する代わりに、コードが Azure リソースと対話するために使用できるアクセス トークンを取得できます。

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

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

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

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

ユーザー割り当てマネージド ID を使用している場合は、ID のクライアント ID をパラメーターとして渡すことによって、認証するユーザー割り当てマネージド ID を明示的に指定する必要もあります。 Azure portal で ID を参照することで、クライアント 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 データベースにアクセスする

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 分前にトークン キャッシュの有効期限が切れるように設定できます。

トークン検査

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

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

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

次のステップ