パイプラインから Azure Repos へのアクセスをセキュリティで保護する

リポジトリには、ビジネスを強化するコードが含まれているため、ビジネスの成功にとって重要なリソースです。 リポジトリへのアクセスは簡単に付与するべきではありません。

この記事では、ソース コードが悪用されるリスクを制限するために、Azure Repos にアクセスするパイプラインのセキュリティを強化する方法について説明します。

Azure リポジトリに安全にアクセスするようにパイプラインを設定するには、[非リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]、[リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]、[YAML パイプライン内のリポジトリへのアクセスを保護する] の各トグルを有効にします。

ビルド パイプラインとクラシック リリース パイプラインの両方について説明します。

基本プロセス

手順は、すべてのパイプラインで同様です。

  1. パイプラインがアクセスする必要のある Azure Repos リポジトリのうち、同じ組織に属しているが、異なるプロジェクトに属するもののリストを決定します。

    パイプラインを調べることで、リポジトリの一覧をコンパイルできます。 または、[(非) リリース パイプラインのジョブ承認スコープを現在のプロジェクトに制限する] トグルをオンにして、パイプラインがチェックアウトに失敗したリポジトリをメモすることもできます。サブモジュール リポジトリは、最初に失敗した実行では表示されない場合があります。

  2. パイプラインがアクセスする必要があるリポジトリを含む Azure DevOps プロジェクトごとに、手順に従って、パイプラインのビルド ID にそのプロジェクトへのアクセス権を付与します。

  3. パイプラインがチェックアウトする Azure Repos リポジトリごとに、手順に従って、パイプラインのビルド ID にそのリポジトリへの読み取りアクセス権を付与します。

  4. パイプラインがチェックアウトし、同じプロジェクト内にあるリポジトリによってサブモジュールとして使用されるリポジトリごとに、手順に従って、パイプラインのビルド ID にそのリポジトリへの読み取りアクセス権を付与します。

  5. [非リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する][リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する][YAML パイプライン内のリポジトリへのアクセスを保護する] トグルをオンにします。

ビルド パイプライン

パイプラインが Azure Repos にアクセスするときにパイプラインのセキュリティを向上させるための手順を示すために、実行中の例を使用します。

SpaceGameWeb Azure Repos リポジトリの fabrikam-tailspin/SpaceGameWeb プロジェクトでホストされている SpaceGameWeb パイプラインで作業しているとします。 さらに、SpaceGameWeb パイプラインで同じプロジェクト内の SpaceGameWebReact リポジトリと、fabrikam-tailspin/FabrikamFiber プロジェクト内の FabrikamFiber リポジトリと FabrikamChat リポジトリをチェックアウトするとします。

最後に、FabrikamFiber リポジトリが同じプロジェクトでホストされているサブモジュールとして FabrikamFiberLib リポジトリを使用するとします。 「サブモジュールをチェックアウトする方法」の詳細を参照してください。

SpaceGameWeb プロジェクトのリポジトリ構造は、次のスクリーンショットのようになります。

Screenshot of the SpaceGameWeb repository structure.

FabrikamFiber プロジェクトのリポジトリ構造は、次のスクリーンショットのようになります。

Screenshot of the FabrikamFiber repository structure.

たとえば、プロジェクトがプロジェクトベースのビルド ID を使用したり、YAML パイプラインのリポジトリへのアクセスを保護したりするように設定されていないとします。 また、パイプラインをすでに正常に実行しているとします。

ビルド パイプラインにプロジェクト ベースのビルド ID を使用する

パイプラインを実行すると、ID を使用して、リポジトリ、サービス接続、変数グループなどのさまざまなリソースにアクセスします。 パイプラインで使用できる ID には、プロジェクト レベル 1 とコレクション レベル 1 の 2 種類があります。 前者はより良いセキュリティを提供し、後者は使いやすさを提供します。 スコープ付きビルド IDジョブ承認スコープの詳細を参照してください。

パイプラインを実行するには、プロジェクト レベルの ID を使用することをお勧めします。 既定では、プロジェクト レベルの ID は、メンバーであるプロジェクト内のリソースにのみアクセスできます。 この ID を使用すると、パイプラインを乗っ取るときに悪意のある人物によって取得されるアクセスが減少するため、セキュリティが向上します。

パイプラインでプロジェクト レベルの ID を使用するには、[非リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]設定をオンにします。

実行中の例では、このトグルがオフの場合、SpaceGameWeb パイプラインはすべてのプロジェクト内のすべてのリポジトリにアクセスできます。 トグルがオンの場合、SpaceGameWebfabrikam-tailspin/SpaceGameWeb プロジェクト内のリソースにのみアクセスできるため、SpaceGameWebSpaceGameWebReact リポジトリのみアクセスできます。

このサンプル パイプラインを実行した場合、トグルをオンにすると、パイプラインは失敗し、エラー ログによって 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 Repos リポジトリにアクセスするためのアクセス許可を明示的に要求します。 この設定に関する詳細をご覧ください。 GitHub でホストされているリポジトリなど、他の種類のリポジトリをチェックアウトすることは、この設定の影響を受けません。

実行中の例では、このトグルがオンの場合、SpaceGameWeb パイプラインは fabrikam-tailspin/SpaceGameWeb プロジェクト内の SpaceGameWebReact リポジトリと fabrikam-tailspin/FabrikamFiber プロジェクトの FabrikamFiber および FabrikamChat リポジトリにアクセスするためのアクセス許可を要求します。

このサンプル パイプラインを実行すると、次のスクリーンショットのようなビルドが表示されます。 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 コマンド (例: - checkout: git://FabrikamFiber/OtherRepo) を使用して OtherRepo リポジトリをチェックアウトします。

リポジトリがサブモジュールとして別のリポジトリを使用している

パイプラインがチェックアウトするリポジトリの 1 つが、FabrikamFiberFabrikamFiberLib リポジトリの例のように、サブモジュールとして (同じプロジェクト内の) 別のリポジトリを使用するとします。 「サブモジュールをチェックアウトする方法」の詳細を参照してください。

さらに、SpaceGame ビルド ID にこのリポジトリへの読み取りアクセス権を付与したが、FabrikamFiberLib サブモジュールをチェックアウトするときに FabrikamFiber リポジトリのチェックアウトが失敗したとします。

この問題を解決するには、-checkout: FabrikamFiber の前に - checkout: git://FabrikamFiber/FabrikamFiberLib ステップを追加するなど、FabrikamFiberLib を明示的にチェックアウトします。

クラシック リリース パイプライン

リリース パイプラインのリポジトリへのアクセスをセキュリティで保護するプロセスは、ビルド パイプラインの場合と同様です。

実行する必要がある手順を説明するために、実行中の例を使用します。 この例では、fabrikam-tailspin/FabrikamFiberDocRelease プロジェクトに FabrikamFiberDocRelease という名前のリリース パイプラインがあります。 パイプラインが fabrikam-tailspin/FabrikamFiber プロジェクト内の FabrikamFiber リポジトリをチェックアウトし、コマンドを実行してパブリック ドキュメントを生成し、それを Web サイトに公開するとします。 さらに、FabrikamFiber リポジトリが (同じプロジェクト内の) FabrikamFiberLib リポジトリをサブモジュールとして使用するとします

クラシック リリース パイプラインにプロジェクト ベースのビルド ID を使用する

パイプラインを実行すると、ID を使用して、リポジトリ、サービス接続、変数グループなどのさまざまなリソースにアクセスします。 パイプラインで使用できる ID には、プロジェクト レベル 1 とコレクション レベル 1 の 2 種類があります。 前者はより良いセキュリティを提供し、後者は使いやすさを提供します。 スコープ付きビルド 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. と表示されます

これらの問題を解決するには、「基本的なプロセス」の手順に従います。

このサンプル パイプラインを実行すると、成功します。

関連項目