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

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

このチュートリアルでは、Azure Key Vaultから情報を読み取るコンソール アプリケーションを構成します。 アプリケーションは、VM のマネージド ID を使用して、Key Vaultに対する認証を行います。

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

  • リソース グループを作成する。
  • キー保管庫を作成してください。
  • キー ボールトにシークレットを追加します。
  • キーボルトからシークレットを取得する。
  • Azure仮想マシンを作成します。
  • 仮想マシンに対してマネージド ID を有効にする。
  • VM ID にアクセス許可を割り当てます。

開始する前に、Key Vault基本的な概念を参照してください。

Azure サブスクリプションをお持ちでない場合は、free アカウントを作成します。

前提条件

Windows、Mac、Linux の場合:

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

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

Azureにサインインする

Azure CLIまたはAzure PowerShellを使用して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 VM を作成します。

Windows Linux
Azure CLI Azure CLI
PowerShell PowerShell
Azure Portal Azure Portal

VM に ID を割り当てる

VM のシステム割り当てマネージド 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)。

VM にサインインする

VM にサインインするには、Azure Windows 仮想マシンに接続してサインインする または Azure Linux 仮想マシンに接続してサインインする の手順に従ってください。

コンソール アプリを設定する

dotnet コマンドを使用して、コンソール アプリを作成し、必要なパッケージをインストールします。

.NET をインストールする

.NETをインストールするには、.NETダウンロード ページに移動します。

サンプル .NET アプリを作成して実行する

コマンド プロンプトを開き、次のコマンドを実行します。

dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run

アプリは"Hello World" をコンソールに出力します。

パッケージをインストールする

コンソール ウィンドウから、Azure Key Vault シークレット クライアント ライブラリと Azure Identity ライブラリをインストールします。

dotnet add package Azure.Security.KeyVault.Secrets
dotnet add package Azure.Identity

コンソール アプリを編集する

Program.csを開き、次のusing ディレクティブを追加します。

using System;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;

Main メソッドを次のコードに置き換え、キー コンテナー名に<vault-name>を更新します。 このコードでは、DefaultAzureCredential を使用して、VM のマネージド ID のトークンを使用するKey Vaultに対する認証を行います。 また、Key Vault がスロットリングされた場合の再試行時の指数バックオフも設定します。

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

        }
    }

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

不要になったら、VM とキー コンテナーを削除します。

次のステップ