クイックスタート: .NET 用 Azure Key Vault シークレット クライアント ライブラリ
.NET 用 Azure Key Vault シークレットクライアント ライブラリを使ってみます。 Azure Key Vault は、シークレットのセキュリティで保護されたストアを提供するクラウド サービスです。 キー、パスワード、証明書、およびその他のシークレットを安全に保管することができます。 Azure Key Vault は、Azure Portal を使用して作成および管理できます。 このクイックスタートでは、.NET クライアント ライブラリを使用して Azure キー コンテナーからシークレットを作成、取得、および削除する方法について説明します
Key Vault クライアント ライブラリのリソースは、次のとおりです。
API リファレンスのドキュメント | ライブラリのソース コード | パッケージ (NuGet)
Key Vault とシークレットの詳細については、以下を参照してください。
前提条件
- Azure サブスクリプション - 無料アカウントを作成します
- .NET 6 SDK 以降
- Azure CLI または Azure PowerShell。
- キー コンテナー - Azure portal、Azure CLI、または Azure PowerShell を使って作成できます
このクイック スタートでは、dotnet
および Azure CLI または Azure PowerShell を使用しています。
セットアップ
このクイックスタートでは、Azure CLI と Azure Identity ライブラリを使用して、Azure サービスに対するユーザーの認証を行います。 開発者は、Visual Studio または Visual Studio Code を使用してその呼び出しを認証することもできます。詳細については、Azure Identity クライアント ライブラリを使用してクライアントを認証する方法に関するページを参照してください。
Azure へのサインイン
az login
コマンドを実行します。az login
CLI で既定のブラウザーを開くことができる場合、開いたブラウザに Azure サインイン ページが読み込まれます。
それ以外の場合は、 https://aka.ms/devicelogin でブラウザー ページを開き、ターミナルに表示されている認証コードを入力します。
ブラウザーでアカウントの資格情報を使用してサインインします。
キー コンテナーへのアクセス許可を付与する
ロールベースのアクセス制御 (RBAC) を使用してキー コンテナーに対するアクセス許可を取得するには、Azure CLI コマンドの az role assignment create を使用して、"ユーザー プリンシパル名" (UPN) にロールを割り当てます。
az role assignment create --role "Key Vault Secrets Officer" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
<upn>、<subscription-id>、<resource-group-name>、<your-unique-keyvault-name> は実際の値に置き換えます。 UPN は一般的に、メール アドレスの形式を取ります (例: username@domain.com)。
新しい .NET コンソール アプリを作成する
コマンド シェルで、次のコマンドを実行して、
key-vault-console-app
という名前のプロジェクトを作成します。dotnet new console --name key-vault-console-app
新しく作成した key-vault-console-app ディレクトリに移動し、次のコマンドを実行してプロジェクトをビルドします。
dotnet build
ビルドの出力に警告やエラーが含まれないようにする必要があります。
Build succeeded. 0 Warning(s) 0 Error(s)
パッケージのインストール
コマンド シェルから、.NET 用 Azure Key Vault シークレット クライアント ライブラリをインストールします。
dotnet add package Azure.Security.KeyVault.Secrets
このクイックスタートでは、Azure Identity クライアント ライブラリもインストールする必要があります。
dotnet add package Azure.Identity
環境変数の設定
このアプリケーションでは、KEY_VAULT_NAME
という環境変数にキー コンテナーの名前を使用します。
Windows
set KEY_VAULT_NAME=<your-key-vault-name>
Windows PowerShell
$Env:KEY_VAULT_NAME="<your-key-vault-name>"
macOS または Linux
export KEY_VAULT_NAME=<your-key-vault-name>
オブジェクト モデル
シークレットは、.NET 用 Azure Key Vault シークレット クライアント ライブラリを使用して管理できます。 クライアントの作成、シークレットの設定、シークレットの取得、シークレットの削除を行う方法を「コード例」セクションで紹介しています。
コード例
ディレクティブの追加
Program.cs の先頭に次のディレクティブを追加します。
using System;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
クライアントの認証と作成
ほとんどの Azure サービスに対するアプリケーション要求は、認可される必要があります。 Azure Identity クライアント ライブラリによって提供される DefaultAzureCredential クラスを使うことは、コード内の Azure サービスへのパスワードレス接続を実装するための推奨される方法です。 DefaultAzureCredential
は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境) で異なる認証方法をアプリに使用できます。
このクイックスタートでは、DefaultAzureCredential
は Azure CLI にログインしたローカル開発ユーザーの資格情報を使って、キー コンテナーに対して認証されます。 アプリケーションが Azure にデプロイされると、同じDefaultAzureCredential
コードで、App Service、仮想マシン、またはその他のサービスに割り当てられているマネージド ID を自動的に検出して使用できます。 詳細については、マネージド ID の概要に関するページを参照してください。
この例では、キー コンテナーの名前は、https://<your-key-vault-name>.vault.azure.net
という形式で、キー コンテナーの URI に展開されます。 キー コンテナーに対する認証の詳細については、開発者ガイドを参照してください。
string keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");
var kvUri = "https://" + keyVaultName + ".vault.azure.net";
var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
シークレットを保存する
コンソール アプリの認証が済んだら、キー コンテナーにシークレットを追加します。 このタスクには、SetSecretAsync メソッドを使用します。
このメソッドの 1 番目のパラメータは、シークレットの名前を受け取ります。 このサンプルの変数 secretName
には、文字列 "mySecret" が格納されています。
このメソッドの 2 番目のパラメータは、シークレットの値を受け取ります。 このサンプルのシークレットは、ユーザーによってコマンド ラインから入力されて、変数 secretValue
に格納されます。
await client.SetSecretAsync(secretName, secretValue);
Note
シークレット名が存在する場合は、コードによって、そのシークレットの新しいバージョンが作成されます。
シークレットを取得する
先ほど設定した値は、GetSecretAsync メソッドを使用して取得できます。
var secret = await client.GetSecretAsync(secretName);
これで、シークレットが secret.Value
として保存されました。
シークレットを削除します
最後に、StartDeleteSecretAsync メソッドと PurgeDeletedSecretAsync メソッドを使用して、キー コンテナーからシークレットを削除してみましょう。
var operation = await client.StartDeleteSecretAsync(secretName);
// You only need to wait for completion if you want to purge or recover the key.
await operation.WaitForCompletionAsync();
await client.PurgeDeletedSecretAsync(secretName);
サンプル コード
Key Vault を対話的に操作するために、次の手順を完了して .NET コンソール アプリに変更を加えます。
Program.cs のコードを次のコードに置き換えます。
using System; using System.Threading.Tasks; using Azure.Identity; using Azure.Security.KeyVault.Secrets; namespace key_vault_console_app { class Program { static async Task Main(string[] args) { const string secretName = "mySecret"; var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME"); var kvUri = $"https://{keyVaultName}.vault.azure.net"; var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential()); Console.Write("Input the value of your secret > "); var secretValue = Console.ReadLine(); Console.Write($"Creating a secret in {keyVaultName} called '{secretName}' with the value '{secretValue}' ..."); await client.SetSecretAsync(secretName, secretValue); Console.WriteLine(" done."); Console.WriteLine("Forgetting your secret."); secretValue = string.Empty; Console.WriteLine($"Your secret is '{secretValue}'."); Console.WriteLine($"Retrieving your secret from {keyVaultName}."); var secret = await client.GetSecretAsync(secretName); Console.WriteLine($"Your secret is '{secret.Value.Value}'."); Console.Write($"Deleting your secret from {keyVaultName} ..."); DeleteSecretOperation operation = await client.StartDeleteSecretAsync(secretName); // You only need to wait for completion if you want to purge or recover the secret. await operation.WaitForCompletionAsync(); Console.WriteLine(" done."); Console.Write($"Purging your secret from {keyVaultName} ..."); await client.PurgeDeletedSecretAsync(secretName); Console.WriteLine(" done."); } } }
テストして検証する
次のコマンドを実行して、アプリを実行します。
dotnet run
メッセージが表示されたら、シークレットの値を入力します (例: mySecretPassword)。
次のような出力が表示されます。
Input the value of your secret > mySecretPassword
Creating a secret in <your-unique-keyvault-name> called 'mySecret' with the value 'mySecretPassword' ... done.
Forgetting your secret.
Your secret is ''.
Retrieving your secret from <your-unique-keyvault-name>.
Your secret is 'mySecretPassword'.
Deleting your secret from <your-unique-keyvault-name> ... done.
Purging your secret from <your-unique-keyvault-name> ... done.
次のステップ
Key Vault の詳細およびアプリとの統合方法の詳細については、以下の記事を参照してください。