Поделиться через


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

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

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

В этом учебнике вы узнаете, как:

  • Создание субъекта-службы
  • Создание подключения службы
  • Настройте точки доступа для входящего трафика
  • Запрос закрытого хранилища ключей Azure в вашем конвейере

Требования

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

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

  1. В Azure DevOps при настройке группы переменных.

  2. Из самостоятельно размещенного агента во время выполнения задания конвейера.

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

Создание субъекта-службы

Начните с создания нового субъекта-службы, это позволит вам получить доступ к ресурсам Azure. Затем необходимо создать новое подключение службы ARM в Azure DevOps, а затем настроить федеративные учетные данные для субъекта-службы в Azure перед проверкой и сохранением подключения к службе в Azure DevOps.

  1. Перейдите на портал Azure.

  2. Откройте Cloud Shell в строке меню и выберите Bash.

  3. Чтобы создать новую учетную запись службы, выполните следующую команду:

    az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
    
  4. Обязательно скопируйте выходные данные, так как мы будем использовать его для создания подключения к службе на следующем шаге.

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

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

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

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

  4. Для типа удостоверения личности выберите регистрацию приложения (автоматически) в раскрывающемся меню.

  5. Для учетные данные оставьте рекомендуемое значение по умолчанию: федерация удостоверений идентичности рабочей нагрузки.

  6. Для уровня области выберите **Подписка, а затем выберите свою подписку в раскрывающемся меню.

  7. Выберите группу ресурсов, если требуется ограничить доступ только к указанной группе ресурсов.

  8. Укажите имя для подключения к вашей службе, а затем установите флажок "Предоставить доступ ко всем конвейерам", чтобы разрешить всем конвейерам использовать это подключение к службе.

  9. Выберите Сохранить, когда вы закончите.

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

Создать федеративную учетную запись

  1. Перейдите в портал Azure, введите идентификатор клиента вашего субъекта-службы в строке поиска и выберите приложение.

  2. В разделе Управление выберите Сертификаты и секреты>Федеративные учетные данные.

  3. Выберите "Добавить учетные данные", а затем для сценария федеративных учетных данных выберите "Другой издатель".

  4. Для Issuer вставьте следующий URL-адрес, заменив местозаполнитель идентификатором GUID вашей организации. Идентификатор вашей организации можно найти, перейдя в параметры организации>Microsoft Entra>. Загрузите список организаций Azure DevOps, подключенных к вашему каталогу.

    https://login.microsoftonline.com/<TENANT_ID>/v2.0
    
  5. Для идентификатора субъекта вставьте следующий URL-адрес, заменив заполнитель именем организации, именем проекта и именем подключения службы.

    ENTRA_PREFIX/sc/ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
    
  6. Укажите имя федеративных учетных данных и нажмите кнопку "Добавить" после завершения.

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

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

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

  3. Выберите Azure Resource Manager, >Далее, затем выберите сервисный принципал (вручную)>Далее.

  4. Выберите Azure Cloud для среды и подписки на уровне области, а затем введите идентификатор подписки и имя подписки.

  5. Введите сведения об учетной записи службы и выберите Проверить.

  6. После успешной проверки назовите подключение к службе, добавьте описание и установите флажок «Предоставить доступ ко всем конвейерам». Нажмите кнопку "Проверить и сохранить " после завершения.

Совет

Если вы не можете проверить подключение субъекта-службы, предоставьте субъекту-службе доступ читателя к подписке.

Доступ к хранилищу закрытых ключей из Azure Devops

В этом разделе мы рассмотрим два метода доступа к хранилищу закрытых ключей из Azure DevOps. Во-первых, мы будем использовать группы переменных для связывания и сопоставления секретов из нашего хранилища ключей, затем настроим входящий доступ, разрешив статические диапазоны IP-адресов. Мы устанавливаем входящий доступ, так как Azure Pipelines использует общедоступный опубликованный IP-адрес Azure DevOps при обращении к Azure Key Vault из переменной группы. Поэтому, добавив входящие подключения к брандмауэру Azure Key Vault, мы можем успешно подключиться к Azure Key Vault.

Во втором подходе мы продемонстрируем, как динамически добавить IP-адрес агента, размещенного на Microsoft, в разрешенный список брандмауэра хранилища ключей, выполнить запрос к хранилищу ключей и затем удалить IP-адрес после завершения процесса. Этот второй подход предназначен для демонстрационных целей и не рекомендуется Azure Pipelines.

1. Соотнесение секретов хранилища ключей с группой переменных

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

  2. Выберите Библиотека конвейеров, а затем выберите + группа переменных.

  3. Присвойте группе переменных имя, а затем нажмите кнопку переключателя, чтобы включить кнопку Связать секреты из Azure Key Vault как переменные.

  4. Выберите созданное ранее подключение к службе, выберите хранилище ключей и нажмите кнопку "Авторизовать".

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

Примечание.

Убедитесь, что подключение к службе имеет разрешения на получение и список, и что вашему субъекту-службе назначена роль Key Vault Secrets User в вашем личном хранилище закрытых ключей.

1.1. Настройка разрешений подключения службы

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

  2. Нажмите кнопку "Создать" и в разделе "Разрешения секрета", добавьте разрешения "Получить " и "Список " и нажмите кнопку "Далее".

  3. Добавьте подключение к службе в строке поиска, выберите его и нажмите кнопку "Далее".

  4. Нажмите кнопку "Далее " еще раз, просмотрите параметры и нажмите кнопку "Проверить и создать " после завершения.

1.2. Настройка разрешений служебного принципала

  1. Перейдите в хранилище ключей Azure и выберите элемент управления доступом (IAM).

  2. Выберите Добавить>Добавить назначение роли>, а затем перейдите на вкладку Роль.

  3. Выберите роль пользователя секретов Key Vault, а затем выберите Далее.

  4. Выберите "Выбрать участников>", затем добавьте ваш служебный принципал >Выбрать.

  5. Нажмите «Рецензировать и назначить», когда закончите.

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

  2. Выберите Библиотека конвейеров, а затем выберите + группа переменных.

  3. Присвойте группе переменных имя, а затем нажмите кнопку переключателя, чтобы включить кнопку Связать секреты из Azure Key Vault как переменные.

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

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

  5. Если возникло сообщение об ошибке: указанное подключение службы Azure должно иметь разрешения на управление секретами "Get, List" в выбранном хранилище ключей, как показано выше. Перейдите к хранилищу ключей в портале Azure, выберите Элемент управления доступом (IAM)>Добавить назначение роли>пользователь секретов хранилища ключей>Далее, затем добавьте ваш субъекта-службу и выберите Проверить и назначить после завершения.

    Снимок экрана, показывающий, как добавить служебный принципал в качестве пользователя с доступом к секретам в Azure Key Vault.

  6. Добавьте секреты и нажмите кнопку "Сохранить " после завершения.

2. Настройка входящего доступа из Azure DevOps

Чтобы включить доступ к хранилищу ключей из Azure DevOps, необходимо предоставить доступ из определенных статических диапазонов IP-адресов. Эти диапазоны определяются географическим расположением организации Azure DevOps.

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

  2. Выберите Параметры организации.

  3. Перейдите к обзору, где вы найдете географическое расположение, указанное в нижней части страницы.

    Снимок экрана, на котором показано, как найти географическое расположение организации Azure DevOps.

  4. Найдите диапазоны географических IP-адресов V4.

    Внимание

    Для входящих подключений Сша обязательно добавьте диапазоны IP-адресов для всех регионов США.

  5. Настройте хранилище ключей, чтобы разрешить доступ из статических диапазонов IP-адресов.

3. Запрос хранилища закрытых ключей с помощью группы переменных

В этом примере мы используем группу переменных, настроенную ранее и авторизованную с помощью субъекта-службы, для запроса и копирования секрета из нашего частного хранилища ключей Azure с помощью связанной группы переменных. Azure Pipelines использует опубликованный общедоступный IP-адрес при запросе Azure Key Vault из группы переменных, поэтому убедитесь, что вы настроили входящий доступ для правильной работы:

variables:
-  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Альтернативный метод — разрешать динамически IP-адреса агентов, размещенных Microsoft.

В этом втором подходе мы начнем с запроса IP-адреса агента, размещенного корпорацией Майкрософт, в начале нашего потока. Затем мы добавим его в список разрешений хранилища ключей, запустите остальные задачи и, наконец, удалите IP-адрес из списка разрешений брандмауэра хранилища ключей.

Примечание.

Этот подход предназначен только для демонстрационных целей и не является рекомендованным подходом Azure Pipelines.

- task: AzurePowerShell@5
  displayName: 'Allow agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
     Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
     echo "##vso[task.setvariable variable=agentIP]ip"

- task: AzureKeyVault@2
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    KeyVaultName: 'YOUR_KEY_VAULT_NAME'
    SecretsFilter: '*'
    RunAsPreJob: false

- task: AzurePowerShell@5
  displayName: 'Remove agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ipRange = $env:agentIP + "/32"
     Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
  condition: succeededOrFailed()

Внимание

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

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

Чтобы иметь возможность получать доступ к хранилищу закрытых ключей из агента Azure Pipelines, вам потребуется использовать самостоятельно размещенный агент (Windows, Linux, Mac) или агенты в масштабируемом наборе. Это связано с тем, что агенты на платформе Microsoft, как и другие универсальные вычислительные службы, не включаются в список доверенных служб хранилища ключей.

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

1. Настройка входящего доступа от агента, размещенного локально

  1. Выполните указанную инструкцию по созданию виртуальной сети.

  2. В портал Azure используйте панель поиска в верхней части страницы, чтобы найти Azure Key Vault.

  3. Обнаружив хранилище ключей в результатах поиска, выберите его и перейдите в раздел Настройки>Сеть.

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

    Скриншот, демонстрирующий создание нового подключения частной конечной точки для Azure Key Vault.

  5. Выберите группу ресурсов, в которую размещена виртуальная сеть, созданная ранее. Укажите имя экземпляра и имя сетевого интерфейса и убедитесь, что вы выбрали тот же регион, что и созданная ранее виртуальная сеть. Нажмите кнопку "Далее", когда вы закончите.

    Снимок экрана: настройка вкладки

  6. Выберите "Подключиться к ресурсу Azure" в моем каталоге для метода подключения, а затем выберите Microsoft.KeyVault/vaults в раскрывающемся меню для типа ресурса. Выберите ваш ресурс в раскрывающемся меню. Целевой подресурс будет автоматически заполнен значением: хранилище. Нажмите кнопку "Далее", когда вы закончите.

    Снимок экрана: настройка вкладки ресурсов при создании нового экземпляра частной конечной точки для Azure Key Vault.

  7. На вкладке виртуальная сеть выберите виртуальную сеть и подсеть, созданную ранее, и оставьте остальные поля по умолчанию. Нажмите кнопку "Далее", когда вы закончите.

  8. Перейдите на вкладки DNS и теги , принимая параметры по умолчанию. На вкладке «Просмотр и создание» нажмите «Создать», когда вы закончите.

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

    Снимок экрана: утвержденное подключение к частной конечной точке

2. Разрешите вашу виртуальную сеть

  1. Перейдите к портал Azure и найдите Azure Key Vault.

  2. Выберите "Параметры>сети" и убедитесь, что вы находитесь на вкладке "Брандмауэры и виртуальные сети".

  3. Выберите "Добавить виртуальную сеть>" "Добавить существующие виртуальные сети".

  4. Выберите свою подписку в раскрывающемся меню, а затем выберите виртуальную сеть, созданную ранее, и выберите подсети.

  5. Нажмите кнопку "Добавить ", а затем прокрутите страницу внизу страницы и нажмите кнопку "Применить ", чтобы сохранить изменения.

    Снимок экрана: добавление существующей виртуальной сети в брандмауэр Azure Key Vault.

3. Запрос в хранилище закрытых ключей с использованием самостоятельно размещённого агента

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

pool: Self-hosted-pool

variables:
  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Если вы предпочитаете не предоставлять входящий доступ Azure DevOps к хранилищу закрытых ключей, можно использовать задачу AzureKeyVault для запроса хранилища ключей. Однако необходимо убедиться, что вы разрешаете виртуальной сети, размещающей ваш агент, доступ в настройках брандмауэра хранилища ключей.

pool: Self-hosted-pool

steps:
- task: AzureKeyVault@2
  inputs:
    azureSubscription: '$(SERVICE_CONNECTION_NAME)'
    keyVaultName: $(KEY_VAULT_NAME)
    SecretsFilter: '*'

- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

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

Если возникают следующие ошибки, выполните действия, описанные в этом разделе, чтобы устранить проблему:

  • Public network access is disabled and request is not from a trusted service nor via an approved private link.

Это означает, что общедоступный доступ отключен, и ни подключение к частной конечной точке, ни исключения брандмауэра не настроены. Выполните действия в разделе [#configure-inbound-access-from-a-self-hosted-agent] и настройте входящий доступ из Azure DevOps , чтобы настроить доступ к хранилищу закрытых ключей.

  • Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>

Это сообщение об ошибке указывает, что общедоступный доступ к хранилищу ключей отключен, а опция Разрешить доверенным службам Microsoft обходить этот брандмауэр не установлена, но IP-адрес клиента не был добавлен в брандмауэр хранилища ключей. Перейдите к хранилищу ключей в портал Azure, а затем настройте>сеть и добавьте IP-адрес клиента в список разрешений брандмауэра.

  • Error: Client address is not authorized and caller is not a trusted service.

Убедитесь, что добавили диапазоны IPv4 вашего региона в список разрешённых IP-адресов хранилища ключей. Дополнительные сведения см. в статье "Настройка входящего доступа из Azure DevOps ". Кроме того, вы можете перейти к разделу Динамическое разрешение IP-адресов агентов, размещенных на платформе Microsoft, чтобы узнать, как добавить IP-адрес клиента в брандмауэр хранилища ключей во время выполнения.