Uso de segredos do Azure Key Vault em Azure Pipelines

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

O Azure Key Vault é um serviço de nuvem que ajuda os desenvolvedores a armazenar e gerenciar informações confidenciais com segurança, como chaves de API, credenciais e certificados. O Key Vault oferece suporte a dois tipos de contêineres: cofres e pools HSM (módulo de segurança de hardware) gerenciados. Os cofres podem armazenar tanto o software quanto chaves apoiadas por HSM, segredos e certificados. Os pools de HSM gerenciados suportam exclusivamente chaves respaldadas por HSM.

Neste artigo, você aprenderá a criar um cofre de chaves, adicionar um segredo, configurar políticas de acesso e, em seguida, usar esse segredo em Azure Pipelines. Este tutorial usa um cofre de chaves com acesso à rede pública. Se você precisar acessar um cofre de chaves privado do pipeline, consulte Acessar um cofre de chaves privado do pipeline. Para vincular segredos do Key Vault a grupos de variáveis, consulte Vincular um grupo de variáveis a segredos no Azure Key Vault.

Pré-requisitos

Categoria Requirements
Azure DevOps - Uma organização do Azure DevOps.
- Um projeto do Azure DevOps.
Azul Uma assinatura do Azure.

Obter o código

Se você não tiver seu próprio projeto, importe o seguinte repositório de exemplo para seu repositório de Azure:

  1. Entre na sua organização do Azure DevOps e vá para o projeto.

  2. Selecione Repositórios e, em seguida, selecione Importar. Insira a URL do repositório a seguir e selecione Importar.

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

Criar um cofre de chaves

Para criar um novo cofre de chaves no Azure usando o CLI do Azure, siga estas etapas:

  1. Vá para o portal Azure e selecione Azure Cloud Shell no canto superior direito.

  2. Se sua conta estiver associada a várias assinaturas Azure, defina sua assinatura padrão.

    az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
    
  3. Defina uma região padrão do Azure. Para ver uma lista de regiões disponíveis, execute az account list-locations.

    az config set defaults.location=<YOUR_REGION>
    
  4. Crie um novo grupo de recursos.

    az group create --name <YOUR_RESOURCE_GROUP_NAME>
    
  5. Crie um novo cofre de chaves.

    az keyvault create \
      --name <YOUR_KEY_VAULT_NAME> \
      --resource-group <YOUR_RESOURCE_GROUP_NAME>
    
  6. Adicione um segredo ao cofre de chaves.

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

Configurar a autenticação

Depois de criar o cofre de chaves, a próxima etapa é configurar a autenticação. Selecione Identidade Gerenciada ou Entidade de Serviço e siga as instruções para configurar a autenticação.

Criar uma identidade gerenciada atribuída ao usuário

  1. Vá para o portal Azure e pesquise Identidades Gerenciadas na barra de pesquisa.

  2. Selecione Criar e forneça as seguintes informações:

    • Assinatura: selecione sua assinatura do Azure no menu suspenso.
    • Grupo de recursos: Selecione um grupo de recursos existente ou crie um novo.
    • Região: selecione a região em que a identidade gerenciada é criada.
    • Nome: insira um nome para a identidade gerenciada atribuída pelo usuário.
  3. Selecione Examinar + criar e, em seguida, selecione Criar para iniciar a implantação.

  4. Após a conclusão da implantação, selecione Ir para o recurso e copie a ID da Assinatura e a ID do Cliente. Você precisa desses valores em etapas posteriores.

  5. Em Configurações, selecione Propriedades e copie o valor da ID do Locatário da identidade gerenciada para uso posterior.

Configurar políticas de acesso do Key Vault

  1. Acesse o portal Azure e use a barra de pesquisa para localizar o cofre de chaves criado anteriormente.

  2. Selecione políticas de acesso e, em seguida, selecione Criar para adicionar uma nova política.

  3. Em permissões secretas, selecione as caixas de seleção Obter e Listar .

  4. Selecione Próximo. Cole a ID do cliente da identidade gerenciada que você criou anteriormente na barra de pesquisa e selecione a identidade gerenciada.

  5. Selecione Avançar e, em seguida, Avançar novamente.

  6. Examine os detalhes da política de acesso e selecione Criar para aplicar a política.

Criar uma conexão de serviço

  1. Entre no Azure DevOps e vá para o projeto.

  2. Selecione Configurações do projeto>Conexões de serviço>Nova conexão de serviço.

  3. Selecione Azure Resource Manager e, em seguida, Avançar.

  4. Para Tipo de Identidade, selecione Identidade Gerenciada.

  5. Na Etapa 1: Detalhes da identidade gerenciada, forneça as seguintes informações:

    • Assinatura para identidade gerenciada: selecione a assinatura que contém sua identidade gerenciada.
    • Grupo de recursos para identidade gerenciada: selecione o grupo de recursos que hospeda sua identidade gerenciada.
    • Identidade gerenciada: selecione sua identidade gerenciada na lista suspensa.
  6. Para a Etapa 2: Escopo do Azure, forneça as seguintes informações:

    • Nível de escopo para conexão de serviço: selecione Assinatura.
    • Assinatura para conexão de serviço: selecione a assinatura à qual a identidade gerenciada tem acesso.
    • Grupo de recursos para conexão de serviço: (Opcional) Especifique um grupo de recursos para limitar o acesso da identidade gerenciada a um grupo de recursos.
  7. Para a Etapa 3: Detalhes da conexão de serviço, forneça as seguintes informações:

    • Nome da conexão de serviço: insira um nome para a conexão de serviço.
    • Referência de gerenciamento de serviço: (Opcional) Incluir informações de contexto de um banco de dados ITSM.
    • Descrição: (opcional) Insira uma descrição.
  8. Em Segurança, a opção Conceder acesso a todos os pipelines permite que todos os pipelines usem essa conexão de serviço. Não recomendamos essa opção. Em vez disso, autorize cada pipeline individualmente a usar a conexão de serviço.

  9. Selecione Salvar para validar e criar a conexão de serviço.

    Screenshot que demonstra como criar uma conexão de serviço do Azure Resource Manager com identidade gerenciada.

Acessar segredos do cofre de chaves a partir do seu pipeline

Aviso

Este tutorial é somente para fins educacionais. Para obter as melhores práticas de segurança e diretrizes sobre como trabalhar com segurança com segredos, consulte Gerenciar segredos em seus aplicativos de servidor com o Azure Key Vault.

  1. Entre no Azure DevOps e vá para o projeto.

  2. Selecione Pipelines>Novo Pipeline.

  3. Selecione Azure Repos Git (YAML) e, em seguida, selecione seu repositório.

  4. Selecione o modelo Pipeline inicial.

  5. O fluxo de trabalho padrão inclui comandos de eco de amostra. Você não precisa desses comandos, portanto, você pode removê-los.

  6. Adicione a tarefa do Azure Key Vault ao pipeline. Substitua os espaços reservados pelo nome da conexão de serviço que você criou anteriormente e o nome do cofre de chaves. Seu arquivo YAML deve ser semelhante ao exemplo a seguir:

    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. Adicione as tarefas a seguir para copiar e publicar o segredo. Este exemplo é somente para fins de demonstração. Não o utilize num ambiente de produção.

    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. Selecione Salvar e executar e, em seguida, selecione mais uma vez para confirmar suas alterações e acionar o pipeline. Se solicitado, selecione Permitir conceder acesso ao pipeline aos recursos do Azure.

  9. Depois que o pipeline for iniciado, selecione a tarefa CmdLine para exibir os logs.

    Captura de tela que mostra os logs de tarefas de linha de comando.

  10. Quando a execução do pipeline estiver finalizada, retorne ao resumo do pipeline e selecione o artefato publicado.

    Captura de tela mostrando o artefato publicado na guia de Resumo.

  11. Selecione remover>secret.txt para baixar o arquivo.

    Captura de tela que mostra como baixar o artefato publicado.

  12. Abra o arquivo de texto baixado. Ele deve conter o segredo recuperado do cofre de chaves.

Limpar os recursos

Para excluir os recursos que você criou, siga estas etapas:

  1. Se você criou uma nova organização para hospedar seu projeto, veja como excluir sua organização. Caso contrário, exclua seu projeto.

  2. Todos os recursos do Azure criados durante este tutorial são hospedados em um único grupo de recursos. Execute o comando a seguir para excluir o grupo de recursos e todos os seus recursos.

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

Resolução de problemas

Erro: "O usuário ou grupo não tem permissão de lista de segredos"

Esse erro ocorre quando o principal de serviço ou a identidade gerenciada usada pelo seu pipeline não tem permissão para listar segredos no cofre de chaves. Para resolver esse problema, verifique se a identidade tem as permissões Get e List para segredos. Execute os comandos a seguir para conceder as permissões necessárias à entidade de serviço:

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