파이프라인에서 변수 및 매개 변수를 안전하게 사용하는 방법

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

이 문서에서는 변수 및 매개 변수를 안전하게 사용하여 파이프라인 사용자의 입력을 수집하는 방법을 설명합니다. 변수 및 매개 변수 사용에 대해 자세히 알아보려면 다음을 참조하세요.

비밀 변수에는 주의해야 합니다. 비밀 변수를 설정하는 권장 방법은 UI, 변수 그룹 및 Azure Key Vault의 변수 그룹에 있습니다. 자세한 내용은 비밀 변수 설정을 참조 하세요.

variables

변수는 사용자로부터 정보를 미리 수집하는 편리한 방법이 될 수 있습니다. 변수를 사용하여 파이프라인 내에서 단계별로 데이터를 전달할 수도 있습니다.

그러나 신중하게 변수를 사용합니다. 새로 만든 변수는 YAML에서 정의되거나 스크립트로 작성되었는지 여부에 관계없이 기본적으로 읽기/쓰기가 가능합니다. 다운스트림 단계에서는 예상하지 못한 방식으로 변수 값을 변경할 수 있습니다.

예를 들어 스크립트는 다음을 읽습니다.

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

이전 단계는 .로 설정할 MyConfig 수 있습니다 Debug & deltree /y c:. 이 예제에서는 빌드 에이전트의 콘텐츠만 삭제하지만 이 설정이 어떻게 훨씬 더 위험해질 수 있는지 상상할 수 있습니다.

변수를 읽기 전용으로 만들 수 있습니다. 시스템 변수(예: Build.SourcesDirectory작업 출력 변수 및 큐 시간 변수)는 항상 읽기 전용입니다. YAML에서 만들거나 스크립트에서 런타임에 만든 변수는 읽기 전용으로 지정할 수 있습니다. 스크립트 또는 태스크가 새 변수를 만들 때 로깅 명령의 isReadonly=true 플래그를 전달하여 변수를 읽기 전용으로 만들 수 있습니다.

YAML에서 특정 키를 사용하여 읽기 전용 변수를 지정할 수 있습니다.

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

큐 시간 변수

파이프라인 UI 편집기에서 변수를 정의할 때 파이프라인을 실행할 때 사용자가 해당 값을 재정의하도록 선택할 수 있습니다. 이러한 변수를 큐 시간 변수라고 부릅니다. 큐 시간 변수는 항상 파이프라인 UI 편집기에서 정의됩니다.

큐 시간 변수를 정의하는 스크린샷

큐 시간 변수는 파이프라인을 수동으로 실행할 때 최종 사용자에게 노출되며 해당 값을 변경할 수 있습니다. 큐 시간 변수의 값을 업데이트하는 스크린샷

사용자는 큐 시간에 설정된 변수를 지정하려면 파이프라인에 대한 큐 빌드 구성 편집 권한이 필요합니다.

큐 시간에 설정할 수 있는 변수 제한

파이프라인을 실행하는 데 사용되는 UI 및 REST API는 사용자가 큐 시간에 새 변수를 정의할 수 있는 수단을 제공합니다.

파이프라인을 실행하기 직전에 큐 시간 변수를 추가하는 스크린샷

Azure Pipelines 초기에 이 기능에는 몇 가지 문제가 있었습니다.

  • 이를 통해 사용자는 정의에서 파이프라인 작성자가 명시적으로 정의하지 않은 새 변수를 정의할 수 있습니다.
  • 사용자가 시스템 변수를 재정의할 수 있습니다.

이러한 문제를 해결하기 위해 큐 시간에 설정할 수 있는 변수를 제한하는 설정을 정의했습니다. 이 설정을 사용하면 명시적으로 "큐 시간에 설정 가능"으로 표시된 변수만 설정할 수 있습니다. 즉, 이 설정이 사용하도록 설정되어 있지 않으면 큐 시간에 모든 변수를 설정할 수 있습니다.

이 설정은 조직 수준 및 프로젝트 수준에서 작동하도록 설계되었습니다.

  1. 조직 수준입니다. 설정이 설정되면 조직의 모든 프로젝트의 모든 파이프라인에 대해 명시적으로 "큐 시간에 설정 가능"으로 표시된 변수만 설정할 수 있도록 적용합니다. 설정이 해제되면 각 프로젝트는 큐 시간에 설정된 변수를 제한할지 여부를 선택할 수 있습니다. 설정은 조직 설정 - 파이프라인 ->> 설정 토글입니다. 프로젝트 컬렉션 관리자만 사용하거나 사용하지 않도록 설정할 수 있습니다. 조직 수준에서 큐 시간으로 설정될 수 있는 제한 변수 스크린샷.
  2. 프로젝트 수준입니다. 설정이 설정되면 프로젝트의 모든 파이프라인에 대해 명시적으로 "큐 시간에 설정 가능"으로 표시된 변수만 설정할 수 있도록 적용합니다. 설정이 조직 수준에서 설정되어 있으면 모든 프로젝트에 대해 설정되며 해제할 수 없습니다. 이 설정은 Project 설정 - Pipelines ->> 설정 토글입니다. 프로젝트 관리자만 사용하거나 사용하지 않도록 설정할 수 있습니다. 프로젝트 수준에서 큐 시간에 설정할 수 있는 변수를 제한하는 스크린샷

예를 살펴보겠습니다. 설정이 설정되어 있고 파이프라인이 큐 시간에 설정할 수 없는 변수 my_variable 를 정의한다고 가정합니다. 클래식 파이프라인에서 변수를 정의하는 스크린샷

다음으로, 파이프라인을 실행하려는 경우를 가정합니다. 변수 패널에는 변수가 표시되지 않으며 변수 추가 단추가 없습니다.

설정이 있는 변수 패널의 스크린샷

빌드 - 큐실행 - 파이프라인 REST API 호출을 사용하여 파이프라인 실행을 큐에 대기시키고 새 변수의 my_variable 값을 설정하면 다음과 유사한 오류가 발생합니다.

{
  "$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
}

매개 변수

변수와 달리 파이프라인 매개 변수는 실행되는 동안 파이프라인에서 변경할 수 없습니다. 매개 변수에는 numberstring과(와) 같은 데이터 형식이 있으며 값의 하위 집합으로 제한될 수 있습니다. 매개 변수를 제한하는 것은 파이프라인의 사용자 구성 가능한 부분이 제한된 목록에서만 값을 가져와야 하는 경우에 유용합니다. 설정은 파이프라인이 임의 데이터를 받지 않도록 합니다.

셸 작업 인수 매개 변수 유효성 검사 사용

파이프라인은 파이프라인에서 실행되는 작업을 참조할 수 있습니다. Azure DevOps에 포함된 여러 작업에는 작업에 대한 추가 옵션을 지정할 수 있는 인수 매개 변수가 있습니다.

셸 작업 사용 인수 매개 변수 유효성 검사를 사용하도록 설정하면 셸에서 올바르게 실행되지 않을 수 있는 문자에 대해 인수 매개 변수를 검토합니다. 예제 문자에는 세미콜론, 따옴표 및 괄호가 포함됩니다.

큐 시간 옵션에서 설정할 수 있는 변수 제한과 마찬가지로 Enable Shell 작업 인수 매개 변수 유효성 검사는 조직 수준에서 설정피라인설정 또는 설정>파인라인>>설정의 프로젝트 수준에서> 구성할 수 있습니다.

사용하도록 설정하면 검색된 유효성 검사 문제가 있으며 다음과 같은 오류 메시지가 기록됩니다. Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

이 문제를 해결하려면 오류 메시지에 표시된 대로 특수 문자를 이스케이프하여 인수를 조정합니다.

셸 작업 사용 인수 매개 변수 유효성 검사를 사용하도록 설정하면 다음 작업의 인수 매개 변수에 유효성 검사가 적용됩니다.

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

다음 단계

입력을 보호한 후에는 공유 인프라도 보호해야 합니다.