Como usar variáveis e parâmetros com segurança em seu pipeline

Serviços de DevOps do Azure | Azure DevOps Server 2022 | Azure DevOps Server 2020

Este artigo discute como usar com segurança variáveis e parâmetros para coletar informações de usuários de pipeline. Se quiser saber mais sobre como usar variáveis e parâmetros, consulte:

Tenha cuidado com variáveis secretas. As maneiras recomendadas de definir variáveis secretas estão na interface do usuário, em um grupo de variáveis e em um grupo de variáveis do Cofre de Chaves do Azure. Para obter mais informações, consulte definir variáveis secretas.

Variáveis

As variáveis podem ser uma maneira conveniente de coletar informações do usuário antecipadamente. Você também pode usar variáveis para passar dados de etapa em etapa dentro de um pipeline.

Mas use as variáveis com cautela. As variáveis recém-criadas, sejam elas definidas em YAML ou escritas por um script, são leitura-gravação por padrão. Uma etapa a jusante pode alterar o valor de uma variável de uma forma que você não espera.

Por exemplo, seu script diz:

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

Uma etapa anterior pode ser definida MyConfig como Debug & deltree /y c:. Embora este exemplo exclua apenas o conteúdo do seu agente de compilação, você pode imaginar como essa configuração poderia facilmente se tornar muito mais perigosa.

Você pode tornar as variáveis somente leitura. Variáveis de sistema como Build.SourcesDirectory, variáveis de saída de tarefa e variáveis de tempo de fila são sempre somente leitura. As variáveis criadas no YAML ou criadas em tempo de execução por um script podem ser designadas como somente leitura. Quando um script ou tarefa cria uma nova variável, ele pode passar o sinalizador isReadonly=true em seu comando de log para tornar a variável somente leitura.

No YAML, você pode especificar variáveis somente leitura usando uma chave específica:

variables:
- name: myReadOnlyVar
  value: myValue
  readonly: true

Variáveis de tempo de fila

Ao definir uma variável no editor da interface do usuário do Pipelines, você pode optar por permitir que os usuários substituam seu valor ao executar o pipeline. Chamamos essa variável de variável de tempo de fila. As variáveis de tempo de fila são sempre definidas no editor de interface do usuário do Pipelines.

Captura de tela da definição de uma variável de tempo de fila.

As variáveis de tempo de fila são expostas ao usuário final quando ele executa manualmente um pipeline e pode alterar seus valores. Captura de tela da atualização do valor de uma variável de tempo de fila.

Os usuários precisam da permissão Editar configuração de compilação de fila no pipeline para especificar variáveis definidas no momento da fila.

Limitar variáveis que podem ser definidas no momento da fila

A interface do usuário e a API REST usadas para executar um pipeline fornecem meios para que os usuários definam novas variáveis no momento da fila.

Captura de tela da adição de uma variável de tempo de fila pouco antes de executar o pipeline.

Nos primeiros dias dos Pipelines do Azure, esta funcionalidade teve alguns problemas:

  • Ele permitiu que os usuários definissem novas variáveis que não são explicitamente definidas pelo autor do pipeline na definição.
  • Permitiu que os utilizadores substituíssem as variáveis do sistema.

Para corrigir estes problemas, configuramos uma definição para limitar as variáveis que podem ser definidas no tempo em fila. Com esta definição ativada, só podem ser definidas as variáveis explicitamente marcadas como “Definível no tempo em fila”. Por outras palavras, pode definir variáveis no tempo em fila, exceto quando esta definição estiver ativada.

A configuração é projetada para funcionar no nível da organização e no nível do projeto.

  1. Nível de organização. Quando a configuração está ativada, ela impõe que, para todos os pipelines em todos os projetos na organização, somente as variáveis que estão explicitamente marcadas como "Configurável no momento da fila" podem ser definidas. Quando a configuração está desativada, cada projeto pode escolher se deseja restringir as variáveis definidas no momento da fila ou não. A configuração é uma alternância em Configurações da Organização -> Pipelines -> Configurações. Somente os Administradores de Coleção de Projetos podem habilitá-lo ou desabilitá-lo. Captura de tela de variáveis limitantes que podem ser definidas no tempo de fila no nível da organização.
  2. Nível do projeto. Quando a configuração está ativada, ela impõe que, para todos os pipelines no projeto, apenas as variáveis que estão explicitamente marcadas como "Configurável no momento da fila" podem ser definidas. Se a configuração estiver ativada no nível da organização, ela estará ativada para todos os projetos e não poderá ser desativada. A configuração é uma alternância em Configurações do Projeto -> Pipelines -> Configurações. Somente os administradores de projeto podem habilitá-lo ou desativá-lo. Captura de tela de variáveis limitantes que podem ser definidas no tempo de fila no nível do projeto.

Vejamos um exemplo. Digamos que a configuração está ativada e seu pipeline define uma variável chamada my_variable que não é configurável no momento da fila. Captura de tela da definição de uma variável em um pipeline clássico.

Em seguida, suponha que você deseja executar o pipeline. O painel Variáveis não mostra nenhuma variável e o botão Adicionar variável está ausente.

Captura de ecrã do painel de variáveis com a definição ativada.

Usar as chamadas da API REST Builds - Queue and the Runs - Run Pipeline para enfileirar uma execução de pipeline e definir o valor de my_variable ou de uma nova variável falhará com um erro semelhante ao seguinte.

{
  "$id": "1",
  "innerException": null,
  "message": "You can't set the following variables (my_variable). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
  "typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
  "typeKey": "PipelineValidationException",
  "errorCode": 0,
  "eventId": 3000
}

Parâmetros

Ao contrário das variáveis, os parâmetros do pipeline não podem ser alterados por um pipeline enquanto ele está em execução. Os parâmetros têm tipos de dados como number e string, e podem ser restritos a um subconjunto de valores. Restringir os parâmetros é útil quando uma parte configurável pelo usuário do pipeline deve ter um valor apenas de uma lista restrita. A configuração garante que o pipeline não receba dados arbitrários.

Habilitar validação de parâmetros de argumentos de tarefas do shell

Os pipelines podem fazer referência a tarefas executadas no pipeline. Várias tarefas incluídas no Azure DevOps têm um parâmetro arguments que permite especificar mais opções para a tarefa.

Quando a configuração Habilitar validação de parâmetros de argumentos de tarefas do shell está habilitada, o parâmetro arguments é revisado para quaisquer caracteres que possam não ser executados corretamente pelo shell. Os caracteres de exemplo incluem ponto-e-vírgula, aspas e parênteses.

Semelhante à opção Limitar variáveis que podem ser definidas no tempo de fila, a validação do parâmetro Habilitar argumentos de tarefas do shell pode ser configurada no nível da organização em Configurações>de Pipelines>de Configurações ou no nível do projeto em Configurações>de Pipelines>de Configurações.

Quando ativado, há um problema de validação detetado, uma mensagem de erro como a seguinte é registrada: Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

Para resolver o problema, ajuste os argumentos escapando de caracteres especiais, conforme indicado na mensagem de erro.

Quando a validação do parâmetro Enable shell tasks arguments está habilitada, a validação é aplicada ao parâmetro arguments nas tarefas a seguir.

  • PowerShell
  • BatchScript
  • Bash
  • Ssh
  • AzureFileCopy
  • WindowsMachineFileCopy

Próximos passos

Depois de proteger suas entradas, você também precisa proteger sua infraestrutura compartilhada.