Использование секретов Azure Key Vault в Azure Pipelines

Сервисы Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

Azure Key Vault — это облачная служба, которая помогает разработчикам безопасно хранить конфиденциальные сведения и управлять ими, такими как ключи API, учетные данные и сертификаты. Key Vault поддерживает два типа контейнеров: хранилища и пулы управляемого аппаратного модуля безопасности (HSM). Хранилища могут хранить как программные ключи, так и ключи с поддержкой HSM, а также секреты и сертификаты. Менеджируемые пулы HSM поддерживают исключительно ключи, поддерживаемые HSM.

В этой статье вы узнаете, как создать хранилище ключей, добавить секрет, настроить политики доступа, а затем использовать этот секрет в Azure Pipelines. В этом руководстве используется хранилище ключей с доступом к общедоступной сети. Если вам нужно получить доступ к хранилищу закрытых ключей в конвейере, см. раздел "Доступ к хранилищу закрытых ключей". Сведения о связи секретов Key Vault с группами переменных см. в разделе Link a variable group to secrets in Azure Key Vault.

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

Категория Требования
Azure DevOps организация Azure DevOps.
проект Azure DevOps.
Лазурный Подписка Azure.

Получение кода

Если у вас нет собственного проекта, импортируйте следующий пример репозитория в репозиторий Azure:

  1. Войдите в свою организацию Azure DevOps и перейдите в проект.

  2. Выберите Repos и нажмите кнопку "Импорт". Введите следующий URL-адрес репозитория и нажмите кнопку "Импорт".

    https://github.com/MicrosoftDocs/pipelines-dotnet-core
    

Создание хранилища ключей

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

  1. Перейдите на портал Azure и выберите Azure Cloud Shell в правом верхнем углу.

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

    az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
    
  3. Задайте регион Azure по умолчанию. Чтобы просмотреть список доступных регионов, выполните команду az account list-locations.

    az config set defaults.location=<YOUR_REGION>
    
  4. Создание группы ресурсов

    az group create --name <YOUR_RESOURCE_GROUP_NAME>
    
  5. Создайте новое хранилище ключей.

    az keyvault create \
      --name <YOUR_KEY_VAULT_NAME> \
      --resource-group <YOUR_RESOURCE_GROUP_NAME>
    
  6. Добавьте секрет в хранилище ключей.

    az keyvault secret set \
      --name <YOUR_SECRET_NAME> \
      --value <YOUR_ACTUAL_SECRET> \
      --vault-name <YOUR_KEY_VAULT_NAME>
    

Настройка проверки подлинности

После создания хранилища ключей необходимо настроить проверку подлинности. Выберите Управляемое удостоверение или Служебный принципал и следуйте инструкциям по настройке аутентификации.

Создание управляемой идентичности, назначенной пользователем

  1. Перейдите на портал Azure, а затем найдите Managed Identities в строке поиска.

  2. Выберите "Создать" и укажите следующие сведения:

    • Подписка. Выберите подписку Azure в раскрывающемся меню.
    • Группа ресурсов: выберите существующую группу ресурсов или создайте новую.
    • Регион: выберите регион, в котором создается управляемое удостоверение.
    • Имя: Введите имя управляемой идентичности, назначенной пользователем.
  3. Выберите "Просмотр и создание", а затем нажмите кнопку "Создать ", чтобы начать развертывание.

  4. После завершения развертывания выберите "Перейти к ресурсу" и скопируйте идентификатор подписки и значения идентификатора клиента . Эти значения потребуются на последующих шагах.

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

Настройка политик доступа к хранилищу ключей

  1. Перейдите на портал Azure и используйте строку поиска, чтобы найти созданное ранее хранилище ключей.

  2. Выберите политики доступа, а затем нажмите Создать, чтобы добавить новую политику.

  3. В разделе "Разрешения секрета" установите флажки "Получить " и "Список ".

  4. Нажмите кнопку Далее. Вставьте идентификатор клиента для управляемого удостоверения, созданного ранее, в строку поиска, а затем выберите управляемое удостоверение.

  5. Выберите Далее, затем снова выберите Далее.

  6. Просмотрите сведения о политике доступа и нажмите кнопку "Создать ", чтобы применить политику.

Создание подключения службы

  1. Войдите в Azure DevOps, а затем перейдите в проект.

  2. Выберите Параметры проекта>Подключения к службам>Новое подключение к службе.

  3. Выберите Azure Resource Manager и нажмите кнопку "Далее".

  4. Для Типа удостоверения выберите Управляемое удостоверение.

  5. В разделе "Шаг 1. Сведения об управляемом удостоверении" укажите следующие сведения:

    • Подписка для управляемого удостоверения: выберите подписку, содержащую управляемое удостоверение.
    • Группа ресурсов для управляемой идентичности: выберите группу ресурсов, в которой размещено ваше управляемое удостоверение.
    • Управляемое удостоверение: выберите его из выпадающего списка.
  6. Для шага 2. Область Azure укажите следующие сведения:

    • Уровень области подключения к службе: выбор подписки.
    • Подписка на подключение к службе: выберите подписку, к которой управляемое удостоверение получает доступ.
    • Группа ресурсов для подключения к службе: (необязательно) Укажите группу ресурсов, чтобы ограничить доступ управляемого удостоверения к одной группе ресурсов.
  7. На шаге 3. Сведения о подключении к службе приведены ниже.

    • Имя подключения службы: введите имя подключения к службе.
    • Справочник по управлению службами: (необязательно) Включите сведения о контексте из базы данных ITSM.
    • Описание: (необязательно) Введите описание.
  8. В разделе "Безопасность" опция предоставления разрешения на доступ всем пайплайнам позволяет всем пайплайнам использовать это подключение к службе. Этот параметр не рекомендуется. Вместо этого авторизуйте каждый конвейер по отдельности для использования подключения к службе.

  9. Нажмите кнопку "Сохранить", чтобы проверить и создать подключение к службе.

    Скриншот, который показывает, как создать подключение службы с управляемой идентификацией Azure Resource Manager.

Доступ к секретам хранилища ключей из конвейера

Предупреждение

Это руководство предназначено только для образовательных целей. Рекомендации по безопасности и рекомендации по безопасной работе с секретами см. в статье "Управление секретами" в серверных приложениях с помощью Azure Key Vault.

  1. Войдите в Azure DevOps, а затем перейдите в проект.

  2. Выберите Пайплайны>Новый пайплайн.

  3. Выберите Azure Repos Git (YAML) и выберите репозиторий.

  4. Выберите шаблон Starter pipeline конвейера.

  5. Поток по умолчанию включает примеры команд echo. Вам не нужны эти команды, поэтому их можно удалить.

  6. Добавьте задачу Azure Key Vault в конвейер. Замените заполнители именем созданного ранее подключения к службе и именем хранилища ключей. Файл YAML должен выглядеть примерно так:

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
  7. Добавьте следующие задачи для копирования и публикации секрета. Этот пример предназначен только для демонстрационных целей. Не используйте его в рабочей среде.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      displayName: Create file
      inputs:
        script: 'echo $(SECRET_NAME) > secret.txt'
    
    - task: CopyFiles@2
      displayName: Copy file
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    
  8. Нажмите кнопку "Сохранить и запустить", а затем еще раз выберите ее, чтобы зафиксировать изменения и активировать конвейер. Если появится запрос, выберите "Разрешить предоставить доступ конвейера к ресурсам Azure".

  9. После запуска конвейера выберите задачу CmdLine , чтобы просмотреть журналы.

    Снимок экрана: журналы задач командной строки.

  10. По завершении выполнения конвейера вернитесь в сводку конвейера и выберите опубликованный артефакт.

    Снимок экрана: опубликованный артефакт на вкладке сводки.

  11. Выберите перетащите>secret.txt, чтобы скачать файл.

    Снимок экрана, показывающий, как скачать опубликованный артефакт.

  12. Откройте скачанный текстовый файл. Он должен содержать секрет, полученный из хранилища ключей.

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

Чтобы удалить созданные ресурсы, выполните следующие действия.

  1. Если вы создали новую организацию для размещения проекта, см. инструкции по удалению организации. В противном случае удалите проект.

  2. Все ресурсы Azure, созданные во время этого руководства, размещаются в одной группе ресурсов. Выполните следующую команду, чтобы удалить группу ресурсов и все ее ресурсы.

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

Устранение неполадок

Ошибка: "У пользователя или группы нет разрешения на список секретов"

Эта ошибка возникает, когда учетная запись службы или управляемая учетная запись, которое используется в вашем конвейере, не имеет разрешения на перечисление секретов в хранилище ключей. Чтобы устранить эту проблему, убедитесь, что удостоверение имеет разрешения Получить и Список для секретов. Выполните следующие команды, чтобы предоставить необходимые разрешения служебному принципалу:

az login

az account set --subscription <YOUR_SUBSCRIPTION_ID>

$spnObjectId = az ad sp show --id <YOUR_SERVICE_PRINCIPAL_ID>

az keyvault set-policy --name <YOUR_KEY_VAULT_NAME> --object-id $spnObjectId --secret-permissions get list