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 アプリとデプロイの詳細については、以下を参照してください。
- App Service の概要
Azure App Service - App Service にファイルをデプロイする
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Azure サブスクリプション。 無料で作成できます。
- .NET 8.0 SDK 以降。
- Azure CLI または Azure PowerShell。
- Azure Key Vault。 キー コンテナーは、Azure ポータル、Azure CLI、または Azure PowerShell を使用して作成できます。
- キーボールトの秘密。 シークレットは、Azure ポータル、PowerShell、または Azure CLI を使用して作成できます。
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 アプリを作成する
重要
キー コンテナーと同様に、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!" と表示された場所に、シークレットの値が表示されます。
次のステップ
Azure Key Vault を .NET の仮想マシンにデプロイされたアプリケーションで使用します - 詳細については、「Azure リソースの管理 ID について」を参照してください。
- Key Vault開発者ガイドを確認します。
- キー コンテナーへのアクセスをセキュリティで保護する