다음을 통해 공유


파이프라인에서 Azure Repos에 대한 보안 액세스

리포지토리는 비즈니스를 지원하는 코드를 포함하므로 비즈니스 성공에 중요한 리소스입니다. 리포지토리에 대한 액세스 권한을 쉽게 부여하면 안 됩니다.

이 문서에서는 Azure Repos에 액세스하는 파이프라인의 보안을 향상시켜 소스 코드가 잘못된 손에 들어가는 위험을 제한하는 방법을 보여 줍니다.

Azure 리포지토리에 안전하게 액세스하기 위한 파이프라인 설정은 비 릴리스 파이프라인에 대한 현재 프로젝트로 작업 권한 부여 범위 제한, 릴리스 파이프라인에 대한 현재 프로젝트로 작업 권한 부여 범위 제한YAML 파이프라인의 리포지토리에 대한 액세스 보호 토글이 사용하도록 설정된 것입니다.

빌드 파이프라인과 클래식 릴리스 파이프라인을 모두 다룹니다.

기본 프로세스

단계는 모든 파이프라인에서 유사합니다.

  1. 파이프라인이 동일한 조직의 일부이지만 다른 프로젝트에 있는 액세스해야 하는 Azure 리포지토리 목록을 결정합니다.

    파이프라인을 검사하여 리포지토리 목록을 컴파일할 수 있습니다. 또는 (비)릴리스 파이프라인 토글에 대한 현재 프로젝트로 작업 권한 부여 제한 범위를 켜고 파이프라인이 검사 못하는 리포지토리를 기록해 둡니다. 하위 모델 리포지토리는 첫 번째 실패한 실행에 표시되지 않을 수 있습니다.

  2. 파이프라인에 액세스해야 하는 리포지토리가 포함된 각 Azure DevOps 프로젝트에 대해 해당 프로젝트에 대한 파이프라인의 빌드 ID 액세스 권한을 부여하는 단계를 수행합니다.

  3. 파이프라인이 검사 각 Azure 리포지토리에 대해 파이프라인의 빌드 ID에 해당 리포지토리에 대한 읽기 권한을 부여하는 단계를 수행합니다.

  4. 리포지토리에서 하위 코드로 사용되는 각 리포지토리에 대해 파이프라인이 검사 동일한 프로젝트에 있는 경우 해당 리포지토리에 대한 파이프라인의 빌드 ID 읽기 액세스 권한을 부여하는 단계를 수행합니다.

  5. 릴리스가 아닌 파이프라인에 대한 현재 프로젝트로 작업 권한 부여 범위 제한, 릴리스 파이프라인에 대한 현재 프로젝트로 작업 권한 부여 범위 제한, YAML 파이프라인 토글의 리포지토리에 대한 액세스 보호 등을 설정합니다.

빌드 파이프라인

파이프라인이 Azure Repos에 액세스할 때 파이프라인의 보안을 개선하기 위해 수행하는 단계를 설명하기 위해 실행 중인 예제를 사용합니다.

프로젝트에서 호스트 fabrikam-tailspin/SpaceGameWeb 되는 파이프라인을 SpaceGameWeb Azure Repos 리포지토리에서 작업하고 있다고 SpaceGameWeb 가정합니다. 또한 파이프라인이 동일한 프로젝트의 리포지토리와 FabrikamChatFabrikamFiberfabrikam-tailspin/FabrikamFiber 프로젝트의 리포지토리를 검사 SpaceGameWebReact 가정해 보겠습니다.SpaceGameWeb

마지막으로 리포지토리가 FabrikamFiber 리포지토리를 FabrikamFiberLib 동일한 프로젝트에서 호스트되는 하위 모드로 사용한다고 가정합니다. 하위 모듈을 검사 방법에 대해 자세히 알아보세요.

프로젝트의 리포지토리 구조는 SpaceGameWeb 다음 스크린샷과 같습니다.

Screenshot of the SpaceGameWeb repository structure.

프로젝트의 리포지토리 구조는 FabrikamFiber 다음 스크린샷과 같습니다.

Screenshot of the FabrikamFiber repository structure.

프로젝트가 프로젝트 기반 빌드 ID를 사용하거나 YAML 파이프라인의 리포지토리에 대한 액세스를 보호하도록 설정되지 않은 경우를 상상해 보십시오. 또한 파이프라인을 이미 성공적으로 실행한 것으로 가정합니다.

빌드 파이프라인에 프로젝트 기반 빌드 ID 사용

파이프라인이 실행되면 ID를 사용하여 리포지토리, 서비스 연결, 변수 그룹 등의 다양한 리소스에 액세스합니다. 파이프라인에서 사용할 수 있는 ID에는 프로젝트 수준 1과 컬렉션 수준 1의 두 가지 유형이 있습니다. 전자는 더 나은 보안을 제공하며, 후자는 사용 편의성을 제공합니다. 범위가 지정된 빌드 ID작업 권한 부여 범위에 대해 자세히 알아보세요.

파이프라인을 실행하려면 프로젝트 수준 ID를 사용하는 것이 좋습니다. 기본적으로 프로젝트 수준 ID는 멤버인 프로젝트의 리소스에만 액세스할 수 있습니다. 이 ID를 사용하면 파이프라인을 하이재킹할 때 악의적인 사용자가 얻은 액세스가 줄어들기 때문에 보안이 향상됩니다.

파이프라인이 프로젝트 수준 ID를 사용하도록 하려면 릴리스가 아닌 파이프라인 설정에 대해 작업 권한 부여 범위를 현재 프로젝트로 제한합니다.

실행 중인 예제에서 이 토글이 꺼져 SpaceGameWeb 있으면 파이프라인은 모든 프로젝트의 모든 리포지토리에 액세스할 수 있습니다. 토글이 켜 SpaceGameWeb 지면 프로젝트의 리소스에 fabrikam-tailspin/SpaceGameWeb 만 액세스할 수 있으므로 리포지토리와 SpaceGameWebReact 리포지토리만 SpaceGameWeb 액세스할 수 있습니다.

예제 파이프라인을 실행하는 경우 토글을 켜면 파이프라인이 실패하고 오류 로그가 알려 remote: TF401019: The Git repository with name or identifier FabrikamChat does not exist or you do not have permissions for the operation you are attempting. 줍니다. remote: TF401019: The Git repository with name or identifier FabrikamFiber does not exist or you do not have permissions for the operation you are attempting.

검사 문제를 해결하려면 기본 프로세스에 설명된 단계를 수행합니다.

또한 하위 모드 리포지토리를 사용하는 리포지토리 앞에 명시적으로 검사 합니다. 이 예제에서는 리포지토리를 FabrikamFiberLib 의미합니다.

이제 예제 파이프라인을 실행하면 성공합니다.

추가 구성

Azure Repos에 액세스할 때 보안을 강화하려면 YAML 파이프라인 설정에서 리포지토리에 대한 액세스 보호 기능을 켜는 것이 좋습니다 .

파이프라인이 SpaceGameWeb YAML 파이프라인이고 YAML 소스 코드가 다음 코드와 비슷하다고 가정합니다.

trigger:
- main

pool:
  vmImage: ubuntu-latest

resources:
  repositories:
    - repository: SpaceGameWebReact
      name: SpaceGameWeb/SpaceGameWebReact
      type: git
    - repository: FabrikamFiber
      name: FabrikamFiber/FabrikamFiber
      type: git
    - repository: FabrikamChat
      name: FabrikamFiber/FabrikamChat
      type: git

steps:
  - script: echo "Building SpaceGameWeb"
  - checkout: SpaceGameWebReact
  - checkout: FabrikamChat
    condition: always()  
  - checkout: FabrikamFiber
    submodules: true
    condition: always()
  - script: |
      cd FabrikamFiber
      git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" submodule update --recursive --remote
  - script: cat $(Build.Repository.LocalPath)/FabrikamFiber/FabrikamFiberLib/README.md
  - ...

YAML 파이프라인에서 리포지토리에 대한 액세스 보호

Azure DevOps는 YAML 파이프라인 설정에서 리포지토리에 대한 액세스 보호의 형태로 Azure Repos 리포지토리에 대한 세분화된 권한 메커니즘을 제공합니다. 이 설정을 사용하면 YAML 파이프라인이 속한 프로젝트에 관계없이 모든 Azure 리포지토리에 액세스할 수 있는 권한을 명시적으로 요청합니다. 이 설정에 대해 자세히 알아보세요. 다른 유형의 리포지토리(예: GitHub 호스팅 리포지토리)를 확인하는 것은 이 설정의 영향을 받지 않습니다.

실행 중인 예제에서 이 토글이 켜 SpaceGameWeb 지면 파이프라인은 프로젝트의 리포지토리 및 FabrikamFiberFabrikamChat 프로젝트의 리포지토리에 fabrikam-tailspin/SpaceGameWeb 액세스할 SpaceGameWebReact 수 있는 fabrikam-tailspin/FabrikamFiber 권한을 요청합니다.

예제 파이프라인을 실행하면 다음 스크린샷과 유사한 빌드가 표시됩니다. Screenshot of running the SpaceGameWeb pipeline the first time after turning on the Protect access to repositories in YAML pipelines toggle.

파이프라인이 검사 또는 리소스로 정의된 리포지토리에 대한 권한을 부여하라는 메시지가 표시됩니다. Screenshot of being asked to grant permission to the SpaceGameWeb pipeline to access three repositories.

이렇게 하면 파이프라인이 실행되지만 리포지토리를 하위 구성 FabrikamFiber요소로 검사 FabrikamFiberLib 수 없으므로 실패합니다. 이 문제를 해결하려면 단계 앞에 -checkout: FabrikamFiber 단계를 추가하는 - checkout: git://FabrikamFiber/FabrikamFiberLib 등 명시적으로 검사FabrikamFiberLib.

이제 예제 파이프라인을 실행하면 성공합니다.

최종 YAML 파이프라인 소스 코드는 다음 코드 조각과 같습니다.

trigger:
- main

pool:
  vmImage: ubuntu-latest

resources:
  repositories:
    - repository: SpaceGameWebReact
      name: SpaceGameWeb/SpaceGameWebReact
      type: git
    - repository: FabrikamFiber
      name: FabrikamFiber/FabrikamFiber
      type: git
    - repository: FabrikamChat
      name: FabrikamFiber/FabrikamChat
      type: git

steps:
  - script: echo "Building SpaceGameWeb"
  - checkout: SpaceGameWebReact
  - checkout: FabrikamChat
    condition: always()  
  - checkout: git://FabrikamFiber/FabrikamFiberLib  
  - checkout: FabrikamFiber
    submodules: true
    condition: always()
  - script: |
      cd FabrikamFiber
      git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" submodule update --recursive --remote
  - script: cat $(Build.Repository.LocalPath)/FabrikamFiber/FabrikamFiberLib/README.md

문제 해결

다음은 문제가 있는 몇 가지 상황과 이를 처리하는 방법입니다.

명령줄에서 git을 사용하여 동일한 조직의 리포지토리를 검사.

예를 들어 .- script: git clone https://$(System.AccessToken)@dev.azure.com/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/ YAML 파이프라인 토글의 리포지토리에 대한 액세스 보호가 설정되면 명령이 실패합니다 .

이 문제를 해결하려면 예를 들어 - checkout: git://FabrikamFiber/OtherRepo명령을 사용하여 리포지토리를 checkout 검사OtherRepo.

리포지토리가 다른 리포지토리를 하위모듈로 사용하고 있습니다.

파이프라인 검사 중 하나의 리포지토리 중 하나가 하위 구성 요소와 같은 프로젝트 내의 다른 리포지토리를 사용한다고 가정해 보겠습니다. 이 예제에서는 리포지토리 및 FabrikamFiberLib 리포지토리에 대한 FabrikamFiber 예제와 같습니다. 하위 모듈을 검사 방법에 대해 자세히 알아보세요.

또한 이 리포지토리에 SpaceGame 대한 읽기 권한을 빌드 ID에 부여했지만 하위 모듈을 검사 때 리포지토리의 FabrikamFiber 검사 여전히 실패합니다FabrikamFiberLib.

이 문제를 해결하려면 명시적으로 검사FabrikamFiberLib. 예를 들어 단계 앞에 단계를 추가 - checkout: git://FabrikamFiber/FabrikamFiberLib 합니다-checkout: FabrikamFiber.

클래식 릴리스 파이프라인

릴리스 파이프라인의 리포지토리에 대한 액세스를 보호하는 프로세스는 빌드 파이프라인의 프로세스와 비슷합니다.

수행해야 하는 단계를 설명하기 위해 실행 중인 예제를 사용합니다. 이 예제에는 프로젝트에 명명 FabrikamFiberDocRelease 된 릴리스 파이프라인이 있습니다 fabrikam-tailspin/FabrikamFiberDocRelease . 파이프라인이 프로젝트의 리포지 fabrikam-tailspin/FabrikamFiber 토리를 FabrikamFiber 검사 공용 설명서를 생성하는 명령을 실행한 다음 웹 사이트에 게시하는 경우를 가정합니다. 또한 리포지토리가 FabrikamFiber 리포지토리(동일한 프로젝트의 리포지토리)를 하위모듈로 사용 FabrikamFiberLib 한다고 상상해 보십시오.

클래식 릴리스 파이프라인에 프로젝트 기반 빌드 ID 사용

파이프라인이 실행되면 ID를 사용하여 리포지토리, 서비스 연결, 변수 그룹 등의 다양한 리소스에 액세스합니다. 파이프라인에서 사용할 수 있는 ID에는 프로젝트 수준 1과 컬렉션 수준 1의 두 가지 유형이 있습니다. 전자는 더 나은 보안을 제공하며, 후자는 사용 편의성을 제공합니다. 범위가 지정된 빌드 ID작업 권한 부여 범위에 대해 자세히 알아보세요.

파이프라인을 실행하려면 프로젝트 수준 ID를 사용하는 것이 좋습니다. 기본적으로 프로젝트 수준 ID는 멤버인 프로젝트의 리소스에만 액세스할 수 있습니다. 이 ID를 사용하면 파이프라인을 하이재킹할 때 악의적인 사용자가 얻은 액세스가 줄어들기 때문에 보안이 향상됩니다.

파이프라인이 프로젝트 수준 ID 를 사용하도록 하려면 릴리스 파이프라인 설정을 위해 작업 권한 부여 범위를 현재 프로젝트로 제한합니다.

실행 중인 예제에서 이 토글이 해제 FabrikamFiberDocRelease 되면 릴리스 파이프라인은 리포지토리를 포함한 모든 프로젝트의 모든 리포지토리에 FabrikamFiber 액세스할 수 있습니다. 토글이 켜 FabrikamFiberDocRelease 지면 프로젝트의 리소스에 fabrikam-tailspin/FabrikamFiberDocRelease 만 액세스할 수 있으므로 FabrikamFiber 리포지토리에 액세스할 수 없게 됩니다.

예제 파이프라인을 실행하는 경우 토글을 켜면 파이프라인이 실패하고 로그가 알려줍니다. remote: TF401019: The Git repository with name or identifier FabrikamFiber does not exist or you do not have permissions for the operation you are attempting.

이러한 문제를 해결하려면 기본 프로세스의 단계를 수행합니다.

이제 예제 파이프라인을 실행하면 성공합니다.

참고 항목