Acessar um cofre de chaves privado do pipeline
O Azure Key Vault oferece uma solução segura para gerenciar credenciais, como chaves, segredos e certificados, com segurança contínua. Usando o Azure Pipelines, você pode simplificar o processo de acesso e uso de cofres de chaves, facilitando o armazenamento e a recuperação de credenciais.
Em determinados cenários, as organizações priorizam a segurança restringindo o acesso aos cofres de chaves exclusivamente às redes virtuais designadas do Azure para garantir o mais alto nível de segurança para aplicativos críticos.
Neste tutorial, você aprenderá a:
- Criar uma entidade de serviço
- Criar uma conexão de serviço
- Configurar pontos de acesso de entrada
- Consultar um cofre de chaves privado do Azure do pipeline
Pré-requisitos
Uma organização do Azure DevOps e um projeto. Crie uma organização ou um projeto , caso ainda não tenha feito isso.
Uma assinatura do Azure. Crie uma conta gratuita do Azure, caso ainda não tenha.
Um Azure Key Vault. Crie um novo cofre de chaves do Azure, caso ainda não tenha.
Acessar um cofre de chaves privado
O Azure Pipelines permite que os desenvolvedores vinculem um cofre de chaves do Azure a um grupo de variáveis e mapeiem segredos seletivos do cofre para ele. Um cofre de chaves usado como um grupo de variáveis pode ser acessado:
No Azure DevOps, durante o tempo de configuração do grupo de variáveis.
Em um agente auto-hospedado, durante o runtime de trabalho do pipeline.
Criar uma entidade de serviço
Comece criando uma nova entidade de serviço, isso permitirá que você acesse os recursos do Azure. Em seguida, você precisará criar uma nova conexão de serviço do ARM no Azure DevOps e, em seguida, configurar uma credencial federada para sua entidade de serviço no Azure antes de verificar e salvar sua conexão de serviço no Azure DevOps.
Navegue até o portal do Azure.
Abra o Cloud Shell na barra de menus e selecione Bash.
Execute o seguinte comando para criar uma entidade de serviço:
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
Certifique-se de copiar a saída, pois a usaremos para criar a conexão de serviço na próxima etapa.
Criar uma conexão de serviço
Entre na sua organização do Azure DevOps e navegue até seu projeto.
Selecione Configurações do projeto>Conexões de serviço>Nova conexão de serviço.
Selecione Azure Resource Manager e, em seguida, Avançar.
Para Tipo de identidade, selecione Registro de aplicativo (automático) no menu suspenso.
Para Credencial, deixe o valor padrão recomendado: Federação de identidade de carga de trabalho.
Para Nível de escopo, selecione **Assinatura e, em seguida, selecione sua assinatura no menu suspenso.
Selecione um Grupo de recursos se quiser limitar o acesso apenas ao grupo de recursos especificado.
Forneça um nome para sua conexão de serviço e marque a caixa de seleção Conceder permissão de acesso a todos os pipelines para permitir que todos os pipelines usem essa conexão de serviço.
Selecione Salvar ao terminar.
Criar uma credencial federada
Navegue até o portal do Azure, insira o ClientID da entidade de serviço na barra de pesquisa e selecione seu aplicativo.
Em Gerenciar, selecione Certificados e segredos>Credenciais federadas.
Selecione Adicionar credencial e, em seguida, para Cenário de credencial federada, selecione Outro emissor.
Em Emissor, cole a URL a seguir, substituindo o espaço reservado pelo GUID da sua organização. Você pode encontrar a ID da organização navegando até Configurações>da organização Microsoft Entra> Baixe a lista de organizações do Azure DevOps conectadas ao seu diretório.
https://vstoken.dev.azure.com/<ORGANIZATION_ID>
Em Identificador de assunto, cole a URL a seguir substituindo o espaço reservado pelo nome da organização, nome do projeto e nome da conexão de serviço.
sc://ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
Forneça um Nome para sua credencial federada e selecione Adicionar quando terminar.
Criar uma conexão de serviço
Entre na sua organização do Azure DevOps e navegue até seu projeto.
Selecione Configurações do projeto>Conexões de serviço>Nova conexão de serviço.
Selecione Azure Resource Manager, >Avançar e, em seguida, selecione Entidade de serviço (manual)>Avançar.
Selecione Nuvem do Azure para Ambiente e Assinatura para o Nível de escopo. Em seguida, insira o ID de assinatura e o Nome de assinatura.
Insira as informações da entidade de serviço e selecione Verificar.
Após a verificação, insira um nome para sua conexão de serviço, adicione uma descrição e marque a caixa de seleção Conceder permissão de acesso a todos os pipelines. Selecione Verificar e salvar quando terminar.
Dica
Se você não conseguir verificar a conexão da entidade de serviço, conceda ao Leitor da entidade de serviço acesso à sua assinatura.
Criar uma conexão de serviço
Entre na sua coleção do Azure DevOps e navegue até seu projeto.
Selecione Configurações do projeto>Conexões de serviço>Nova conexão de serviço.
Selecione Azure Resource Manager, dê um nome à conexão de serviço e selecione Azure Cloud for Environment e Assinatura para o Nível de escopo.
Insira o ID de assinatura e o Nome da assinatura.
Insira as informações da entidade de serviço e selecione Verificar conexão.
Marque a caixa de seleção Permitir que todos os pipelines usem esta conexão e selecione Ok quando terminar.
Dica
Se você não conseguir verificar a conexão da entidade de serviço, conceda ao Leitor da entidade de serviço acesso à sua assinatura.
Acessar um cofre de chaves privado do Azure Devops
Nesta seção, abordaremos dois métodos para acessar um cofre de chaves privado do Azure DevOps. Primeiro, usaremos grupos de variáveis para vincular e mapear segredos do cofre de chaves, e, na sequência, configurar o acesso de entrada permitindo intervalos de IPs estáticos. Estabelecemos o acesso de entrada porque o Azure Pipelines usa o IP público do Azure DevOps postado ao consultar o Azure Key Vault de um grupo de variáveis. Portanto, ao adicionar conexões de entrada ao firewall do Azure Key Vault, podemos nos conectar ao Azure Key Vault.
Em nossa segunda abordagem, demonstraremos a adição dinâmica do endereço IP do agente hospedado pela Microsoft à lista de permissões de firewall do cofre de chaves, consultando o cofre de chaves e, posteriormente, removendo o IP após a conclusão. Essa segunda abordagem é para fins de demonstração e não é a abordagem recomendada pelo Azure Pipelines.
1 – Mapear segredos do cofre de chaves com um grupo de variáveis
Entre na sua organização do Azure DevOps e navegue até seu projeto.
Selecione Biblioteca> de Pipelines e, em seguida, selecione + Grupo de variáveis.
Nomeie seu grupo de variáveis e selecione o botão de alternância para habilitar o botão Vincular segredos de um cofre de chaves do Azure como variável.
Selecione a conexão de serviço que você criou anteriormente, selecione seu cofre de chaves e, em seguida, selecione Autorizar.
Em Variáveis, selecione Adicionar para adicionar seu segredo e, em seguida, selecione Salvar quando terminar.
Observação
Verifique se sua conexão de serviço tem as permissões Obter e listar e se sua entidade de serviço recebeu a função Usuário de Segredos do Key Vault em seu cofre de chaves privado.
1.1 Configurar as permissões de conexão de serviço
Navegue até o cofre de chaves do Azure e selecione Políticas de acesso.
Selecione Criar e, em Permissões secretas, adicione as permissões Obter e Listar e selecione Avançar.
Adicione sua conexão de serviço na barra de pesquisa, selecione-a e, em seguida, selecione Avançar.
Selecione Avançar mais uma vez, revise suas configurações e selecione Examinar + criar quando terminar.
1.2 Configurar as permissões da entidade de serviço
Navegue até o cofre de chaves do Azure e selecione Controle de acesso (IAM).
Selecione Adicionar>Adicionar atribuição> de função e, em seguida, selecione a guia Função.
Selecione a função Usuário de Segredos do Key Vault e selecione Avançar.
Selecione Selecionar membros> , adicione sua entidade de >serviço Selecionar.
Selecione Examinar + atribuir quando terminar.
Entre na sua organização do Azure DevOps e navegue até seu projeto.
Selecione Biblioteca> de Pipelines e, em seguida, selecione + Grupo de variáveis.
Nomeie seu grupo de variáveis e selecione o botão de alternância para habilitar o botão Vincular segredos de um cofre de chaves do Azure como variável.
Selecione a conexão de serviço do Azure que você criou anteriormente no menu suspenso e, em seguida, selecione o cofre de chaves.
Se você encontrar a mensagem de erro: A conexão de serviço do Azure especificada precisa ter permissões de gerenciamento de segredo "Get, List" no cofre de chaves selecionado. conforme mostrado acima. Navegue até o cofre de chaves no portal do Azure, selecione Controle de acesso (IAM)>Adicionar atribuição de função>Usuário de segredos do cofre de chaves>Avançar, adicione sua entidade de serviço e selecione Analisar + atribuir quando terminar.
Adicione os segredos e selecione Salvar quando terminar.
2 – Configurar o acesso de entrada do Azure DevOps
Para habilitar o acesso ao cofre de chaves do Azure DevOps, você deve conceder acesso de intervalos de IPs estáticos específicos. Esses intervalos são determinados pela localização geográfica da sua organização do Azure DevOps.
Entre na sua organização do Azure DevOps.
Selecione Configurações da organização.
Navegue até Visão geral, que contém a localização geográfica listada na parte inferior da página.
Configure o cofre de chaves para permitir o acesso de intervalos de IPs estáticos.
3 – Consultar um cofre de chaves privado com um grupo de variáveis
Neste exemplo, usamos o grupo de variáveis, configurado anteriormente e autorizado por uma entidade de serviço, para consultar e copiar nosso segredo do Azure Key Vault privado simplesmente usando o grupo de variáveis vinculado. O Azure Pipelines usa o IP público postado ao consultar o Azure Key Vault de um grupo de variáveis, portanto, verifique se você configurou o acesso de entrada para que isso funcione corretamente:
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'
Método alternativo – Permitir dinamicamente o IP do agente hospedado pela Microsoft
Nesta segunda abordagem, começaremos consultando o IP do agente hospedado pela Microsoft no início do nosso pipeline. Em seguida, vamos adicioná-lo à lista de permissões do cofre de chaves, prosseguir com as tarefas restantes e, por fim, remover o IP da lista de permissões do firewall do cofre de chaves.
Observação
Essa abordagem é apenas para fins de demonstração e não é a abordagem recomendada pelo 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()
Importante
Verifique se a entidade de serviço que você está usando para acessar o cofre de chaves do pipeline contém a função de colaborador do cofre de chaves no IAM (controle de acesso) do cofre de chaves.
Acessar um cofre de chaves privadas de um agente auto-hospedado
Para ter a capacidade de acessar um cofre de chaves privado de um agente do Azure Pipelines, você precisará usar um agente auto-hospedado (Windows, Linux, Mac) ou agentes do conjunto de dimensionamento. Isso ocorre porque os agentes hospedados da Microsoft, como outros serviços de computação genéricos, não estão incluídos na lista de serviços confiáveis do cofre de chaves.
Para estabelecer conectividade com o cofre de chaves privado, você deve fornecer uma conectividade de linha de visão configurando um ponto de extremidade privado para o cofre de chaves. Esse ponto de extremidade deve ser roteável e ter um nome de DNS privado resolvível no agente de Pipeline auto-hospedado.
1 - Configurar o acesso de entrada de um agente auto-hospedado
Siga as instruções fornecidas para Criar uma rede virtual.
No portal do Azure, use a barra de pesquisa na parte superior da página para localizar o Azure Key Vault.
Depois de localizar o cofre de chaves nos resultados da pesquisa, selecione-o e navegue até Configurações>Rede.
Selecione Conexões de ponto de extremidade privado e, em seguida, selecione Criar para criar um novo ponto de extremidade privado.
Selecione o Grupo de recursos que hospeda a rede virtual criada anteriormente. Forneça um Nome e um Nome do adaptador de rede para sua instância e certifique-se de selecionar a mesma Região que a rede virtual criada anteriormente. Selecione Avançar quando terminar.
Selecione Conectar-se a um recurso do Azure em meu diretório para o Método de conexão e escolha Microsoft.KeyVault/vaults no menu suspenso do Tipo de recurso. Escolha o Recurso no menu suspenso. O Sub-recurso de destino será preenchido automaticamente com o valor: vault. Selecione Avançar quando terminar.
Na guia Rede Virtual, selecione a Rede virtual e a Sub-rede que você criou anteriormente e deixe o restante dos campos como padrão. Selecione Avançar quando terminar.
Continue nas guias DNS e Tags, aceitando as configurações padrão. Na guia Analisar + criar, selecione Criar quando terminar.
Depois que o recurso for implantado, navegue até >Configurações>Rede>Conexões de ponto de extremidade privado do cofre de chaves. O ponto de extremidade privado deverá ser listado com um Estado de conexão aprovado. Se estiver vinculando um recurso do Azure em outro diretório, você deverá aguardar o proprietário do recurso aprovar a sua solicitação de conexão.
2 - Permitir rede virtual
Navegue até Portal do Azure e encontre o Azure Key Vault.
Selecione Configurações>Rede e verifique se você está na guia Firewalls e redes virtuais.
Selecione Adicionar rede virtual>Adicionar redes virtuais existentes.
Selecione sua Assinatura no menu suspenso e, em seguida, selecione a rede virtual que você criou anteriormente. Depois, selecione as Sub-redes.
Selecione Adicionar quando terminar e, em seguida, role até a parte inferior da página e selecione Aplicar para salvar as alterações.
3 - Consultar um cofre de chaves privado em um agente auto-hospedado
O exemplo a seguir usa um agente configurado na VM da rede virtual para consultar o cofre de chaves privado por meio do grupo de variáveis:
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'
Se você preferir não conceder acesso de entrada do Azure DevOps ao cofre de chaves privado, poderá usar a tarefa AzureKeyVault para consultar o cofre de chaves. No entanto, você deve garantir permissão para que a rede virtual hospede seu agente nas configurações de firewall do cofre de chaves.
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'
Solucionar problemas
Se ocorrerem os seguintes erros, siga as etapas desta seção para solucionar o problema:
Public network access is disabled and request is not from a trusted service nor via an approved private link.
Isso indica que o acesso público foi desabilitado e que nem a conexão de ponto de extremidade privada nem as exceções de firewall foram configuradas. Siga as etapas em [#configure-inbound-access-from-a-self--hosted-agent] e Configurar o acesso de entrada do Azure DevOps para configurar o acesso ao cofre de chaves privado.
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>
Essa mensagem de erro indica que o acesso público do cofre de chaves foi desabilitado e a opção Permitir que serviços confiáveis da Microsoft ignorem esse firewall está desmarcada, mas o endereço IP do cliente não foi adicionado ao firewall do cofre de chaves. Navegue até o cofre de chaves no portal do Azure, Configurações>Rede e adicione o IP do cliente à lista de permissões do firewall.
Error: Client address is not authorized and caller is not a trusted service.
Certifique-se de adicionar os intervalos IPV4 da sua geografia à lista de permissões do cofre de chaves. Consulte Configurar o acesso de entrada do Azure DevOps para obter detalhes. Como alternativa, você pode acessar Permitir dinamicamente o IP do agente hospedado pela Microsoft para saber como adicionar o IP do cliente ao firewall do cofre de chaves durante o runtime.