Säker åtkomst till Azure-lagringsplatser från pipelines
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Dina lagringsplatser är viktiga för din affärsframgång eftersom de rymmer den kod som driver din verksamhet. Åtkomst till lagringsplatser bör kontrolleras noggrant. Den här artikeln beskriver hur du förbättrar säkerheten för bygg-pipeline och klassisk versionspipeline vid åtkomst till Azure Repos för att minska risken för obehörig åtkomst.
Aktivera följande reglage för att säkerställa säker åtkomst till Azure-lagringsplatser:
- Begränsa omfånget för jobbauktorisering till aktuellt projekt för pipelines som inte släpps
- Begränsa jobbauktoriseringsomfånget till aktuellt projekt för versionspipelines
- Skydda åtkomsten till lagringsplatser i YAML-pipelines
Basic-processen
Följande steg för att skydda dina pipelines liknar alla pipelines:
- Identifiera de Azure Repos-lagringsplatser som din pipeline kräver åtkomst till inom samma organisation men i olika projekt.
Gör det genom att inspektera pipelinen eller aktivera Begränsa jobbets auktoriseringsomfång till det aktuella projektet för (icke-)versionspipelines och notera vilka lagringsplatser pipelinen inte kan checka ut. Undermodullagringsplatser kanske inte visas i den första misslyckade körningen. - Ge pipelinens byggidentitet åtkomst till projektet för varje projekt som innehåller en lagringsplats som din pipeline behöver åtkomst till.
- Ge pipelinens byggidentitet läsbehörighet till lagringsplatsen för varje lagringsplats som pipelinen checkar ut.
- Ge pipelinens byggidentitet läsbehörighet till lagringsplatsen för varje lagringsplats som används som en undermodul av en lagringsplats som pipelinen checkar ut och finns i samma projekt.
- Aktivera Begränsa omfånget för jobbauktorisering till aktuellt projekt för pipelines som inte släpps, Begränsa omfånget för jobbauktorisering till aktuellt projekt för versionspipelines och Skydda åtkomsten till lagringsplatser i YAML-pipelines.
Skapa pipelines
För att illustrera de steg som ska utföras för att förbättra säkerheten för dina pipelines när de får åtkomst till Azure Repos använder vi följande exempel.
- Anta att du arbetar med pipelinen
SpaceGameWeb
som finns ifabrikam-tailspin/SpaceGameWeb
projektet påSpaceGameWeb
Azure Repos-lagringsplatsen. - Din
SpaceGameWeb
pipeline checkar ut lagringsplatsenSpaceGameWebReact
i samma projekt och lagringsplatsernaFabrikamFiber
ochFabrikamChat
ifabrikam-tailspin/FabrikamFiber
projektet. - Lagringsplatsen
FabrikamFiber
använder lagringsplatsenFabrikamFiberLib
som en undermodul som finns i samma projekt. - Projektets
SpaceGameWeb
lagringsplatsstrukturer ser ut så här i följande skärmbild. - Projektets
FabrikamFiber
lagringsplatsstrukturer ser ut så här i följande skärmbild. - Anta att projektet inte är konfigurerat för att använda en projektbaserad byggidentitet eller för att skydda åtkomsten till lagringsplatser i YAML-pipelines. Anta också att du redan har kört pipelinen.
Använda en projektbaserad byggidentitet för bygg-pipelines
Under pipelinekörningen används en identitet för att komma åt resurser, till exempel lagringsplatser, tjänstanslutningar och variabelgrupper. Pipelines kan använda två typer av identiteter: projektnivå och samlingsnivå. Den förstnämnda prioriterar säkerhet, medan den senare betonar användarvänlighet. Mer information finns i omfångsbegränsade byggidentiteter och jobbauktoriseringsomfång.
För förbättrad säkerhet använder du identiteter på projektnivå när du kör dina pipelines. Dessa identiteter kan bara komma åt resurser i deras associerade projekt, vilket minimerar risken för obehörig åtkomst av skadliga aktörer.
Om du vill konfigurera din pipeline för att använda en identitet på projektnivå aktiverar du inställningen Begränsa jobbauktorisering till aktuellt projekt för pipelines som inte släpps.
När den här växlingsknappen är inaktiverad i vårt exempel kan pipelinen SpaceGameWeb
komma åt alla lagringsplatser i alla projekt. När växlingsknappen är på SpaceGameWeb
kan du bara komma åt resurser i fabrikam-tailspin/SpaceGameWeb
projektet, så endast lagringsplatserna SpaceGameWeb
och SpaceGameWebReact
.
Om du kör vår exempelpipeline, när du aktiverar växlingsknappen, misslyckas pipelinen och felloggarna berättar för dig 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.
och 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ölj stegen som beskrivs i avsnittet Grundläggande process i den här artikeln för att åtgärda utcheckningsproblemen.
Dessutom kan du uttryckligen checka ut undermodullagringsplatserna före de lagringsplatser som använder dem. I vårt exempel innebär det lagringsplatsen FabrikamFiberLib
.
Om du kör vår exempelpipeline lyckas den.
Ytterligare konfiguration
Om du vill förbättra säkerheten ytterligare när du kommer åt Azure Repos kan du överväga att aktivera Skydda åtkomst till lagringsplatser i YAML-pipelines.
Anta att pipelinen SpaceGameWeb
är en YAML-pipeline och att dess YAML-källkod liknar följande kod.
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
- ...
Skydda åtkomsten till lagringsplatser i YAML-pipelines
Azure DevOps tillhandahåller en detaljerad behörighetsmekanism för Azure Repos-lagringsplatser i form av inställningen Skydda åtkomst till lagringsplatser i YAML-pipelines . Den här inställningen gör att en YAML-pipeline uttryckligen ber om behörighet att komma åt alla Azure Repos-lagringsplatser, oavsett vilket projekt de tillhör. Mer information finns i åtkomstdatabaser. Den här inställningen påverkar inte att checka ut andra typer av lagringsplatser, till exempel GitHub-värdbaserade.
När den här inställningen är aktiverad i vårt exempel ber pipelinen SpaceGameWeb
om behörighet att komma åt SpaceGameWebReact
lagringsplatsen i fabrikam-tailspin/SpaceGameWeb
projektet och FabrikamFiber
lagringsplatserna och FabrikamChat
i fabrikam-tailspin/FabrikamFiber
projektet.
När du kör exempelpipelinen bygger den på ett liknande sätt som i följande exempel.
Bevilja behörighet till dina pipelinelagringsplatser eller resurser.
Din pipeline körs, men misslyckas eftersom den inte kan checka ut lagringsplatsen FabrikamFiberLib
som en undermodul av FabrikamFiber
. Lös problemet genom att uttryckligen ta en titt på FabrikamFiberLib
, genom att lägga till ett - checkout: git://FabrikamFiber/FabrikamFiberLib
steg före steget -checkout: FabrikamFiber
.
Exempelpipelinen lyckas.
Vår sista YAML-pipeline källkod ser ut som följande kodfragment.
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
Felsökning
Använd följande lösningar för eventuella problem som uppstår.
Du använder git på kommandoraden för att checka ut lagringsplatser i samma organisation
Du använder - script: git clone https://$(System.AccessToken)@dev.azure.com/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/
till exempel . Kommandot misslyckas när inställningen Skydda åtkomst till lagringsplatser i YAML-pipelines är aktiverad.
Lös problemet genom att checka ut lagringsplatsen OtherRepo
med kommandot checkout
, till exempel - checkout: git://FabrikamFiber/OtherRepo
.
En lagringsplats använder en annan lagringsplats som undermodul
Anta att en av lagringsplatserna som din pipeline checkar ut använder en annan lagringsplats (i samma projekt) som undermodul, vilket är fallet i vårt exempel för lagringsplatserna FabrikamFiber
och FabrikamFiberLib
. Läs mer om hur du checkar ut undermoduler.
Anta dessutom att du gav byggidentiteten SpaceGame
läsbehörighet till den här lagringsplatsen, men att utcheckningen av FabrikamFiber
lagringsplatsen fortfarande misslyckas när du checkar ut undermodulen FabrikamFiberLib
.
Lös problemet genom att uttryckligen FabrikamFiberLib
kolla in , genom att lägga till ett - checkout: git://FabrikamFiber/FabrikamFiberLib
steg före det -checkout: FabrikamFiber
.
Klassiska versionspipelines
Processen för att skydda åtkomst till lagringsplatser för versionspipelines liknar den för bygg-pipelines.
För att illustrera de steg du behöver vidta använder vi ett exempel som körs. I vårt exempel finns det en versionspipeline med namnet FabrikamFiberDocRelease
i fabrikam-tailspin/FabrikamFiberDocRelease
projektet. Anta att pipelinen checkar ut FabrikamFiber
lagringsplatsen i fabrikam-tailspin/FabrikamFiber
projektet, kör ett kommando för att generera offentlig dokumentation och publicerar den sedan på en webbplats. Tänk dig dessutom att lagringsplatsen FabrikamFiber
använder FabrikamFiberLib
lagringsplatsen (i samma projekt) som en undermodul.
Använda en projektbaserad byggidentitet för klassiska versionspipelines
När en pipeline körs använder den en identitet för att komma åt olika resurser, till exempel lagringsplatser, tjänstanslutningar, variabelgrupper. Det finns två typer av identiteter som en pipeline kan använda: en på projektnivå en och en samlingsnivå. Den förra ger bättre säkerhet. Det senare ger enkel användning. Läs mer om begränsade byggidentiteter och omfång för jobbauktorisering.
Vi rekommenderar att du använder identiteter på projektnivå för att köra dina pipelines. Som standard kan identiteter på projektnivå bara komma åt resurser i projektet som de är medlemmar i. Att använda den här identiteten förbättrar säkerheten eftersom det minskar den åtkomst som en obehörig person får när du kapar din pipeline.
Om du vill att pipelinen ska använda en identitet på projektnivå aktiverar du inställningen Begränsa jobbauktorisering till aktuellt projekt för versionspipelines .
När den här växlingsknappen är avstängd FabrikamFiberDocRelease
i vårt exempel kan versionspipelinen komma åt alla lagringsplatser i alla projekt, inklusive lagringsplatsen FabrikamFiber
. När växlingsknappen är på FabrikamFiberDocRelease
kan du bara komma åt resurser i fabrikam-tailspin/FabrikamFiberDocRelease
projektet, så lagringsplatsen FabrikamFiber
blir otillgänglig.
Om du kör vår exempelpipeline, när du aktiverar växlingsknappen, misslyckas pipelinen och loggarna visar 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ölj stegen i avsnittet Grundläggande process i den här artikeln för att åtgärda dessa problem.
Vår exempelpipeline lyckas.