チュートリアル:.NET で仮想マシンを使用して Azure Key Vault を使用する

Azure Key Vault は、API キーや、アプリケーション、サービス、IT リソースへのアクセスに必要なデータベース接続文字列などのシークレットを保護するのに役立ちます。

このチュートリアルでは、コンソール アプリケーションで Azure Key Vault から情報を読み取る方法について学習します。 アプリケーションでは、Key Vault に対する認証を行うために、仮想マシンのマネージド ID を使用します。

このチュートリアルでは、次の操作方法について説明します。

  • リソース グループを作成します。
  • Key Vault を作成します。
  • キー コンテナーにシークレットを追加します。
  • キー コンテナーからシークレットを取得する。
  • Azure 仮想マシンを作成します。
  • 仮想マシンに対してマネージド ID を有効にする。
  • VM ID にアクセス許可を割り当てます。

始める前に、Key Vault の基本的な概念を確認してください。

Azure サブスクリプションをお持ちでない場合は、無料アカウントを作成してください。

前提条件

Windows、Mac、Linux:

リソースを作成してアクセス許可を割り当てる

コーディングを開始する前に、いくつかのリソースを作成し、キー コンテナーにシークレットを配置し、アクセス許可を割り当てる必要があります。

Azure へのサインイン

次のコマンドを使用して Azure にサインインします。

az login

リソース グループとキー コンテナーを作成する

このクイックスタートでは、あらかじめ作成しておいた Azure キー コンテナーを使用します。 キー コンテナーは、Azure CLI のクイックスタートAzure PowerShell のクイックスタート、または Azure portal のクイックスタートの手順に従って作成できます。

また、以下の Azure CLI または Azure PowerShell コマンドを実行するだけでもかまいません。

重要

各キー コンテナーには一意の名前が必要です。 次の例では、<your-unique-keyvault-name> をお使いのキー コンテナーの名前に置き換えてください。

az group create --name "myResourceGroup" -l "EastUS"

az keyvault create --name "<your-unique-keyvault-name>" -g "myResourceGroup"

キー コンテナーにシークレットを格納する

mySecret という名前で値が Success! のシークレットを作成しましょう。 シークレットとしては、パスワード、SQL 接続文字列、または安全性とアプリケーションから利用できることの両方を維持する必要がある他の情報などがあります。

新しく作成したキー コンテナーにシークレットを追加するには、次のコマンドを使用します。

az keyvault secret set --vault-name "<your-unique-keyvault-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 <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>

システムによって割り当てられた ID が次のコードに表示されていることにご注意ください。 上記のコマンドの出力は次のようになります。

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

VM ID にアクセス許可を割り当てる

az keyvault set-policy コマンドを実行して、前に作成した ID アクセス許可をキー コンテナーに割り当てます。

az keyvault set-policy --name '<your-unique-key-vault-name>' --object-id <VMSystemAssignedIdentity> --secret-permissions  get list set delete

仮想マシンにサインインする

仮想マシンにサインインするには、Azure Windows 仮想マシンへの接続とサインインに関するページまたは 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

このクイックスタートでは、Azure Key Vault に対する認証を行うために、次の ID パッケージをインストールする必要があります。

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 = "<your-key-vault-name>";
            var kvUri = "https://<your-key-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.");

        }
    }

リソースをクリーンアップする

必要がなくなったら、仮想マシンとキー コンテナーを削除します。

次のステップ