Konfigurieren des sicheren Zugriffs auf Azure Repos aus Pipelines

Ihre Repositorys sind eine wichtige Ressource für Ihren Geschäftserfolg, weil sie den Code enthalten, der Ihr Unternehmen unterstützt. Der Zugriff auf Repositorys sollte nicht einfach erteilt werden.

In diesem Artikel erfahren Sie, wie Sie die Sicherheit Ihrer Pipelines verbessern, die auf Azure Repos zugreifen, um das Risiko zu begrenzen, dass Ihr Quellcode in die falschen Hände gelangt.

Bei der Einrichtung von Pipelines für den sicheren Zugriff auf Azure-Repositorys werden die Umschaltflächen Auftragsautorisierungsbereich für Nicht-Releasepipelines auf aktuelles Projekt beschränken, Auftragsautorisierungsbereich für Releasepipelines auf aktuelles Projekt beschränken und Zugriff auf Repositorys in YAML-Pipelines schützen aktiviert.

Wir behandeln sowohl Buildpipelines als auch klassische Releasepipelines:

Basic-Prozess

Die Schritte sind für alle Pipelines ähnlich:

  1. Ermitteln Sie die Liste der Azure Repos-Repositorys, auf die Ihre Pipeline Zugriff benötigt, die Teil derselben Organisation sind, sich aber in unterschiedlichen Projekten befinden.

    Sie können die Liste der Repositorys kompilieren, indem Sie Ihre Pipeline überprüfen. Oder Sie können die Umschaltfläche Auftragsautorisierungsbereich auf aktuelles Projekt für (Nicht-)Releasepipelines beschränken aktivieren und feststellen, welche Repositorys Ihre Pipeline nicht auscheckt. Submodulrepositorys werden möglicherweise in der ersten fehlerhaften Ausführung nicht angezeigt.

  2. Führen Sie für jedes Azure DevOps-Projekt, das ein Repository enthält, auf das Ihre Pipeline zugreifen muss, die Schritte zum Erteilen des Zugriffs auf das Projekt für die Buildidentität der Pipeline aus.

  3. Führen Sie für jedes Azure Repos-Repository, das Ihre Pipeline auscheckt, die Schritte zum Erteilen von Lesezugriff auf dieses Repository für die Buildidentität der Pipeline aus.

  4. Führen Sie für jedes Repository, das von einem Repository, das Ihre Pipeline auscheckt, als Submodul verwendet wird und sich im selben Projekt befindet, die Schritte zum Erteilen von Lesezugriff auf dieses Repository für die Buildidentität der Pipeline aus.

  5. Aktivieren Sie die Umschaltflächen Auftragsautorisierungsbereich für Nicht-Releasepipelines auf aktuelles Projekt beschränken, Auftragsautorisierungsbereich für Releasepipelines auf aktuelles Projekt beschränken und Zugriff auf Repositorys in YAML-Pipelines schützen.

Buildpipelines

Um die Schritte zur Verbesserung der Sicherheit Ihrer Pipelines beim Zugriff auf Azure Repos zu veranschaulichen, verwenden wir ein aktuell ausgeführtes Beispiel.

Angenommen, Sie arbeiten an der SpaceGameWeb-Pipeline, die im fabrikam-tailspin/SpaceGameWeb-Projekt im Azure Repos-Repository SpaceGameWeb gehostet wird. Nehmen Sie außerdem an, dass Ihre SpaceGameWeb-Pipeline checkt das SpaceGameWebReact-Repository im selben Projekt und die FabrikamFiber- und FabrikamChat-Repositorys im fabrikam-tailspin/FabrikamFiber-Projekt auscheckt.

Nehmen Sie schließlich an, dass das FabrikamFiber-Repository das FabrikamFiberLib-Repository als Untermodul verwendet, das im selben Projekt gehostet wird. Erfahren Sie mehr über das Auschecken von Untermodulen.

Die SpaceGameWeb-Repositorystrukturen des Projekts sehen wie im folgenden Screenshot gezeigt aus.

Screenshot of the SpaceGameWeb repository structure.

Die FabrikamFiber-Repositorystrukturen des Projekts sehen wie im folgenden Screenshot gezeigt aus.

Screenshot of the FabrikamFiber repository structure.

Stellen Sie sich vor, Ihr Projekt wurde nicht dafür konfiguriert, eine projektbasierte Buildidentität zu verwenden oder den Zugriff auf Repositorys in YAML-Pipelines zu schützen. Nehmen Sie außerdem an, dass Sie Ihre Pipeline bereits erfolgreich ausgeführt haben.

Verwenden einer projektbasierten Buildidentität für Buildpipelines

Wenn eine Pipeline ausgeführt wird, wird eine Identität verwendet, um auf verschiedene Ressourcen wie Repositorys, Dienstverbindungen und Variablengruppen zuzugreifen. Es gibt zwei Arten von Identitäten, die von einer Pipeline verwendet werden können: eine Identität auf Projektebene und eine Identität auf Sammlungsebene. Ersteres bietet mehr Sicherheit, letzteres mehr Benutzerfreundlichkeit. Erfahren Sie mehr über bereichsbezogene Buildidentitäten und den Auftragsautorisierungsbereich.

Es wird empfohlen, Identitäten auf Projektebene zum Ausführen Ihrer Pipelines zu verwenden. Standardmäßig können Identitäten auf Projektebene nur auf Ressourcen in dem Projekt zugreifen, dessen Mitglied sie sind. Die Verwendung dieser Identität verbessert die Sicherheit, weil sie den Zugriff einer böswilligen Person bei einem Angriff auf Ihre Pipeline einschränkt.

Damit Ihre Pipeline eine Identität auf Projektebene verwendet, aktivieren Sie die Einstellung Auftragsautorisierungsbereich auf aktuelles Projekt für Nicht-Releasepipelines beschränken .

In unserem aktuell ausgeführten Beispiel kann die SpaceGameWeb-Pipeline auf alle Repositorys in allen Projekten zugreifen, wenn diese Umschaltfläche deaktiviert ist. Wenn die Umschaltfläche aktiviert ist, kann SpaceGameWeb nur auf Ressourcen im fabrikam-tailspin/SpaceGameWeb-Projekt zugreifen, also nur auf die SpaceGameWeb- und SpaceGameWebReact-Repositorys.

Wenn Sie unsere Beispielpipeline ausführen, schlägt die Pipeline fehl, wenn Sie die Umschaltfläche aktivieren, und die Fehlerprotokolle enthalten die folgenden Meldungen: 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. und 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.

Führen Sie zum Beheben der Check-Out-Probleme die unter Grundlegende Vorgehensweise beschriebenen Schritte aus.

Darüber hinaus müssen Sie die Untermodulrepositorys vor den Repositorys, die sie verwenden, explizit auschecken. In unserem Beispiel bedeutet dies das FabrikamFiberLib-Repository.

Wenn Sie jetzt unsere Beispielpipeline ausführen, ist sie erfolgreich.

Weitere Konfiguration

Um die Sicherheit beim Zugriff auf Azure Repos weiter zu verbessern, sollten Sie die Einstellung Zugriff auf Repositorys in YAML-Pipelines schützen aktivieren.

Angenommen, die SpaceGameWeb-Pipeline ist eine YAML-Pipeline, und der YAML-Quellcode sieht ähnlich wie der folgende Code aus.

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
  - ...

Schützen des Zugriffs auf Repositorys in YAML-Pipelines

Azure DevOps bietet einen differenzierten Berechtigungsmechanismus für Azure Repos-Repositorys in Form der Einstellung Zugriff auf Repositorys in YAML-Pipelines schützen. Mit dieser Einstellung fordert eine YAML-Pipeline explizit die Berechtigung für den Zugriff auf alle Azure Repos-Repositorys an, und zwar unabhängig davon, zu welchem Projekt sie gehören. Erfahren Sie mehr über diese Einstellung. Das Auschecken anderer Repositorytypen, z. B. von in GitHub gehosteten Repositorys, ist von dieser Einstellung nicht betroffen.

In unserem aktuell ausgeführten Beispiel fordert die Pipeline die SpaceGameWeb-Berechtigung für den Zugriff auf das SpaceGameWebReact-Repository im fabrikam-tailspin/SpaceGameWeb-Projekt sowie die FabrikamFiber- und FabrikamChat-Repositorys im fabrikam-tailspin/FabrikamFiber-Projekt an, wenn dieser Umschalter aktiviert ist.

Wenn Sie die Beispielpipeline ausführen, erhalten einen Build ähnlich dem im folgenden Screenshot gezeigten. Screenshot of running the SpaceGameWeb pipeline the first time after turning on the Protect access to repositories in YAML pipelines toggle.

Sie werden aufgefordert, den Repositorys, die Ihre Pipeline auscheckt oder als Ressourcen definiert hat, Berechtigungen zu erteilen. Screenshot of being asked to grant permission to the SpaceGameWeb pipeline to access three repositories.

Sobald Sie so vorgehen, wird ihre Pipeline ausgeführt, aber sie schlägt fehl, weil sie das FabrikamFiberLib-Repository nicht als Untermodul von FabrikamFiber auschecken kann. Um dieses Problem zu beheben, checken Sie FabrikamFiberLib explizit aus, fügen Sie z. B. einen - checkout: git://FabrikamFiber/FabrikamFiberLib-Schritt vor dem -checkout: FabrikamFiber-Schritt ein.

Wenn Sie die Beispielpipeline jetzt ausführen, ist sie erfolgreich.

Unser endgültiger YAML-Pipelinequellcode sieht wie der folgende Codeschnipsel aus.

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

Problembehandlung

Hier werden einige problematische Situationen genannt und wie damit umgegangen werden kann.

Sie verwenden Git in der Befehlszeile, um Repositorys in der gleichen Organisation auszuchecken

Sie verwenden z. B. - script: git clone https://$(System.AccessToken)@dev.azure.com/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/. Der Befehl schlägt fehl, wenn die Umschaltfläche Zugriff auf Repositorys in YAML-Pipelines schützen aktiviert ist.

Um das Problem zu beheben, überprüfen Sie das OtherRepo-Repository mithilfe des checkout-Befehls, z. B. - checkout: git://FabrikamFiber/OtherRepo.

Ein Repository verwendet ein anderes Repository als Untermodul

Angenommen, eines der Repositorys, das Ihre Pipeline auscheckt, verwendet ein anderes Repository (im selben Projekt) als Untermodul, wie dies in unserem Beispiel für die Repositorys FabrikamFiber und FabrikamFiberLib der Fall ist. Erfahren Sie mehr über das Auschecken von Untermodulen.

Nehmen Sie außerdem an, dass Sie der SpaceGame-Buildidentität Lesezugriff auf dieses Repository erteilt haben, aber das Auschecken des FabrikamFiber-Repositorys schlägt beim Auschecken des FabrikamFiberLib-Untermoduls immer noch fehl.

Um dieses Problem zu beheben, checken Sie FabrikamFiberLib explizit aus, fügen Sie z. B. einen - checkout: git://FabrikamFiber/FabrikamFiberLib-Schritt vor dem -checkout: FabrikamFiber-Schritt ein.

Klassische Releasepipelines

Das Verfahren zum Sichern des Zugriffs auf Repositorys für Releasepipelines ähnelt dem Verfahren für Buildpipelines.

Um die Schritte zu veranschaulichen, die Sie ausführen müssen, verwenden wir ein aktuell ausgeführtes Beispiel. In unserem Beispiel gibt es eine Releasepipeline namens FabrikamFiberDocRelease im fabrikam-tailspin/FabrikamFiberDocRelease-Projekt. Angenommen, die Pipeline checkt das FabrikamFiber-Repository im fabrikam-tailspin/FabrikamFiber-Projekt aus, führt einen Befehl aus, um öffentliche Dokumentation zu generieren, und veröffentlicht sie dann auf einer Website. Stellen Sie sich außerdem vor, das FabrikamFiber-Repository verwendet das FabrikamFiberLib-Repository (im selben Projekt) als Untermodul.

Verwenden einer projektbasierten Buildidentität für klassische Releasepipelines

Wenn eine Pipeline ausgeführt wird, wird eine Identität verwendet, um auf verschiedene Ressourcen wie Repositorys, Dienstverbindungen und Variablengruppen zuzugreifen. Es gibt zwei Arten von Identitäten, die von einer Pipeline verwendet werden können: eine Identität auf Projektebene und eine Identität auf Sammlungsebene. Ersteres bietet mehr Sicherheit, letzteres mehr Benutzerfreundlichkeit. Erfahren Sie mehr über bereichsbezogene Buildidentitäten und den Auftragsautorisierungsbereich.

Es wird empfohlen, Identitäten auf Projektebene zum Ausführen Ihrer Pipelines zu verwenden. Standardmäßig können Identitäten auf Projektebene nur auf Ressourcen in dem Projekt zugreifen, dessen Mitglied sie sind. Die Verwendung dieser Identität verbessert die Sicherheit, weil sie den Zugriff einer böswilligen Person bei einem Angriff auf Ihre Pipeline einschränkt.

Damit Ihre Pipeline eine Identität auf Projektebene verwendet, aktivieren Sie die Einstellung Auftragsautorisierungsbereich auf aktuelles Projekt für Nicht-Releasepipelines beschränken.

In unserem aktuell ausgeführten Beispiel kann die FabrikamFiberDocRelease-Releasepipeline auf alle Repositorys in allen Projekten zugreifen (auch auf das FabrikamFiber-Repository), wenn diese Umschaltfläche deaktiviert ist. Wenn die Umschaltfläche aktiviert ist, kann FabrikamFiberDocRelease nur auf Ressourcen im fabrikam-tailspin/FabrikamFiberDocRelease-Projekt zugreifen, sodass auf das FabrikamFiber-Repository nicht mehr zugegriffen werden kann.

Wenn Sie unsere Beispielpipeline ausführen, schlägt die Pipeline fehl, wenn Sie die Umschaltfläche aktivieren, und die Protokolle enthalten die Meldung 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.

Führen Sie zum Beheben dieser Probleme die Schritte unter Grundlegendes Verfahren aus.

Wenn Sie jetzt unsere Beispielpipeline ausführen, ist sie erfolgreich.

Weitere Informationen