次の方法で共有


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

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

リポジトリは、運用を強力に行うコードを格納するため、ビジネスの成功に不可欠です。 リポジトリへのアクセスは慎重に制御する必要があります。 この記事では、 Build パイプライン および Classic リリース パイプライン Azure Repos にアクセスするときのセキュリティを強化して、不正アクセスのリスクを軽減する方法について説明します。

Azure リポジトリへの安全なアクセスを確保するには、次の切り替えを有効にします。

  • リリース以外のパイプラインのジョブ承認スコープを現在のプロジェクトに制限する
  • リリース パイプラインのジョブ承認スコープを現在のプロジェクトに制限する
  • YAML パイプライン内のリポジトリへのアクセスを保護する

基本プロセス

パイプラインをセキュリティで保護するための次の手順は、すべてのパイプラインで似ています。

  1. パイプラインが同じ組織内で異なるプロジェクト間でアクセスする必要がある Azure Repos リポジトリを特定します。
    これを行うには、パイプラインを検査するか、 (非)リリース パイプラインの現在のプロジェクトに対するジョブ承認スコープを有効にして パイプラインがチェックアウトに失敗したリポジトリをメモします。最初に失敗した実行では、サブモジュール リポジトリが表示されない場合があります。
  2. パイプラインがアクセスする必要があるリポジトリを含むプロジェクトごとに そのプロジェクトへのアクセス権をパイプラインのビルド ID に付与します。
  3. パイプラインがチェックアウトする各リポジトリについてパイプラインのビルド ID Readにそのリポジトリへのアクセス権を付与します。
  4. パイプラインがチェックアウトし、同じプロジェクト内にあるリポジトリによってサブモジュールとして使用される各リポジトリについてパイプラインのビルド ID Readにそのリポジトリへのアクセス権を付与します。
  5. 非リリース パイプライン 現在のプロジェクトに対してジョブ承認スコープを有効にするリリース パイプラインの場合は現在のプロジェクトに対するLimit ジョブ承認スコープ YAML パイプライン内のリポジトリへのアクセスを保護します

ビルド パイプライン

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

  • SpaceGameWeb Azure Repos リポジトリの fabrikam-tailspin/SpaceGameWeb プロジェクトでホストされている SpaceGameWeb パイプラインで作業しているとします。
  • SpaceGameWeb パイプラインは、同じプロジェクト内のSpaceGameWebReact リポジトリと、fabrikam-tailspin/FabrikamFiber プロジェクトのFabrikamFiberリポジトリとFabrikamChat リポジトリをチェックアウトします。
  • FabrikamFiber リポジトリは、同じプロジェクトでホストされているサブモジュールとしてFabrikamFiberLib リポジトリを使用します。
  • SpaceGameWeb プロジェクトのリポジトリ構造は、次のスクリーンショットのようになります。 SpaceGameWeb リポジトリ構造のスクリーンショット。
  • FabrikamFiber プロジェクトのリポジトリ構造は、次のスクリーンショットのようになります。 FabrikamFiber リポジトリ構造のスクリーンショット。
  • たとえば、プロジェクトがプロジェクトベースのビルド ID を使用したり、YAML パイプラインのリポジトリへのアクセスを保護したりするように設定されていないとします。 また、パイプラインが既に正常に実行されているとします。

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

パイプラインの実行中に、リポジトリ、サービス接続、変数グループなどのリソースにアクセスするために ID が使用されます。 パイプラインでは、プロジェクト レベルとコレクション レベルの 2 種類の ID を利用できます。 前者はセキュリティを優先し、後者は使いやすさを重視しています。 詳細については、「 スコープのビルド ID および ジョブ承認スコープを参照してください。

セキュリティを強化するには、パイプラインを実行するときにプロジェクト レベルの ID を使用します。 これらの ID は、関連するプロジェクト内のリソースにのみアクセスでき、悪意のあるアクターによる不正アクセスのリスクを最小限に抑えます。

プロジェクト レベルの ID を使用するようにパイプラインを構成するには、 Limit ジョブ承認スコープを非リリース パイプラインの現在のプロジェクトに対して有効にします 設定。

実行中の例では、このトグルがオフの場合、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.

チェックアウトの問題を解決するには、この記事の「 Basic process 」セクションで説明されている手順に従います。

さらに、サブモジュール リポジトリを使用するリポジトリ 明示的にチェックアウトします。 この例では、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 リポジトリにアクセスするためのアクセス許可を要求します。

サンプル パイプラインを実行すると、次の例のようにビルドされます。

[YAML パイプライン内のリポジトリへのアクセスを保護する] トグルをオンにした後、SpaceGameWeb パイプラインを初めて実行するスクリーンショット。

パイプライン リポジトリまたはリソースにアクセス許可を付与します。

3 つのリポジトリにアクセスするためのアクセス許可を SpaceGameWeb パイプラインに付与するように求められたスクリーンショット。

パイプラインは実行されますが、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 パイプライン内のリポジトリへの Protect アクセス 設定が有効になっている場合に失敗します。

この問題を解決するには、- checkout: git://FabrikamFiber/OtherRepo などの checkout コマンドを使用して、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.

これらの問題を解決するには、この記事の「 Basic プロセス 」セクションの手順に従います。

この例のパイプラインは成功します。