Руководство по Использование Azure Key Vault с виртуальной машиной в .NET

Azure Key Vault помогает защитить секреты, такие как ключи API, строки подключения к базам данных, необходимые для доступа к приложениям, службам и ИТ-ресурсам.

Из этого руководства вы узнаете, как настроить консольное приложение для считывания сведений из Azure Key Vault. Приложение будет использовать управляемое удостоверение виртуальной машины для аутентификации в Key Vault.

В этом руководстве описаны следующие процедуры.

  • Создайте группу ресурсов.
  • Создать хранилище ключей.
  • Добавление секрета в хранилище ключей.
  • получение секрета из хранилища ключей;
  • Создайте виртуальную машину Azure.
  • Включить управляемое удостоверение для виртуальной машины.
  • Назначение разрешений для идентификатора виртуальной машины.

Перед началом работы ознакомьтесь c основными понятиями службы Key Vault.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure.

Предварительные требования

Для Windows, Mac и Linux:

Создание ресурсов и назначение разрешений

Перед началом программирования необходимо создать некоторые ресурсы, поместить секрет в хранилище ключей и назначить разрешения.

Вход в Azure

Чтобы войти в Azure, выполните следующую команду:

az login

Создание группы ресурсов и хранилища ключей

В этом кратком руководстве используется предварительно созданное хранилище ключей Azure. Хранилище ключей можно создать, выполнив действия, описанные в кратких руководствах по Azure CLI, Azure PowerShell или порталу Azure.

Можно также выполнить команды 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 Портал Azure

Назначение удостоверения виртуальной машине

Создайте назначаемое системой удостоверение для виртуальной машины с помощью следующего примера:

az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>

Обратите внимание на присвоенный системой идентификатор, который отображается в следующем коде. Выходные данные приведенной выше команды выглядят следующим образом.

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

Назначение разрешения для идентификатора виртуальной машины

Предоставьте созданному выше удостоверению разрешение для хранилища ключей, выполнив команду az keyvault set-policy.

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

Вход в виртуальную машину

Чтобы войти в виртуальную машину, следуйте инструкциям по подключению или входу в виртуальную машину на платформе Windows или Linux.

Настройка консольного приложения

Создайте консольное приложение и установите необходимые пакеты с помощью команды dotnet.

Установка .NET Core

Чтобы установить .NET Core, перейдите на страницу ​​загрузки .NET.

Создание и запуск примера приложения .NET

Откройте командную строку.

Вы можете вывести Hello World на консоль, выполнив следующие команды.

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

Установка пакета

В окне консоли установите клиентскую библиотеку секретов Azure Key Vault для .NET:

dotnet add package Azure.Security.KeyVault.Secrets

Для работы с этим кратким руководством необходимо установить следующий пакет удостоверений для аутентификации в 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(), которая использует токен из управляемого удостоверения приложения. В ней также реализована экспоненциальная задержка для повторных попыток на случай регулирования запросов к хранилищу ключей.

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

        }
    }

Очистка ресурсов

Удалите виртуальную машину и хранилище ключей, если они больше не нужны.

Дальнейшие действия