クイックスタート: .NET 用 Azure Key Vault シークレット クライアント ライブラリ

.NET 用 Azure Key Vault シークレットクライアント ライブラリを使ってみます。 Azure Key Vault は、シークレットのセキュリティで保護されたストアを提供するクラウド サービスです。 キー、パスワード、証明書、およびその他のシークレットを安全に保管することができます。 Azure Key Vault は、Azure Portal を使用して作成および管理できます。 このクイックスタートでは、.NET クライアント ライブラリを使用して Azure キー コンテナーからシークレットを作成、取得、および削除する方法について説明します

Key Vault クライアント ライブラリのリソースは、次のとおりです。

API リファレンスのドキュメント | ライブラリのソース コード | パッケージ (NuGet)

Key Vault とシークレットの詳細については、以下を参照してください。

前提条件

このクイック スタートでは、dotnet および Azure CLI または Azure PowerShell を使用しています。

セットアップ

このクイックスタートでは、Azure CLI と Azure Identity ライブラリを使用して、Azure サービスに対するユーザーの認証を行います。 開発者は、Visual Studio または Visual Studio Code を使用してその呼び出しを認証することもできます。詳細については、Azure Identity クライアント ライブラリを使用してクライアントを認証する方法に関するページを参照してください。

Azure へのサインイン

  1. az login コマンドを実行します。

    az login
    

    CLI で既定のブラウザーを開くことができる場合、開いたブラウザに Azure サインイン ページが読み込まれます。

    それ以外の場合は、 https://aka.ms/devicelogin でブラウザー ページを開き、ターミナルに表示されている認証コードを入力します。

  2. ブラウザーでアカウントの資格情報を使用してサインインします。

キー コンテナーへのアクセス許可を付与する

ロールベースのアクセス制御 (RBAC) を使用してキー コンテナーへのアクセス許可をアプリケーションに付与するには、Azure CLI コマンド az role assignment create を使用してロールを割り当てます。

az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"

<app-id>、<subscription-id>、<resource-group-name>、<your-unique-keyvault-name> は実際の値に置き換えてください。 <app-id> は、Azure AD に登録済みのアプリケーションのアプリケーション (クライアント) ID です。

新しい .NET コンソール アプリを作成する

  1. コマンド シェルで、次のコマンドを実行して、key-vault-console-app という名前のプロジェクトを作成します。

    dotnet new console --name key-vault-console-app
    
  2. 新しく作成した 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 コンソール アプリに変更を加えます。

  1. 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.");
            }
        }
    }
    

テストして検証する

  1. 次のコマンドを実行して、アプリを実行します。

    dotnet run
    
  2. メッセージが表示されたら、シークレットの値を入力します (例: 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 の詳細およびアプリとの統合方法の詳細については、以下の記事を参照してください。