Azure Key Vault は、セキュリティを強化して資格情報やその他のシークレットを格納する方法を提供します。 コードがそれらを取得するためにKey Vaultに対して認証する必要があります。 Azure リソースの管理 IDAzure サービスにMicrosoft Entra IDで自動的に管理される ID を提供することで、この問題の解決に役立ちます。 この ID を使用すると、Key Vaultを含むMicrosoft Entra認証をサポートするすべてのサービスに対して認証を行うことができます。コードに資格情報を表示する必要はありません。
このチュートリアルでは、web アプリケーションAzure作成し、Azure App Service にデプロイします。 マネージド ID を使用して、Azure Key Vault の .NET 用シークレット クライアント ライブラリ と Azure CLI を用いて、Azure Key Vault で Azure Web アプリを認証します。 選択した開発言語、Azure PowerShell、Azure ポータルを使用する場合も、同じ基本原則が適用されます。
このチュートリアルで説明Azure アプリサービス Web アプリケーションとデプロイの詳細については、次を参照してください。
- App Service の概要
Azure App Service - ローカル Git デプロイを Azure App Service に配置します
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Azure サブスクリプション。 無料で作成できます。
- .NET 8.0 SDK (またはそれ以降)。
- バージョン 2.28.0 以上の Git インストール。
- Azure CLI または Azure PowerShell。
- Azure Key Vault。 キー コンテナーは、Azure ポータル、Azure CLI、または Azure PowerShell を使用して作成できます。
- キーボールトの秘密。 シークレットは、Azure ポータル、PowerShell、または Azure CLI を使用して作成できます。
web アプリケーションが既に Azure App Service にデプロイされている場合は、キー コンテナーへの Web アプリアクセスの構成および web アプリケーション コードの変更セクションに進むことができます。
.NET Core アプリを作成する
この手順では、ローカル .NET Core プロジェクトを設定します。
マシンのターミナル ウィンドウで、akvwebapp という名前のディレクトリを作成し、現在のディレクトリをそのディレクトリに変更します。
mkdir akvwebapp
cd akvwebapp
dotnet new web コマンドを使用して.NET Core アプリを作成します。
dotnet new web
アプリケーションをローカルで実行して、アプリケーションをAzureにデプロイするときの外観を把握します。
dotnet run
Web ブラウザーでアプリ (http://localhost:5000) に移動します。
ページに表示されるサンプル アプリの "Hello World!" メッセージが表示されます。
Azure用の Web アプリケーションの作成の詳細については、「
アプリを Azure にデプロイする
この手順では、ローカル Git を使用して、.NET Core アプリケーションをAzure App Serviceにデプロイします。 アプリケーションを作成してデプロイする方法の詳細については、「
ローカル Git デプロイを構成する
ターミナル ウィンドウで Ctrl + C キーを押して Web サーバーを閉じます。 .NET Core プロジェクトの Git リポジトリを初期化します。
git init --initial-branch=main
git add .
git commit -m "first commit"
FTP とローカル Git を使用して、deployment ユーザーを使用してAzure Web アプリをデプロイできます。 デプロイ ユーザーを構成したら、すべてのAzureデプロイに使用できます。 アカウント レベルのデプロイ ユーザー名とパスワードは、Azure サブスクリプションの資格情報とは異なります。
デプロイ ユーザーを構成するには、az webapp deployment user set コマンドを実行します。 次のガイドラインに準拠したユーザー名とパスワードを選択してください。
- ユーザー名は、Azure内で一意である必要があります。 ローカルの Git プッシュでは、アット マーク (@) を含めることはできません。
- パスワードは長さが 8 文字以上で、文字、数字、記号のうち 2 つを含む必要があります。
az webapp deployment user set --user-name "<username>" --password "<password>"
JSON 出力には、パスワードが null として表示されます。
'Conflict'. Details: 409 エラーが発生した場合は、ユーザー名を変更します。
'Bad Request'. Details: 400 エラーが発生した場合は、より強力なパスワードを使用します。
Web アプリのデプロイに使用できるよう、ユーザー名とパスワードを記録してください。
リソース グループを作成する
リソース グループは、Azureリソースをデプロイして管理する論理コンテナーです。 キー コンテナーと Web アプリの配置先となるリソース グループは、az group create コマンドを使用して作成します。
az group create --name "<resource-group>" -l "EastUS"
App Service プランを作成する
app service プランを作成するには、Azure CLI az appservice plan create コマンドを使用します。 次の例では、myAppServicePlan 価格レベルの FREE という名前の App Service プランを作成します。
az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE
App Service プランが作成されると、Azure CLIには次のような情報が表示されます。
{
"adminSiteName": null,
"appServicePlanName": "myAppServicePlan",
"geoRegion": "West Europe",
"hostingEnvironmentProfile": null,
"id": "/subscriptions/0000-0000/resourceGroups/<resource-group>/providers/Microsoft.Web/serverfarms/myAppServicePlan",
"kind": "app",
"location": "West Europe",
"maximumNumberOfWorkers": 1,
"name": "myAppServicePlan",
< JSON data removed for brevity. >
"targetWorkerSizeId": 0,
"type": "Microsoft.Web/serverfarms",
"workerTierName": null
}
詳細については、「
Web アプリを作成する
App Service プランでmyAppServicePlanを作成します。
重要
キー コンテナーと同様に、Azure Web アプリには一意の名前が必要です。 次の例の <webapp-name> は、実際の Web アプリの名前に置き換えてください。
az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>" --deployment-local-git
Web アプリが作成されると、Azure CLIには次のような出力が表示されます。
Local git is configured with url of 'https://<username>@<your-webapp-name>.scm.azurewebsites.net/<ayour-webapp-name>.git'
{
"availabilityState": "Normal",
"clientAffinityEnabled": true,
"clientCertEnabled": false,
"clientCertExclusionPaths": null,
"cloningInfo": null,
"containerSize": 0,
"dailyMemoryTimeQuota": 0,
"defaultHostName": "<your-webapp-name>.azurewebsites.net",
"deploymentLocalGitUrl": "https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git",
"enabled": true,
< JSON data removed for brevity. >
}
Git リモートの URL は deploymentLocalGitUrl プロパティに https://<username>@<webapp-name>.scm.azurewebsites.net/<webapp-name>.git 形式で出力されます。 この URL を保存します。 この情報は後で必要になります。
次に、main ブランチからデプロイするように Web アプリを構成します。
az webapp config appsettings set -g MyResourceGroup --name "<webapp-name>" --settings deployment_branch=main
次のコマンドを使用して新しいアプリに移動します。
<webapp-name> は、実際のアプリの名前に置き換えてください。
https://<webapp-name>.azurewebsites.net
新しいAzure Web アプリの既定の Web ページが表示されます。
ローカル アプリをデプロイする
ローカル ターミナル ウィンドウに戻り、ローカル Git リポジトリに Azure リモートを追加します。 次のコマンドの <deployment-url> は、「Web アプリを作成する」セクションで保存した Git リモートの URL に置き換えてください。
git remote add azure <deployment-url>
次のコマンドを使用して、Azure リモートにプッシュしてアプリをデプロイします。 Git Credential Manager によって資格情報の入力を求めるメッセージが表示されたら、「ローカル Git デプロイを構成する」セクションで作成した資格情報を使用してください。
git push azure main
このコマンドの実行には数分かかることがあります。 実行中、次のような情報が表示されます。
Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 285 bytes | 95.00 KiB/s, done. Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 remote: Deploy Async remote: Updating branch 'main'. remote: Updating submodules. remote: Preparing deployment for commit id 'd6b54472f7'. remote: Repository path is /home/site/repository remote: Running oryx build... remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx remote: You can report issues at https://github.com/Microsoft/Oryx/issues remote: remote: Oryx Version : 0.2.20200114.13, Commit: 204922f30f8e8d41f5241b8c218425ef89106d1d, ReleaseTagName: 20200114.13 remote: Build Operation ID: |imoMY2y77/s=.40ca2a87_ remote: Repository Commit : d6b54472f7e8e9fd885ffafaa64522e74cf370e1 . . . remote: Deployment successful. remote: Deployment Logs : 'https://<your-webapp-name>.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/d6b54472f7e8e9fd885ffafaa64522e74cf370e1/log' To https://<your-webapp-name>.scm.azurewebsites.net:443/<your-webapp-name>.git d87e6ca..d6b5447 main -> main
デプロイされたアプリケーションに移動 (または最新の情報に更新) します。
http://<webapp-name>.azurewebsites.net
前に http://localhost:5000 にアクセスしたときに表示された "Hello World!" メッセージが表示されます。
Git を使用した Web アプリケーションのデプロイの詳細については、「
Key Vaultに接続するように Web アプリを構成する
このセクションでは、Key Vaultへの Web アクセスを構成し、Key Vaultからシークレットを取得するようにアプリケーション コードを更新します。
マネージド ID の作成とアクセスの割り当て
このチュートリアルでは、管理 ID を使用して、Key Vaultに対する認証を行います。 マネージド ID によって自動的にアプリケーションの資格情報が管理されます。
Azure CLIで、アプリケーションの ID を作成するには、az webapp-identity assign コマンドを実行します。
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を使用することもできます。
パッケージのインストール
ターミナル ウィンドウから、.NETおよび Azure Identity クライアント ライブラリ パッケージ用の Azure Key Vault シークレット クライアント ライブラリをインストールします。
dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets
コードを更新する
.NET 5.0 以前では Startup.cs ファイルを見つけて開くか、.NET 6.0 では akvwebapp プロジェクト内の Program.cs ファイルを見つけて開いてください。
次の行をヘッダーに追加します。
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;
app.UseEndpoints 呼び出し (.NET 5.0 以前) または app.MapGet 呼び出し (.NET 6.0) の前に次の行を追加し、キー コンテナーのvaultUriを反映するように URI を更新します。 このコードでは、DefaultAzureCredential() を使用してKey Vaultに対する認証を行い、マネージド ID からのトークンを使用して認証します。 Key Vaultへの認証の詳細については、Developer のガイドを参照してください。 このコードでは、Key Vault がレート制限されている場合に備えて、再試行の際に指数バックオフを使用します。 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;
.NET 5.0 以前
行 await context.Response.WriteAsync("Hello World!"); を次の行のように更新します。
await context.Response.WriteAsync(secretValue);
.NET 6.0
行 app.MapGet("/", () => "Hello World!"); を次の行のように更新します。
app.MapGet("/", () => secretValue);
次の手順に進む前に、必ず変更内容を保存してください。
Web アプリを再デプロイする
コードを更新したので、次の Git コマンドを使用して、コードをAzureに再デプロイできます。
git add .
git commit -m "Updated web app to access my key vault"
git push azure main
完成した Web アプリにアクセスする
http://<webapp-name>.azurewebsites.net
"Hello World!" が表示される前に、シークレットの値が表示されるはずです。
次のステップ
Azure Key Vault を .NET の仮想マシンにデプロイされたアプリケーションで使用します - Azure リソースの管理 ID の詳細を確認します
- 開発者ガイドを参照する
- キー コンテナーへのアクセスをセキュリティで保護する