パイプラインから Azure Repos へのアクセスをセキュリティで保護する
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
リポジトリは、運用を強力に行うコードを格納するため、ビジネスの成功に不可欠です。 リポジトリへのアクセスは慎重に制御する必要があります。 この記事では、 Build パイプライン および Classic リリース パイプライン Azure Repos にアクセスするときのセキュリティを強化して、不正アクセスのリスクを軽減する方法について説明します。
Azure リポジトリへの安全なアクセスを確保するには、次の切り替えを有効にします。
- リリース以外のパイプラインのジョブ承認スコープを現在のプロジェクトに制限する
- リリース パイプラインのジョブ承認スコープを現在のプロジェクトに制限する
- YAML パイプライン内のリポジトリへのアクセスを保護する
基本プロセス
パイプラインをセキュリティで保護するための次の手順は、すべてのパイプラインで似ています。
- パイプラインが同じ組織内で異なるプロジェクト間でアクセスする必要がある Azure Repos リポジトリを特定します。
これを行うには、パイプラインを検査するか、 (非)リリース パイプラインの現在のプロジェクトに対するジョブ承認スコープを有効にして パイプラインがチェックアウトに失敗したリポジトリをメモします。最初に失敗した実行では、サブモジュール リポジトリが表示されない場合があります。 - パイプラインがアクセスする必要があるリポジトリを含むプロジェクトごとに そのプロジェクトへのアクセス権をパイプラインのビルド ID に付与します。
- パイプラインがチェックアウトする各リポジトリについてパイプラインのビルド ID Readにそのリポジトリへのアクセス権を付与します。
- パイプラインがチェックアウトし、同じプロジェクト内にあるリポジトリによってサブモジュールとして使用される各リポジトリについてパイプラインのビルド ID Readにそのリポジトリへのアクセス権を付与します。
- 非リリース パイプライン 現在のプロジェクトに対してジョブ承認スコープを有効にする、 リリース パイプラインの場合は現在のプロジェクトに対するLimit ジョブ承認スコープ、 YAML パイプライン内のリポジトリへのアクセスを保護します。
ビルド パイプライン
パイプラインが Azure Repos にアクセスするときにパイプラインのセキュリティを強化するために実行する手順を示すために、次の例を使用します。
SpaceGameWeb
Azure Repos リポジトリのfabrikam-tailspin/SpaceGameWeb
プロジェクトでホストされているSpaceGameWeb
パイプラインで作業しているとします。SpaceGameWeb
パイプラインは、同じプロジェクト内のSpaceGameWebReact
リポジトリと、fabrikam-tailspin/FabrikamFiber
プロジェクトのFabrikamFiber
リポジトリとFabrikamChat
リポジトリをチェックアウトします。FabrikamFiber
リポジトリは、同じプロジェクトでホストされているサブモジュールとしてFabrikamFiberLib
リポジトリを使用します。SpaceGameWeb
プロジェクトのリポジトリ構造は、次のスクリーンショットのようになります。FabrikamFiber
プロジェクトのリポジトリ構造は、次のスクリーンショットのようになります。- たとえば、プロジェクトがプロジェクトベースのビルド ID を使用したり、YAML パイプラインのリポジトリへのアクセスを保護したりするように設定されていないとします。 また、パイプラインが既に正常に実行されているとします。
ビルド パイプラインにプロジェクト ベースのビルド ID を使用する
パイプラインの実行中に、リポジトリ、サービス接続、変数グループなどのリソースにアクセスするために ID が使用されます。 パイプラインでは、プロジェクト レベルとコレクション レベルの 2 種類の ID を利用できます。 前者はセキュリティを優先し、後者は使いやすさを重視しています。 詳細については、「 スコープのビルド ID および ジョブ承認スコープを参照してください。
セキュリティを強化するには、パイプラインを実行するときにプロジェクト レベルの ID を使用します。 これらの ID は、関連するプロジェクト内のリソースにのみアクセスでき、悪意のあるアクターによる不正アクセスのリスクを最小限に抑えます。
プロジェクト レベルの ID を使用するようにパイプラインを構成するには、 Limit ジョブ承認スコープを非リリース パイプラインの現在のプロジェクトに対して有効にします 設定。
実行中の例では、このトグルがオフの場合、SpaceGameWeb
パイプラインはすべてのプロジェクト内のすべてのリポジトリにアクセスできます。 トグルがオンの場合、SpaceGameWeb
は fabrikam-tailspin/SpaceGameWeb
プロジェクト内のリソースにのみアクセスできるため、SpaceGameWeb
と SpaceGameWebReact
リポジトリのみアクセスできます。
この例のパイプラインを実行すると、トグルをオンにするとパイプラインが失敗し、エラー ログに 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
リポジトリにアクセスするためのアクセス許可を要求します。
サンプル パイプラインを実行すると、次の例のようにビルドされます。
パイプライン リポジトリまたはリソースにアクセス許可を付与します。
パイプラインは実行されますが、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 つが、FabrikamFiber
と FabrikamFiberLib
リポジトリの例のように、サブモジュールとして (同じプロジェクト内の) 別のリポジトリを使用するとします。 「サブモジュールをチェックアウトする方法」の詳細を参照してください。
さらに、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 プロセス 」セクションの手順に従います。
この例のパイプラインは成功します。