チュートリアル: マネージド ID を使用して、.NETのAzure Web アプリにKey Vaultを接続する

Azure Key Vault は、セキュリティを強化して資格情報やその他のシークレットを格納する方法を提供します。 コードがそれらを取得するためにKey Vaultに対して認証する必要があります。 Azure リソースのマネージド ID は、Azure サービスに Microsoft Entra ID で自動的にマネージド ID を提供することで、この問題を解決します。 コードでは、この ID を使用して、Key Vaultを含むMicrosoft Entra認証をサポートするすべてのサービスに対して、コードに資格情報を埋め込まずに認証します。

このチュートリアルでは、Azure Web アプリケーションを作成してAzure App Serviceにデプロイし、マネージド ID を使用して、.NETとAzure CLI用のAzure Key Vault シークレット クライアント ライブラリを使用して、キー コンテナーに対してアプリを認証します。 別の言語、Azure PowerShell、またはAzure ポータルを使用する場合も、同じ原則が適用されます。

App Service Web アプリとデプロイの詳細については、以下を参照してください。

前提条件

このチュートリアルを完了するには、次のものが必要です。

Azure App Serviceに Web アプリが既にデプロイされている場合は、「Key Vaultに接続するように Web アプリを構成する」に進み、key vaultにアクセスするようにアプリを変更します。

.NET Core アプリを作成する

この手順では、ローカル .NET プロジェクトを設定します。

ターミナル ウィンドウで、 akvwebapp という名前のディレクトリを作成し、それに切り替えます。

mkdir akvwebapp
cd akvwebapp

dotnet new Web コマンドを使用して、.NET Web アプリを作成します。

dotnet new web

アプリをローカルで実行して、アプリをAzureにデプロイする前に、アプリがどのように表示されるかを確認します。

dotnet run

Web ブラウザーで、 http://localhost:5000でアプリを開きます。 サンプル アプリから "Hello World!" というメッセージが表示されます。

Web アプリの作成の詳細については、「Azure App Service で ASP.NET Core Web アプリを作成する」を参照してください。

アプリを Azure にデプロイする

この手順では、zip デプロイを使用して、.NET アプリをAzure App Serviceにデプロイします。 Zip デプロイは、App Service に推奨されるパッケージ ベースのデプロイ メカニズムです。 ソース管理からの継続的デリバリーには、代わりに GitHub Actions または Azure DevOps Pipelines を使用します。

リソース グループを作成する

az group create を使用して、キー コンテナーと Web アプリを格納するリソース グループを作成します。

az group create --name "<resource-group>" --location "EastUS"

App Service プランを作成する

az appservice plan create を使用して App Service プラン を作成します。 次の例では、free (myAppServicePlan) レベルに FREE という名前のプランを作成します。

az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE

Web アプリを作成する

プランでmyAppServicePlanを作成します。

重要

キー コンテナーと同様に、Azure Web アプリにはグローバルに一意の名前が必要です。 <webapp-name>を Web アプリの名前に置き換えます。

az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>"

新しいアプリに移動して、実行中であることを確認します。

https://<webapp-name>.azurewebsites.net

新しいAzure Web アプリの既定のページが表示されます。

zip デプロイを使用してローカル アプリをデプロイする

akvwebapp プロジェクト ディレクトリからプロジェクトをビルドし、デプロイ zip を作成します。

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..

Tip

zipのないWindowsでは、PowerShell: Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zipを使用します。

az webapp deploy を使用して、zip を Web アプリにデプロイします。

az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Web ブラウザーでデプロイされたアプリを更新します。

https://<webapp-name>.azurewebsites.net

http://localhost:5000で見たのと同じ "Hello World!" メッセージが表示されます。

Key Vaultに接続するように Web アプリを構成する

このセクションでは、Web アプリがKey Vaultにアクセスし、シークレットを取得するようにアプリ コードを更新できるようにします。

マネージド ID の作成とアクセスの割り当て

マネージド ID を使用して、Key Vaultする Web アプリを認証します。 マネージド ID を使用すると、コード内の資格情報を管理する必要がなくなります。

az webapp identity assign を使用してアプリの ID を作成します。

az webapp identity assign --name "<webapp-name>" --resource-group "<resource-group>"

このコマンドは、次のような JSON スニペットを返します。

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

Role-Based Access Control (RBAC) を使用してキー コンテナーへのアクセス許可を取得するには、Azure CLI コマンド az ロールの割り当てを作成を使用して、ロールを "ユーザー プリンシパル名" (UPN) に割り当てます。

az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/<vault-name>"

<upn><subscription-id>、および<vault-name>を実際の値に置き換えます。 別のリソース グループ名を使用した場合は、"myResourceGroup" も置き換えます。 UPN は一般的に、メール アドレスの形式を取ります (例: username@domain.com)。

キー コンテナーにアクセスするようアプリを変更する

このチュートリアルでは、Azure Key Vault シークレット クライアント ライブラリを使用します。 Azure Key Vault証明書クライアント ライブラリまたは Azure Key Vault キー クライアント ライブラリを使用することもできます。

パッケージのインストール

ターミナル ウィンドウから、Azure Key Vault シークレット クライアント ライブラリと Azure Identity クライアント ライブラリをインストールします。

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

コードを更新する

akvwebapp プロジェクトで Program.cs を開きます。

ファイルの先頭に次の using ディレクティブを追加します。

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

app.MapGet呼び出しの前に次の行を追加し、キー コンテナー名に<vault-name>を更新します。 このコードでは、Web アプリのマネージド ID を介して Key Vault に対して認証するために、DefaultAzureCredential を使用します。 詳細については、 開発者ガイドを参照してください。 また、Key Vault がスロットリングされた場合に備えて、再試行の指数バックオフも構成します。 トランザクションの制限の詳細については、Azure Key Vault調整のガイダンスを参照してください。

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<vault-name>.vault.azure.net/"), new DefaultAzureCredential(), options);

KeyVaultSecret secret = client.GetSecret("<secret-name>");

string secretValue = secret.Value;

app.MapGet("/", () => "Hello World!"); を以下のように更新します。

app.MapGet("/", () => secretValue);

変更を保存。

Web アプリを再デプロイする

デプロイ パッケージを再構築し、再デプロイします。

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

完成した Web アプリにアクセスする

https://<webapp-name>.azurewebsites.net

以前に "Hello World!" と表示された場所に、シークレットの値が表示されます。

次のステップ