Sdílet prostřednictvím


Zabezpečený přístup k Azure Repos z kanálů

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

Vaše úložiště jsou důležitá pro váš obchodní úspěch, protože tvoří kód, který vaše operace nutí. Přístup k úložištím by měl být pečlivě kontrolovaný. Tento článek vás provede vylepšením zabezpečení kanálu buildu a kanálu verze Classic při přístupu k Azure Repos, abyste snížili riziko neoprávněného přístupu.

Pokud chcete zajistit zabezpečený přístup k úložištím Azure, povolte následující přepínače:

  • Omezení rozsahu autorizace úloh na aktuální projekt pro kanály bez verze
  • Omezení rozsahu autorizace úloh na aktuální projekt pro kanály verze
  • Ochrana přístupu k úložištím v kanálech YAML

Proces Basic (základní)

Následující kroky pro zabezpečení kanálů jsou podobné napříč všemi kanály:

  1. Identifikujte úložiště Azure Repos, ke kterým váš kanál vyžaduje přístup v rámci stejné organizace, ale napříč různými projekty.
    Proveďte to tak, že zkontrolujete kanál nebo povolíte obor autorizace úlohy limitu na aktuální projekt pro kanály verze (ne) a všimněte si, která úložiště se kanál nedaří rezervovat. Úložiště dílčího modulu se nemusí zobrazit v prvním neúspěšném spuštění.
  2. Udělte identitě sestavení kanálu přístup k danému projektu pro každý projekt, který obsahuje úložiště, ke kterému má váš kanál přístup.
  3. Udělte identitě sestavení kanálu přístup ke čtení tohoto úložiště pro každé úložiště , které váš kanál rezervuje.
  4. Udělte identitě sestavení kanálu přístup ke čtení tohoto úložiště pro každé úložiště , které se používá jako dílčí modul úložiště, které váš kanál rezervuje a nachází se ve stejném projektu.
  5. Povolte obor omezení autorizace úlohy na aktuální projekt pro kanály bez verze, omezte rozsah autorizace úloh na aktuální projekt pro kanály verze a chraňte přístup k úložištím v kanálech YAML.

Kanály buildu

Abychom si ukázali postup, jak zlepšit zabezpečení vašich kanálů při přístupu ke službě Azure Repos, použijeme následující příklad.

  • Předpokládejme, že pracujete na SpaceGameWeb kanálu hostovaného v fabrikam-tailspin/SpaceGameWeb projektu v SpaceGameWeb úložišti Azure Repos.
  • Kanál SpaceGameWeb zkontroluje SpaceGameWebReact úložiště ve stejném projektu a FabrikamFiber FabrikamChat úložiště v fabrikam-tailspin/FabrikamFiber projektu.
  • Úložiště FabrikamFiber používá FabrikamFiberLib úložiště jako dílčí modul hostovaný ve stejném projektu.
  • SpaceGameWeb Struktury úložiště projektu vypadají jako na následujícím snímku obrazovky. Snímek obrazovky se strukturou úložiště SpaceGameWeb
  • FabrikamFiber Struktury úložiště projektu vypadají jako na následujícím snímku obrazovky. Snímek obrazovky struktury úložiště FabrikamFiber
  • Představte si, že váš projekt není nastavený tak, aby používal identitu sestavení založenou na projektu nebo chránil přístup k úložištím v kanálech YAML. Předpokládejme také, že už jste kanál úspěšně spustili.

Použití identity sestavení založené na projektu pro kanály buildu

Během provádění kanálu se identita používá pro přístup k prostředkům, jako jsou úložiště, připojení služeb a skupiny proměnných. Kanály můžou využívat dva typy identit: úroveň projektu a úroveň kolekce. První priorita určuje zabezpečení, zatímco druhý zvýrazňuje snadné použití. Další informace najdete v tématu s vymezeným oborem identit sestavení a oboru autorizace úloh.

Pokud chcete zvýšit zabezpečení, při spouštění kanálů používejte identity na úrovni projektu. Tyto identity mají přístup pouze k prostředkům v rámci přidruženého projektu a minimalizují riziko neoprávněného přístupu škodlivých subjektů.

Pokud chcete nakonfigurovat kanál tak, aby používal identitu na úrovni projektu, povolte obor omezení autorizace úlohy na aktuální projekt pro nastavení kanálů bez verze.

Když je tento přepínač vypnutý, může kanál v našem příkladu SpaceGameWeb přistupovat ke všem úložištím ve všech projektech. Když je přepínač zapnutý, SpaceGameWeb může přistupovat pouze k prostředkům fabrikam-tailspin/SpaceGameWeb v projektu, takže pouze úložiště SpaceGameWeb a SpaceGameWebReact úložiště.

Pokud spustíte náš ukázkový kanál, když zapnete přepínač, kanál selže a protokoly chyb vám 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. řeknou a 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.

Pokud chcete vyřešit problémy s rezervacemi, postupujte podle kroků popsaných v části Základní proces tohoto článku.

Kromě toho explicitně zkontrolujte úložiště dílčího modulu před úložišti, která je používají. V našem příkladu FabrikamFiberLib to znamená úložiště.

Pokud spustíte náš ukázkový kanál, bude úspěšný.

Další konfigurace

Pokud chcete zvýšit zabezpečení při přístupu k Azure Repos, zvažte povolení ochrany přístupu k úložištím v kanálech YAML.

Předpokládejme, že SpaceGameWeb kanál je kanál YAML a jeho zdrojový kód YAML vypadá podobně jako následující kód.

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

Ochrana přístupu k úložištím v kanálech YAML

Azure DevOps poskytuje mechanismus jemně odstupňovaných oprávnění pro úložiště Azure Repos ve formě ochrany přístupu k úložištím v nastavení kanálů YAML. Toto nastavení explicitně požádá kanál YAML o oprávnění pro přístup ke všem úložištím Azure Repos bez ohledu na to, ke kterému projektu patří. Další informace najdete v tématu Přístup k úložišťm. Toto nastavení nemá vliv na rezervaci jiných typů úložišť, jako jsou například úložiště hostovaná na GitHubu.

Když je v našem příkladu spuštěno toto nastavení zapnuté, SpaceGameWeb kanál požádá o oprávnění pro přístup SpaceGameWebReact k úložišti v fabrikam-tailspin/SpaceGameWeb projektu a úložiště FabrikamFiber v FabrikamChat fabrikam-tailspin/FabrikamFiber projektu.

Když spustíte ukázkový kanál, sestaví se podobně jako v následujícím příkladu.

Snímek obrazovky s prvním spuštěním kanálu SpaceGameWeb po zapnutí přepínače Chránit přístup k úložištím v kanálech YAML

Udělte oprávnění k úložištím nebo prostředkům kanálu.

Snímek obrazovky s výzvou k udělení oprávnění kanálu SpaceGameWeb pro přístup ke třem úložištím

Kanál se spustí, ale selže, protože nemůže rezervovat FabrikamFiberLib úložiště jako dílčí modul modulu FabrikamFiber. Pokud chcete tento problém vyřešit, explicitně si tento problém projděte FabrikamFiberLibpřidáním - checkout: git://FabrikamFiber/FabrikamFiberLib kroku před -checkout: FabrikamFiber krokem.

Ukázkový kanál je úspěšný.

Konečný zdrojový kód kanálu YAML vypadá jako následující fragment kódu.

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

Řešení problému

Při jakýchkoli problémech, ke kterým dojde, využijte následující řešení.

Úložiště ve stejné organizaci můžete rezervovat pomocí Gitu na příkazovém řádku.

Například používáte - script: git clone https://$(System.AccessToken)@dev.azure.com/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/. Příkaz selže, když je zapnuté nastavení Chránit přístup k úložištím v kanálech YAML.

Pokud chcete tento problém vyřešit, podívejte se na OtherRepo úložiště pomocí checkout příkazu, například - checkout: git://FabrikamFiber/OtherRepo.

Úložiště jako dílčí modul používá jiné úložiště.

Řekněme, že jedno z úložišť, která váš kanál rezervuje, používá jiné úložiště (ve stejném projektu) jako dílčí modul, jak je tomu v našem příkladu FabrikamFiber pro úložiště a FabrikamFiberLib úložiště. Přečtěte si další informace o tom, jak si prohlédnout dílčí režimy.

Předpokládejme také, že jste k tomuto úložišti udělili SpaceGame přístup pro čtení identity sestavení, ale při rezervaci dílčího FabrikamFiberLib modulu se rezervace FabrikamFiber úložiště stále nezdaří.

Pokud chcete tento problém vyřešit, explicitně si tento problém projděte FabrikamFiberLibpřidáním - checkout: git://FabrikamFiber/FabrikamFiberLib kroku před tímto -checkout: FabrikamFiber krokem.

Klasické kanály verze

Proces zabezpečení přístupu k úložištím pro kanály verze je podobný procesu pro kanály buildu.

K ilustraci kroků, které potřebujete provést, použijeme spuštěný příklad. V našem příkladu fabrikam-tailspin/FabrikamFiberDocRelease je v projektu kanál verze s názvemFabrikamFiberDocRelease. Předpokládejme, že kanál zkontroluje FabrikamFiber úložiště v fabrikam-tailspin/FabrikamFiber projektu, spustí příkaz pro vygenerování veřejné dokumentace a pak ho publikuje na web. Představte si také, že FabrikamFiber úložiště používá FabrikamFiberLib úložiště (ve stejném projektu) jako dílčí modul.

Použití identity sestavení založené na projektu pro klasické kanály verze

Když se kanál spustí, používá identitu pro přístup k různým prostředkům, jako jsou úložiště, připojení služeb, skupiny proměnných. Kanál může používat dva typy identit: jeden na úrovni projektu a jeden na úrovni kolekce. První poskytuje lepší zabezpečení. Druhá možnost poskytuje snadné použití. Přečtěte si další informace o vymezených identitách sestavení a oboru autorizace úloh.

Ke spouštění kanálů doporučujeme používat identity na úrovni projektu. Ve výchozím nastavení mají identity na úrovni projektu přístup pouze k prostředkům v projektu, jehož jsou členy. Použití této identity zlepšuje zabezpečení, protože snižuje přístup získaný škodlivou osobou při napadení kanálu.

Pokud chcete, aby váš kanál používal identitu na úrovni projektu, zapněte obor omezení autorizace úlohy na aktuální projekt pro nastavení kanálů verze.

Když je tento přepínač vypnutý, FabrikamFiberDocRelease v našem příkladu může kanál verze přistupovat ke všem úložištím ve všech projektech, včetně FabrikamFiber úložiště. Když je přepínač zapnutý, FabrikamFiberDocRelease může přistupovat pouze k prostředkům fabrikam-tailspin/FabrikamFiberDocRelease v projektu, takže FabrikamFiber úložiště bude nedostupné.

Pokud spustíte náš ukázkový kanál, když zapnete přepínač, kanál selže a protokoly vám řeknou 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.

Pokud chcete tyto problémy vyřešit, postupujte podle kroků v části Základní proces tohoto článku.

Náš ukázkový kanál je úspěšný.