다음을 통해 공유


파이프라인에서 리포지토리에 안전하게 액세스

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

작업을 실행하는 코드를 보호하려면 조직에서 소스 코드 리포지토리에 대한 액세스를 신중하게 제어해야 합니다. 이 문서에서는 Azure Pipelines 빌드 및 릴리스 파이프라인이 리포지토리에 안전하게 액세스하여 무단 액세스의 위험을 최소화하는 방법을 설명합니다.

이 문서는 Azure Pipelines에 대한 보안 조치를 구현하는 데 도움이 되는 시리즈의 일부입니다. 자세한 내용은 보안 Azure Pipelines를 참조하세요.

필수 조건

범주 요구 사항
Azure DevOps - Azure DevOps를 안전하고 안전한 Azure Pipelines로 만들기 에서 권장 사항을 구현 합니다.
- YAML 및 Azure Pipelines에 대한 기본 지식 자세한 내용은 첫 번째 파이프라인 만들기를 참조하세요.
권한 - 파이프라인 사용 권한을 수정하려면: 프로젝트 관리자 그룹의 구성원입니다.
- 조직 권한을 수정하려면 : 프로젝트 컬렉션 관리자 그룹의 구성원입니다.

파이프라인에 대한 프로젝트 기반 ID

파이프라인은 ID를 사용하여 실행 중에 리포지토리, 서비스 연결 및 변수 그룹과 같은 리소스에 액세스합니다. 파이프라인은 컬렉션 수준 또는 프로젝트 수준이라는 두 가지 유형의 ID를 활용할 수 있습니다.

컬렉션 수준 ID는 쉽게 설정하고 사용할 수 있지만 프로젝트 수준 ID는 보안의 우선 순위를 지정합니다. 보안을 강화하려면 프로젝트 수준 ID를 사용하여 파이프라인을 실행합니다. 프로젝트 수준 ID는 프로젝트 내의 리소스에만 액세스할 수 있으므로 악의적인 행위자가 무단으로 액세스하는 영향을 최소화할 수 있습니다. 자세한 내용은 범위가 지정된 빌드 ID작업 권한 부여 범위를 참조하세요.

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

리포지토리 액세스 보안을 개선하는 단계

프로젝트 관리자 또는 프로젝트 컬렉션 관리자는 다음 단계를 수행하여 파이프라인에서 Git 리포지토리에 액세스하기 위한 보안을 개선할 수 있습니다.

  1. 파이프라인을 검사하여 다른 프로젝트에 있는 필요한 리포지토리를 식별합니다. 릴리스가 아닌 파이프라인에 대해 작업 권한 부여 범위를 현재 프로젝트로 제한하는 경우 파이프라인은 현재 프로젝트의 리포지토리에서만 코드를 체크 아웃할 수 있습니다.

  2. 파이프라인 프로젝트에 필요한 다른 프로젝트에 대한 액세스 권한을 부여합니다. 자세한 내용은 동일한 프로젝트 컬렉션의 다른 프로젝트에 액세스하도록 프로젝트에 대한 권한 구성을 참조하세요.

  3. 파이프라인 빌드 식별자에 체크 아웃한 각 리포지토리에 대한 읽기 권한을 부여합니다. 또한 필수 리포지토리에서 하위 모듈로 사용되는 모든 리포지토리에 대한 읽기 권한을 파이프라인 식별자에 부여합니다. 자세한 내용은 동일한 프로젝트 컬렉션의 다른 리포지토리에 액세스할 수 있는 권한 구성을 참조하세요.

  4. 파이프라인 프로젝트에 대해 다음 조직 또는 프로젝트 설정을 사용하도록 설정합니다.

    • 릴리스가 아닌 파이프라인에 대한 작업 권한 부여 범위를 현재 프로젝트로 제한합니다.
    • 프로젝트에 릴리스 파이프라인이 있는 경우 릴리스 파이프라인에 대한 작업 권한 부여 범위를 현재 프로젝트로 제한합니다.
    • 프로젝트에 Azure Repos YAML 파이프라인이 있는 경우 YAML 파이프라인의 리포지토리에 대한 액세스를 보호합니다.

    조직 설정 또는 프로젝트 설정>>>에서 토글을 기로 설정하여 이러한 설정을 사용하도록 설정합니다.

    조직 설정에서 설정을 사용하는 경우 프로젝트 설정에서 재정의할 수 없습니다. 설정이 조직 설정에서 사용하도록 설정되지 않은 경우 프로젝트 수준에서 사용하도록 설정할 수 있습니다.

리포지토리를 하위모듈로 사용

리포지토리가 프로젝트의 다른 리포지토리를 하위 구성 요소로 사용하는 경우 두 리포지토리에 대한 읽기 권한을 파이프라인에 부여하더라도 하위 구성 요소를 체크 아웃할 때 체크 아웃이 실패할 수 있습니다. 이 문제를 해결하려면 서브모듈 리포지토리를 명시적으로 먼저 체크아웃한 후, 이를 사용하는 리포지토리를 체크아웃하십시오. 자세한 내용은 하위 모듈 체크 아웃을 참조하세요.

GitHub 리포지토리

GitHub 리포지토리에 대한 파이프라인 액세스에는 다음 보안 고려 사항이 적용됩니다. 자세한 내용은 GitHub 리포지토리에 대한 액세스를 참조 하세요.

GitHub 서비스 연결

GitHub 리포지토리를 사용하려면 Azure Pipelines에 GitHub 서비스 연결이 필요합니다. 서비스 연결 보안을 강화하려면 다음을 수행합니다.

  • 파이프라인을 실행해야 하는 리포지토리에만 액세스를 허용합니다.
  • 서비스 연결에 대한 모든 파이프라인에 대한 액세스 권한 부여를 선택하지 마세요. 각 파이프라인이 사용하는 서비스 연결에 대해 명시적으로 권한을 부여하세요.

GitHub 리포지토리에 대한 인증

빌드 중에 빌드를 트리거하고 코드를 가져오려면 Azure Pipelines에 GitHub 리포지토리에 대한 액세스 권한이 부여되어야 합니다. 이 액세스는 GitHub PAT(개인 액세스 토큰), OAuth 또는 GitHub Azure Pipelines 앱 인증을 사용할 수 있습니다. 자세한 내용은 GitHub 리포지토리에 대한 액세스를 참조 하세요.

GitHub Azure Pipelines 앱은 CI(연속 통합) 파이프라인에 권장되는 인증 유형입니다. 빌드 및 GitHub 상태 업데이트는 개인 GitHub ID를 사용하는 대신 Azure Pipelines ID를 사용합니다. 앱을 설치할 때 보안 강화를 위해 앱이 액세스할 수 있는 리포지토리를 제한할 수 있습니다.

OAuth 및 PAT 인증은 개인 GitHub ID를 사용하며 파이프라인 액세스에 대한 권한이 있어야 합니다. 보안 문제로 인해 PAT를 사용하지 않도록 권장되지 않습니다. PAT 인증을 사용해야 하는 경우 세분화된 PAT를 선택하고 범위를 특정 사용자, 리포지토리 및 권한으로 제한합니다. 자세한 내용은 개인용 액세스 토큰 관리를 참조하세요.

비고

GitHub 조직의 모든 리포지토리에 대한 GitHub 앱을 설치하는 경우 앱에서 사용하는 토큰은 조직의 모든 프라이빗 및 퍼블릭 리포지토리에 액세스할 수 있습니다. 보안을 강화하려면 프라이빗 리포지토리를 별도의 조직으로 분리하거나 앱이 액세스할 수 있는 리포지토리를 명시적으로 선택합니다.

분기된 GitHub 리포지토리

포크된 리포지토리는 파이프라인에서 악성 코드 실행 또는 중요한 정보 릴리스의 위험을 증가합니다. 조직 외부에서 발생하는 포크는 특정 위험을 초래합니다.

포크된 리포지토리의 위험을 최소화하기 위해 포크된 GitHub 리포지토리에서 끌어오기 요청 빌드 제한포크된 리포지토리에서 끌어오기 요청 빌드 사용 안 함은 기본적으로 프로젝트 설정 또는 조직 설정>파이프라인>설정> 트리거에서 사용하도록 설정됩니다.

포크된 GitHub 리포지토리에서 빌드할 수 있지만 위험을 줄이려면 포크된 리포지토리에서 끌어오기 요청을 안전하게 빌드합니다. 이 설정에서는 비밀을 사용할 수 없도록 하며, 일반 빌드와 동일한 권한도 사용할 수 없습니다. 또한, 파이프라인을 트리거하려면 팀원의 PR 주석이 필요합니다.

또는 포크된 리포지토리에서 끌어오기 요청을 빌드하기 위한 규칙 사용자 지정 을 선택하여 이러한 설정을 추가로 사용자 지정할 수 있습니다.

포크된 리포지토리 빌드를 제한하기 위한 프로젝트 설정의 스크린샷

포크 보안을 강화하는 다른 방법은 다음과 같습니다.

  • 파이프라인 정의의 트리거 섹션에서 빌드를 트리거하기 위해 끌어오기 요청 유효성 검사를 사용하는 경우, 이 리포지토리의 포크에서 끌어오기 요청 빌드를 선택 취소하거나, 포크 빌드에 비밀 정보를 사용할 수 있도록 함포크 빌드가 일반 빌드와 동일한 권한을 갖도록 함을 선택 취소해야 합니다. 끌어오기 요청을 작성하기 전에 팀 구성원의 설명 필요를 선택할 수도 있습니다.

  • Microsoft 호스팅 에이전트를 사용하여 포크에서 빌드합니다. 그러면 빌드 후 에이전트에서 리소스가 즉시 삭제됩니다. 자체 호스팅 에이전트를 사용하는 경우 정기적으로 에이전트를 정리 및 업데이트하거나 다른 포크 또는 분기에 별도의 에이전트를 사용합니다.

Azure Repos 리포지토리

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

YAML 파이프라인 프로젝트 또는 조직 설정 에서 리포지토리에 대한 액세스 보호 는 YAML 파이프라인에 대한 세분화된 권한을 제공합니다. 이 설정을 통해 YAML 파이프라인은 프로젝트에 관계없이 모든 리포지토리에 액세스할 수 있는 권한을 명시적으로 요청합니다. 자세한 내용은 YAML 파이프라인의 리포지토리에 대한 액세스 보호를 참조하세요.

비고

YAML 파이프라인 설정의 리포지토리에 대한 액세스 보호는 GitHub 리포지토리에 적용되지 않습니다.

이 설정을 사용하도록 설정하면 Azure Repos YAML 파이프라인은 처음 실행할 때 항상 리포지토리에 액세스할 수 있는 권한을 요청합니다. 다음 스크린샷과 같은 권한 요청이 표시됩니다.

YAML 파이프라인 토글에서 리포지토리에 대한 액세스 보호 기능을 켠 후 처음으로 SpaceGameWeb 파이프라인을 실행하는 스크린샷

허용을 선택하여 파이프라인 리포지토리 또는 리소스에 권한을 부여합니다. 이제 파이프라인이 성공합니다.

YAML 파이프라인의 리포지토리에 대한 액세스를 허용하는 스크린샷

git 명령줄을 사용하여 다른 리포지토리 확인

git clone https://github/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/가 사용하도록 설정된 경우와 같은 명령줄 스크립트가 실패할 수 있습니다. 이 문제를 해결하려면 OtherRepo 명령을 명시적으로 사용하여 checkout 리포지토리를 체크 아웃하세요, 예를 들어 checkout: git://FabrikamFiber/OtherRepo와 같이.

Azure Repos 예제

다음 예제에서는 파이프라인에서 Azure Repos 액세스에 대한 보안을 개선하는 프로세스를 보여 줍니다.

조직에는 https://dev.azure.com/fabrikam-tailspinSpaceGameWebFabrikamFiber 프로젝트가 포함됩니다.

  • SpaceGameWeb 프로젝트에는 SpaceGameWebSpaceGameWebReact 리포지토리가 포함되어 있습니다.

    SpaceGameWeb 리포지토리 구조의 스크린샷.

  • FabrikamFiber 프로젝트에는 FabrikamFiber, FabrikamChatFabrikamFiberLib 리포지토리가 포함됩니다. FabrikamFiber 리포지토리는 FabrikamFiberLib 리포지토리를 하위 구성으로 사용합니다.

    FabrikamFiber 리포지토리 구조의 스크린샷.

SpaceGameWeb 프로젝트의 SpaceGameWeb 파이프라인은 SpaceGameWeb 프로젝트의 SpaceGameWebReact 리포지토리와 FabrikamFiber 프로젝트의 FabrikamFiberFabrikamChat 리포지토리 를 확인합니다.

프로젝트가 프로젝트 기반 빌드 ID를 사용하거나 YAML 파이프라인의 리포지토리에 대한 액세스를 보호하도록 설정되지 않은 경우 SpaceGameWeb 파이프라인은 조직의 모든 프로젝트의 모든 리포지토리에 액세스하여 성공적으로 실행됩니다.

프로젝트 수준 ID 사용

보안을 향상하려면 프로젝트 수준 ID를 사용하여 파이프라인을 실행합니다. 프로젝트 설정 또는 조직 설정에서 릴리스가 아닌 파이프라인에 대해 작업 권한 범위를 현재 프로젝트로 제한하는 토글을 활성화합니다.

이 설정을 사용하는 경우 파이프라인은 SpaceGameWeb 및 SpaceGameWebReact 리포지토리만 포함하는 SpaceGameWeb 프로젝트의 리소스에만 액세스할 수 있습니다. FabrikamFiber 프로젝트의 리포지토리를 체크 아웃할 수 없으므로 파이프라인이 실패합니다.

오류 remote: TF401019: The Git repository with name or identifier FabrikamChat does not exist or you do not have permissions for the operation you are attemptingremote: TF401019: The Git repository with name or identifier FabrikamFiber does not exist or you do not have permissions for the operation you are attempting이(가) 표시됩니다.

문제를 해결하려면 파이프라인 프로젝트에 FabrikamFiber 프로젝트에 대한 액세스 권한을 부여하고 FabrikamFiber, FabrikamChatFabrikamFiberLib 리포지토리에 대한 파이프라인 ID 읽기 권한을 부여합니다.

서브모듈을 명시적으로 체크아웃한다.

FabrikamFiber 리포지토리는 FabrikamFiberLib 리포지토리를 하위 구성으로 사용합니다. 두 리포지토리에 파이프라인 액세스 권한을 부여하더라도 FabrikamFiberLib 하위 구성 요소를 체크 아웃할 때 FabrikamFiber 리포지토리 체크 아웃이 실패합니다.

이 문제를 해결하려면 FabrikamFiberLib 리포지토리를 명시적으로 체크 아웃한 다음 FabrikamFiber 리포지토리를 체크 아웃하십시오. checkout: git://FabrikamFiber/FabrikamFiberLib 단계 앞에 checkout: FabrikamFiber 단계를 추가합니다. 이제 예제 파이프라인이 성공합니다.

YAML 파이프라인에 대한 액세스 보호

예제 SpaceGameWeb 파이프라인이 YAML 파이프라인이고 YAML 파이프라인의 리포지토리에 대한 액세스 보호 가 활성화된 경우 파이프라인을 처음 실행할 때 SpaceGameWebReact, FabrikamFiberFabrikamChat 리포지토리에 액세스할 수 있는 권한이 필요합니다.

다음 코드는 전체 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

추가 리포지토리 보안 조치

  • YAML 및 클래식 파이프라인이 리소스를 공유하여 발생할 수 있는 보안 위험을 줄이기 위해 프로젝트 설정 또는 조직 설정에서 클래식 빌드 파이프라인 만들기 사용 안 함클래식 릴리스 파이프라인 만들기 사용 안 함 토글을 활성화하여 클래식 파이프라인 만들기를 비활성화합니다. 클래식 빌드 및 릴리스 파이프라인 만들기는 기본적으로 새 조직에 대해 사용하지 않도록 설정됩니다.

  • 파이프라인 템플릿을 사용하여 파이프라인 구조를 정의하고 악성 코드 침입을 방지합니다. 템플릿은 자격 증명 검사 또는 보호된 리소스에 대한 검사 적용과 같은 작업을 자동으로 수행할 수도 있습니다.

  • 파이프라인이 리포지토리를 요청할 때마다 수동 승인 이 필요합니다. 자세한 내용은 승인 및 확인참조하세요.

  • 보호된 분기 검사를 사용하여 권한이 없는 분기에서 파이프라인이 자동으로 실행되지 않도록 방지합니다.

  • 지정된 YAML 파이프라인에서만 사용할 리포지토리를 설정합니다. 자세한 내용은 리포지토리 리소스에 파이프라인 권한 추가를 참조하세요.

  • 파이프라인 섹션에 나열된 리포지토리에 대해서만 토큰을 제공하여 Azure Pipelines 액세스 토큰의 resources 범위를 제한합니다. 자세한 내용은 리포지토리 보호를 참조하세요.