アプリが Azure Storage、Azure Key Vault、Azure メッセージング サービスなどの Azure リソースにアクセスする必要がある場合は、アプリを Azure に対して認証する必要があります。 この要件は、Azure にデプロイされているか、オンプレミスにデプロイされているか、ローカルの開発者ワークステーションで開発中であるかに関係なく、すべてのアプリに当てはまります。 この記事では、C++ 用 Azure SDK を使用するときに Azure に対してアプリを認証するための推奨される方法について説明します。
推奨されるアプリ認証方法
アプリが Azure リソースに対して認証を行うときは、接続文字列ではなくトークンベースの認証を使用します。 C++ 用の Azure Identity クライアント ライブラリには、トークン ベースの認証をサポートするクラスが用意されています。 これらのクラスを使用すると、アプリがローカルで開発されているか、Azure にデプロイされているか、オンプレミス サーバーにデプロイされているかに関係なく、アプリは Azure リソースに対してシームレスに認証できます。
アプリが Azure リソースに対する認証に使用するトークン ベースの認証の特定の種類は、アプリの実行場所によって異なります。 トークン ベースの認証の種類を次の図に示します。
- 開発者がローカル開発時にアプリを実行している場合: アプリは、ローカル開発用のアプリケーション サービス プリンシパルまたは開発者の Azure 資格情報を使用して、Azure に対して認証を行います。 これらのオプションについては、「 ローカル開発時の認証」セクションで説明します。
- アプリが Azure でホストされている場合: アプリは、マネージド ID を使用して Azure リソースに対して認証を行います。 このオプションについては、「 サーバー環境での認証」セクションで説明します。
- アプリがオンプレミスでホストおよびデプロイされている場合: アプリは、アプリケーション サービス プリンシパルを使用して Azure リソースに対して認証を行います。 このオプションについては、「 サーバー環境での認証」セクションで説明します。
既定値AzureCredential
Azure Identity クライアント ライブラリによって提供 される DefaultAzureCredential クラスを使用すると、アプリは実行環境に応じて異なる認証方法を使用できます。 これにより、コードを変更することなく、アプリをローカル開発からテスト環境から運用環境に昇格させることができます。
環境ごとに適切な認証方法を構成し、その認証方法を自動的に検出して使用 DefaultAzureCredential
。
DefaultAzureCredential
の使用は、条件付きロジックまたは機能フラグを手動でコーディングして、異なる環境で異なる認証方法を使用するよりも優先されます。
DefaultAzureCredential
クラスの使用方法の詳細については、「アプリケーションでの DefaultAzureCredential の使用」セクションで説明します。
トークン ベースの認証の利点
Azure 用アプリをビルドするときに接続文字列を使用する代わりに、トークンベースの認証を使用します。 トークンベースの認証は、接続文字列を使用した認証よりも次の利点を提供します。
- この記事で説明するトークン ベースの認証方法を使用すると、Azure リソースでアプリに必要な特定のアクセス許可を確立できます。 この方法は、 最小限の特権の原則に従います。 これに対し、接続文字列は Azure リソースに対する完全な権限を付与します。
- 接続文字列を持つすべてのユーザーまたはアプリは Azure リソースに接続できますが、トークンベースの認証方法では、リソースへのアクセスを、リソースにアクセスすることを意図したアプリのみにスコープを設定します。
- マネージド ID では、格納するアプリケーション シークレットはありません。 侵害される可能性のある接続文字列やアプリケーション シークレットがないため、アプリの安全性が高くなります。
- Azure ID パッケージは Microsoft Entra トークンを取得および管理し、トークンベースの認証を接続文字列として使用しやすくします。
接続文字列の使用を、運用環境や機密データにアクセスしない初期の概念実証アプリまたは開発プロトタイプに制限します。 それ以外の場合、Azure リソースに対して認証を行うときは、Azure ID クライアント ライブラリで使用できるトークン ベースの認証クラスが常に優先されます。
サーバー環境での認証
サーバー環境でホストしている場合、各アプリには、アプリが実行される環境ごとに一意の アプリケーション ID が割り当てられます。 Azure では、アプリケーション ID は サービス プリンシパルによって表されます。 この特殊な種類のセキュリティ プリンシパルは、Azure に対してアプリを識別して認証します。 アプリに使用するサービス プリンシパルの種類は、アプリが実行されている場所によって異なります。
認証方法 | 説明 |
---|---|
Azure でホストされているアプリ | Azure でホストされるアプリでは、 マネージド ID サービス プリンシパルを使用する必要があります。 マネージド ID は、Azure でホストされているアプリの ID を表すように設計されており、Azure でホストされているアプリでのみ使用できます。 たとえば、Azure App Service でホストされている Django Web アプリにはマネージド ID が割り当てられます。 アプリに割り当てられたマネージド ID は、他の Azure サービスに対するアプリの認証に使用されます。 Azure Kubernetes Service (AKS) で実行されているアプリでは、ワークロード ID 資格情報を使用できます。 この資格情報は、AKS サービス アカウントとの信頼関係を持つマネージド ID に基づいています。 |
Azure の外部でホストされているアプリ (たとえば、オンプレミス のアプリ) |
Azure サービスに接続する必要がある Azure の外部でホストされているアプリ (オンプレミス アプリなど) では、 アプリケーション サービス プリンシパルを使用する必要があります。 アプリケーション サービス プリンシパルは、Azure のアプリの ID を表し、アプリケーション登録プロセスを通じて作成されます。 たとえば、Azure Blob Storage を利用するオンプレミスでホストされている Django Web アプリを考えてみましょう。 アプリの登録プロセスを使用して、アプリのアプリケーション サービス プリンシパルを作成します。 AZURE_CLIENT_ID 、AZURE_TENANT_ID 、およびAZURE_CLIENT_SECRET はすべて、実行時にアプリケーションが読み取る環境変数として格納され、アプリケーション サービス プリンシパルを使用してアプリが Azure に対して認証できるようにします。 |
ローカル開発時の認証
ローカル開発中に開発者のワークステーションでアプリを実行する場合でも、アプリで使用されるすべての Azure サービスに対して認証を行う必要があります。 ローカル開発時に Azure に対してアプリを認証するには、主に次の 2 つの戦略があります。
認証方法 | 説明 |
---|---|
ローカル開発時に使用する専用のアプリケーション サービス プリンシパル オブジェクトを作成します。 | この方法では、専用 のアプリケーション サービス プリンシパル オブジェクトを、ローカル開発時に使用するアプリ登録プロセスを使用して設定します。 その後、サービス プリンシパルの ID は、アプリがローカル開発で実行されるときにアクセスする環境変数として格納されます。 このメソッドを使用すると、ローカル開発時に開発者が使用するサービス プリンシパル オブジェクトに、アプリで必要な特定のリソースアクセス許可を割り当てることができます。 この方法により、アプリケーションは必要な特定のリソースにのみアクセスでき、アプリが運用環境で持つアクセス許可がレプリケートされます。 このアプローチの欠点は、アプリケーションで作業する開発者ごとに個別のサービス プリンシパル オブジェクトを作成する必要がある点です。 |
ローカル開発時に開発者の資格情報を使用して、Azure に対してアプリを認証します。 | この方法では、開発者はローカル ワークステーションで Azure CLI、Azure PowerShell、または Azure Developer CLI から Azure にサインインする必要があります。 その後、アプリケーションは資格情報ストアから開発者の資格情報にアクセスし、それらの資格情報を使用してアプリから Azure リソースにアクセスできます。 開発者は前述の開発者ツールのいずれかを使用して自分の Azure アカウントにサインインするだけで済むため、この方法ではセットアップが簡単になるという利点があります。 この方法の欠点は、開発者のアカウントに、アプリケーションで必要とされるよりも多くのアクセス許可があることです。 その結果、アプリケーションは運用環境で実行されるアクセス許可を正確にレプリケートしません。 |
アプリケーションで DefaultAzureCredential を使用する
DefaultAzureCredential は、Microsoft Entra ID に対する認証のための、堅牢な順序付けられた一連のメカニズムです。 各認証メカニズムは、 TokenCredential プロトコルを実装するクラスであり、資格情報と呼 ばれます。 実行時に、DefaultAzureCredential
は最初の資格情報を使用して認証を試みます。 その資格情報がアクセス トークンの取得に失敗した場合は、アクセス トークンが正常に取得されるまで、シーケンス内の次の資格情報が試行されます。 これにより、アプリは環境固有のコードを記述することなく、異なる環境で異なる資格情報を使用できます。
C++ アプリでDefaultAzureCredential
を使用するには、vcpkg を使用して azure-identity パッケージをアプリケーションに追加します。
vcpkg add port azure-identity-cpp
次に、CMake ファイルに次のコードを追加します。
find_package(azure-identity-cpp CONFIG REQUIRED)
target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
Azure サービスには、さまざまな Azure SDK クライアント ライブラリの特殊なクライアント クラスを使用してアクセスします。 次のコード例は、 DefaultAzureCredential
オブジェクトをインスタンス化し、Azure SDK クライアント クラスで使用する方法を示しています。 この場合は、Azure KeyVault シークレットへのアクセスに使用される SecretClient
オブジェクトです。
#include <azure/identity.hpp>
#include <azure/keyvault/secrets.hpp>
int main(){
auto const keyVaultUrl = std::getenv("AZURE_KEYVAULT_URL");
auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>();
Azure::Security::KeyVault::Secrets::SecretClient secretClient(keyVaultUrl, credential);
}
上記のコードがローカル開発ワークステーションで実行されている場合、アプリケーション サービス プリンシパルの環境変数、または Azure CLI などのローカルにインストールされた開発者ツールで、開発者資格情報のセットが検索されます。 どちらの方法も、ローカル開発中に Azure リソースに対してアプリを認証するために使用できます。
Azure にデプロイすると、この同じコードで Azure リソースに対してアプリを認証することもできます。
DefaultAzureCredential
では、Azure サービスに対して自動的に認証するための環境設定とマネージド ID 構成を取得できます。