オンプレミスやサードパーティのデータ センターなど、Azureの外部でホストされているアプリでは、Microsoft Entra ID を介してアプリケーション サービス プリンシパルを使用してAzure サービスに対する認証を行う必要があります。 以下のセクションでは、次のことを説明します。
- サービス プリンシパルを作成するためにアプリケーションをMicrosoft Entraに登録する方法
- スコープのアクセス許可にロールを割り当てる方法
- アプリ コードからサービス プリンシパルを使用して認証する方法
専用のアプリケーション サービス プリンシパルを使用すると、Azure リソースにアクセスするときに最小特権の原則に従うことができます。 アクセス許可は開発中のアプリの特定の要件に限定されるため、他のアプリやサービスを対象としたAzure リソースに誤ってアクセスするのを防ぐことができます。 この方法は、開発環境でアプリが過剰に特権を持たないようにすることで、アプリが運用環境に移行されたときの問題を回避するのにも役立ちます。
アプリがホストされている環境ごとに異なるアプリ登録を作成する必要があります。 これにより、各サービス プリンシパルに対して環境固有のリソースアクセス許可を構成し、ある環境にデプロイされたアプリが、別の環境の一部であるAzureリソースと通信しないようにすることができます。
Azureにアプリを登録する
アプリケーション サービス プリンシパル オブジェクトは、Azure ポータルまたはAzure CLIを使用して、Azureのアプリ登録によって作成されます。
Azure ポータルで、検索バーを使用して App registrations ページに移動します。
App registrations ページで、+ 新規登録を選択します。
「アプリケーションの登録ページ」で、次の手順を実行します。
- [名] フィールドに、アプリ名とターゲット環境を含むわかりやすい値を入力します。
- [サポートされているアカウントの種類] で、この組織のディレクトリ内のアカウントのみ (Microsoft Customer Led only - Single tenant (Microsoft カスタマー主導の場合のみ - シングル テナント)) を選択するか、要件に最も適したオプションを選択します。
[登録] を選択してアプリを登録し、サービス プリンシパルを作成します。
アプリの [アプリ登録] ページで、アプリケーション (クライアント) ID と Directory (テナント) ID コピーし、後でアプリ コード構成で使用できるように一時的な場所に貼り付けます。
[証明書またはシークレットの追加] を選択して、アプリの資格情報を設定します。
[証明書 & シークレット] ページで、[+ 新しいクライアント シークレット] を選択します。
開いた [クライアント シークレットの追加] ポップアップ パネルで次の操作を実行します。
- [説明] に、Current の値を入力します。
- の [有効期限] の値は、既定値の 180 日間のままにします。
- [追加] を選択してシークレットを追加します。
証明書 & シークレット ページで、クライアント シークレットの Value プロパティをコピーして、今後の手順で使用してください。
注
クライアント シークレットの値は、アプリの登録が作成された後に 1 回だけ表示されます。 このクライアント シークレットを無効にすることなく、クライアント シークレットをさらに追加できますが、この値を再度表示する方法はありません。
アプリケーション サービス プリンシパルにロールを割り当てる
次に、どのリソースに対してアプリに必要なロール (アクセス許可) を決定し、作成したサービス プリンシパルにそれらのロールを割り当てます。 ロールは、リソース、リソース グループ、またはサブスクリプション スコープで割り当てることができます。 この例では、ほとんどのアプリですべてのAzureリソースが 1 つのリソース グループにグループ化されるため、リソース グループ スコープでロールを割り当てる方法を示します。
Azure ポータルで、アプリを含むリソース グループの Overview ページに移動します。
左側のナビゲーションから アクセス制御 (IAM) を選択します。
[ アクセス制御 (IAM)] ページで、[ + 追加 ] を選択し、ドロップダウン メニューから [ ロールの割り当ての追加 ] を選択します。 [ ロールの割り当ての追加] ページには、ロールを構成して割り当てるためのタブがいくつか用意されています。
[ ロール ] タブで、検索ボックスを使用して、割り当てるロールを見つけます。 ロールを選択し、[ 次へ] を選択します。
[メンバー] タブで、次の 手順 を実行します。
- [ 値へのアクセスの割り当て] で、[ ユーザー、グループ、またはサービス プリンシパル ] を選択します。
- [メンバー] の値で 、[+ メンバーの選択] を選択して、[メンバーの選択] ポップアップ パネルを開きます。
- 先ほど作成したサービス プリンシパルを検索し、フィルター処理された結果から選択します。 [ 選択 ] を選択してグループを選択し、ポップアップ パネルを閉じます。
- [メンバー] タブの下部にある [確認と割り当て] を選択します。
[ 校閲と割り当て ] タブで、ページの下部にある [校閲と割り当て ] を選択します。
アプリ環境変数を設定する
実行時に、、DefaultAzureCredential、EnvironmentCredential など、ClientSecretCredentialの特定の資格情報で、環境変数の規則によってサービス プリンシパル情報を検索します。 ツールと環境に応じて、Pythonを使用するときに環境変数を構成する方法は複数あります。
選択した方法に関係なく、サービス プリンシパルに対して次の環境変数を構成します。
-
AZURE_CLIENT_ID: Azureで登録されているアプリを識別するために使用されます。 -
AZURE_TENANT_ID: Microsoft Entra テナントの ID。 -
AZURE_CLIENT_SECRET: アプリ用に生成されたシークレット資格情報。
Visual Studio Codeでは、プロジェクトの launch.json フォルダーにある .vscode ファイルで環境変数を設定できます。 これらの値は、アプリの起動時に自動的にプルされます。 ただし、これらの構成はデプロイ中にアプリと共に移動しないため、ターゲット ホスティング環境に環境変数を設定する必要があります。
{
"configurations": [
{
"env": {
"AZURE_CLIENT_ID": "<your-client-id>",
"AZURE_TENANT_ID": "<your-tenant-id>",
"AZURE_CLIENT_SECRET": "<your-client-secret>"
}
}
]
}
アプリからAzure サービスに対する認証
azure-identity ライブラリには、さまざまなシナリオとMicrosoft Entra認証フローのサポートに適合したさまざまなcredentialsTokenCredentialの実装が用意されています。 この手順では、ローカルおよび運用環境でサービス プリンシパルを操作するときに ClientSecretCredential を使用する方法を示します。
コードを実装する
まず、アプリケーションにパッケージを追加します。
pip install azure-identity
次に、アプリでAzure SDKクライアント オブジェクトを作成するPython コードについては、次の手順を実行する必要があります。
-
ClientSecretCredentialモジュールからazure.identityクラスをインポートします。 -
osモジュールをインポートして環境変数を読み取ります。 - 環境変数を読み取って、クライアント ID、テナント ID、およびクライアント シークレットを取得します。
- テナント ID、クライアント ID、クライアント シークレットを渡す
ClientSecretCredentialオブジェクトを作成します。 -
ClientSecretCredentialオブジェクトを Azure SDK クライアント オブジェクト コンストラクターに渡します。
この方法の例を次のコード セグメントに示します。
import os
from azure.identity import ClientSecretCredential
from azure.storage.blob import BlobServiceClient
tenant_id = os.environ.get("AZURE_TENANT_ID")
client_id = os.environ.get("AZURE_CLIENT_ID")
client_secret = os.environ.get("AZURE_CLIENT_SECRET")
credential = ClientSecretCredential(tenant_id, client_id, client_secret)
blob_service_client = BlobServiceClient(
account_url="https://<my_account_name>.blob.core.windows.net",
credential=credential)