Azure Key Vaultは、API キー、アプリケーション、サービス、IT リソースにアクセスするために必要なデータベース接続文字列などのシークレットを保護するのに役立ちます。
このチュートリアルでは、Azure Key Vaultから情報を読み取るコンソール アプリケーションを取得する方法について説明します。 アプリケーションでは、仮想マシンのマネージド ID を使用して、Key Vaultに対する認証を行います。
このチュートリアルでは、次の操作方法について説明します。
- リソース グループを作成する。
- キー保管庫を作成してください。
- キー ボールトにシークレットを追加します。
- キーボルトからシークレットを取得する。
- Azure仮想マシンを作成します。
- 仮想マシンに対してマネージド ID を有効にする。
- VM ID にアクセス許可を割り当てます。
開始する前に、Key Vault基本的な概念を参照してください。
Azure サブスクリプションをお持ちでない場合は、free アカウントを作成します。
前提条件
Windows、Mac、Linux の場合:
リソースを作成してアクセス許可を割り当てる
コーディングを開始する前に、いくつかのリソースを作成し、キー コンテナーにシークレットを配置し、アクセス許可を割り当てる必要があります。
Azureにサインインする
次のコマンドを使用してAzureにサインインするには:
az login
リソース グループとキー コンテナーを作成する
このクイック スタートでは、事前に作成されたAzureキーボールトを使用します。 次のクイックスタート内の手順に従って、キー コンテナーを作成できます。
または、これらのAzure CLIまたはAzure PowerShellコマンドを実行することもできます。
重要
各キー ボールトには一意の名前が必要です。 次の例では、 <vault-name> をキー コンテナーの名前に置き換えます。
az group create --name "myResourceGroup" -l "EastUS"
az keyvault create --name "<vault-name>" -g "myResourceGroup" --enable-rbac-authorization true
キー コンテナーにシークレットを格納する
mySecret という名前で値が Success! のシークレットを作成しましょう。 シークレットは、パスワード、SQL 接続文字列、またはアプリケーションでセキュリティで保護され、使用できるようにするために必要なその他の情報です。
新しく作成したキー コンテナーにシークレットを追加するには、次のコマンドを使用します。
az keyvault secret set --vault-name "<vault-name>" --name "mySecret" --value "Success!"
仮想マシンを作成する
次のいずれかの方法を使用して、Windowsまたは Linux 仮想マシンを作成します。
| Windows | Linux |
|---|---|
| Azure CLI | Azure CLI |
| PowerShell | PowerShell |
| Azure portal | Azure portal |
VM に ID を割り当てる
次の例を使用して、仮想マシンのシステム割り当て ID を作成します。
az vm identity assign --name <vm-name> --resource-group <resource-group>
システムによって割り当てられた ID が次のコードに表示されていることにご注意ください。 上記のコマンドの出力は次のようになります。
{
"systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userAssignedIdentities": {}
}
VM ID にアクセス許可を割り当てる
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)。
仮想マシンにサインインする
仮想マシンにサインインするには、Connect の指示に従って、Azure Windows仮想マシンまたは Connect にサインインし、Azure Linux 仮想マシンにサインインします。
コンソール アプリを設定する
コンソール アプリを作成し、dotnet コマンドを使用して必要なライブラリをインストールします。
.NET Core のインストール
.NET Core をインストールするには、.NET ダウンロード ページに移動します。
サンプル .NET アプリを作成して実行する
コマンド プロンプトを開きます。
"Hello World" をコンソールに出力するには、次のコマンドを実行します。
dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run
パッケージをインストールする
コンソール ウィンドウから、.NET用の Azure Key Vault シークレット クライアント ライブラリをインストールします。
dotnet add package Azure.Security.KeyVault.Secrets
このクイック スタートでは、次の ID パッケージをインストールして、Azure Key Vaultに対する認証を行う必要があります。
dotnet add package Azure.Identity
コンソール アプリを編集する
Program.cs ファイルを開き、次のパッケージを追加します。
using System;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
これらの行を追加し、URI は実際のキー コンテナーの vaultUri に合わせて更新します。 下のコードでは DefaultAzureCredential() を使ってキー コンテナーに対する認証を行います。このキー コンテナーでは、アプリケーション マネージド ID から受け取るトークンを使って認証を行います。 また、キー コンテナーがスロットルされている場合の再試行にはエクスポネンシャル バックオフが使用されています。
class Program
{
static void Main(string[] args)
{
string secretName = "mySecret";
string keyVaultName = "<vault-name>";
var kvUri = "https://<vault-name>.vault.azure.net";
SecretClientOptions options = new SecretClientOptions()
{
Retry =
{
Delay= TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(16),
MaxRetries = 5,
Mode = RetryMode.Exponential
}
};
var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential(),options);
Console.Write("Input the value of your secret > ");
string secretValue = Console.ReadLine();
Console.Write("Creating a secret in " + keyVaultName + " called '" + secretName + "' with the value '" + secretValue + "' ...");
client.SetSecret(secretName, secretValue);
Console.WriteLine(" done.");
Console.WriteLine("Forgetting your secret.");
secretValue = "";
Console.WriteLine("Your secret is '" + secretValue + "'.");
Console.WriteLine("Retrieving your secret from " + keyVaultName + ".");
KeyVaultSecret secret = client.GetSecret(secretName);
Console.WriteLine("Your secret is '" + secret.Value + "'.");
Console.Write("Deleting your secret from " + keyVaultName + " ...");
client.StartDeleteSecret(secretName);
System.Threading.Thread.Sleep(5000);
Console.WriteLine(" done.");
}
}
リソースをクリーンアップする
必要がなくなったら、仮想マシンとキー コンテナーを削除します。