パイプラインから Azure Repos へのアクセスをセキュリティで保護する
リポジトリには、ビジネスを強化するコードが含まれているため、ビジネスの成功にとって重要なリソースです。 リポジトリへのアクセスは簡単に付与するべきではありません。
この記事では、ソース コードが悪用されるリスクを制限するために、Azure Repos にアクセスするパイプラインのセキュリティを強化する方法について説明します。
Azure リポジトリに安全にアクセスするようにパイプラインを設定するには、[非リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]、[リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]、[YAML パイプライン内のリポジトリへのアクセスを保護する] の各トグルを有効にします。
ビルド パイプラインとクラシック リリース パイプラインの両方について説明します。
基本プロセス
手順は、すべてのパイプラインで同様です。
パイプラインがアクセスする必要のある Azure Repos リポジトリのうち、同じ組織に属しているが、異なるプロジェクトに属するもののリストを決定します。
パイプラインを調べることで、リポジトリの一覧をコンパイルできます。 または、[(非) リリース パイプラインのジョブ承認スコープを現在のプロジェクトに制限する] トグルをオンにして、パイプラインがチェックアウトに失敗したリポジトリをメモすることもできます。サブモジュール リポジトリは、最初に失敗した実行では表示されない場合があります。
パイプラインがアクセスする必要があるリポジトリを含む Azure DevOps プロジェクトごとに、手順に従って、パイプラインのビルド ID にそのプロジェクトへのアクセス権を付与します。
パイプラインがチェックアウトする Azure Repos リポジトリごとに、手順に従って、パイプラインのビルド ID にそのリポジトリへの読み取りアクセス権を付与します。
パイプラインがチェックアウトし、同じプロジェクト内にあるリポジトリによってサブモジュールとして使用されるリポジトリごとに、手順に従って、パイプラインのビルド ID にそのリポジトリへの読み取りアクセス権を付与します。
[非リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]、[リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]、[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 を使用して、リポジトリ、サービス接続、変数グループなどのさまざまなリソースにアクセスします。 パイプラインで使用できる ID には、プロジェクト レベル 1 とコレクション レベル 1 の 2 種類があります。 前者はより良いセキュリティを提供し、後者は使いやすさを提供します。 スコープ付きビルド ID とジョブ承認スコープの詳細を参照してください。
パイプラインを実行するには、プロジェクト レベルの ID を使用することをお勧めします。 既定では、プロジェクト レベルの ID は、メンバーであるプロジェクト内のリソースにのみアクセスできます。 この ID を使用すると、パイプラインを乗っ取るときに悪意のある人物によって取得されるアクセスが減少するため、セキュリティが向上します。
パイプラインでプロジェクト レベルの ID を使用するには、[非リリース パイプラインのジョブの承認スコープを現在のプロジェクトに制限する]設定をオンにします。
実行中の例では、このトグルがオフの場合、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.
が表示されます
チェックアウトの問題を解決するには、「基本的なプロセス」で説明されている手順に従います。
さらに、サブモジュール リポジトリは、それを使用するリポジトリの前に、明示的にチェックアウトする必要があります。 この例では、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 パイプライン内のリポジトリへのアクセスを保護する] トグルがオンの場合、コマンドは失敗します。
この問題を解決するには、checkout
コマンド (例: - checkout: git://FabrikamFiber/OtherRepo
) を使用して 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.
と表示されます
これらの問題を解決するには、「基本的なプロセス」の手順に従います。
このサンプル パイプラインを実行すると、成功します。