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

Vaše úložiště jsou důležitým prostředkem pro úspěch vaší firmy, protože obsahují kód, který řídí vaši firmu. Přístup k úložištím by neměl být udělen snadno.

V tomto článku se dozvíte, jak zlepšit zabezpečení kanálů přistupujících k Azure Repos, abyste omezili riziko, že se zdrojový kód dostane do nesprávných rukou.

V nastavení zabezpečeného přístupu kanálů k úložištím Azure jsou zapnuté přepínače Omezit obor autorizace úloh na aktuální projekt pro jiné kanály než kanály verze, Omezit obor autorizace úloh na aktuální projekt pro kanály verze a Chránit přístup k úložištím v kanálech YAML.

Probereme kanály buildu i kanály klasické verze:

Proces Basic (základní)

Postup je podobný pro všechny kanály:

  1. Určete seznam úložišť Azure Repos, ke kterým váš kanál potřebuje přístup, který je součástí stejné organizace, ale nachází se v různých projektech.

    Seznam úložišť můžete zkompilovat kontrolou kanálu. Nebo můžete zapnout přepínač Omezit rozsah autorizace úlohy na aktuální projekt pro kanály verze (bez verze) a poznamenat, 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. Pro každý projekt Azure DevOps, který obsahuje úložiště, ke kterému váš kanál potřebuje přístup, postupujte podle kroků a udělte identitě sestavení kanálu přístup k danému projektu.

  3. Pro každé úložiště Azure Repos, které váš kanál rezervuje, udělte identitě sestavení kanálu přístup ke čtení z tohoto úložiště podle pokynů.

  4. Pro každé úložiště, které se používá jako dílčí modul úložištěm, které váš kanál rezervuje a je ve stejném projektu, pomocí kroků udělte identitě sestavení kanálu přístup ke čtení tohoto úložiště.

  5. Zapněte 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 zapněte přepínač Chránit přístup k úložištím v kanálech YAML.

Kanály buildu

Abychom si ukázali, jak zlepšit zabezpečení vašich kanálů při přístupu k Azure Repos, použijeme spuštěný 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. Řekněme také, že váš SpaceGameWeb kanál zkontroluje SpaceGameWebReact úložiště ve stejném projektu a FabrikamChatFabrikamFiber úložiště v fabrikam-tailspin/FabrikamFiber projektu.

Nakonec předpokládejme, že FabrikamFiber úložiště používá FabrikamFiberLib úložiště jako dílčí modul hostovaný ve stejném projektu. Přečtěte si další informace o tom, jak si prohlédnout dílčí režimy.

SpaceGameWeb Struktury úložiště projektu vypadají jako na následujícím snímku obrazovky.

Screenshot of the SpaceGameWeb repository structure.

FabrikamFiber Struktury úložiště projektu vypadají jako na následujícím snímku obrazovky.

Screenshot of the FabrikamFiber repository structure.

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 jste kanál úspěšně spustili.

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

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í z nich poskytuje lepší zabezpečení, druhé 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 kanál používal identitu na úrovni projektu, zapněte obor omezení autorizace úloh 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. sdělí 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 základním procesu.

Kromě toho je potřeba před jejich použitím explicitně rezervovat úložiště dílčího modulu. V našem příkladu FabrikamFiberLib to znamená úložiště.

Pokud teď 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 zapnutí ochrany přístupu k úložištím v nastavení kanálů 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ří. Přečtěte si další informace o tomto nastavení. Toto nastavení nemá vliv na rezervaci jiných typů úložišť, například úložišť hostovaných na GitHubu.

Když je tento přepínač zapnutý, SpaceGameWeb kanál v našem příkladu 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 FabrikamChatfabrikam-tailspin/FabrikamFiber projektu.

Když spustíte ukázkový kanál, zobrazí se build podobný následujícímu snímku obrazovky. Screenshot of running the SpaceGameWeb pipeline the first time after turning on the Protect access to repositories in YAML pipelines toggle.

Zobrazí se výzva k udělení oprávnění k rezervování kanálu nebo jeho definování jako prostředky. Screenshot of being asked to grant permission to the SpaceGameWeb pipeline to access three repositories.

Jakmile to uděláte, kanál se spustí, ale selže, protože nebude moct rezervovat FabrikamFiberLib úložiště jako dílčí modul .FabrikamFiber Pokud chcete tento problém vyřešit, explicitně si prohlédněte FabrikamFiberLib- checkout: git://FabrikamFiber/FabrikamFiberLib například krok před -checkout: FabrikamFiber tímto krokem.

Pokud teď spustíte ukázkový kanál, bude ú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

Tady je několik problematických situací a jejich zpracování.

Ú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ý přepínač 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, - checkout: git://FabrikamFiber/OtherReponapříklad .

Ú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 ho prohlédněte FabrikamFiberLib, například přidejte - checkout: git://FabrikamFiber/FabrikamFiberLib krok před tím -checkout: FabrikamFiber .

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í z nich poskytuje lepší zabezpečení, druhé 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 základním procesu.

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

Viz také