Dela via


Skydda dina Azure Pipelines

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

Pipelines erbjuder kraftfulla funktioner för att köra skript och distribuera kod till produktionsmiljöer, men det är viktigt att balansera den här kraften med säkerhet. Du vill aldrig att en pipeline ska bli en kanal för skadlig kod. Det är viktigt att du balanserar säkerheten med den flexibilitet och kraft som utvecklingsteamen behöver.

Den här artikeln innehåller en översikt över nödvändiga säkerhetsrelaterade konfigurationer för att skydda dina pipelines mot hot och sårbarheter.

Förutsättningar

Kategori Krav
Azure DevOps – Implementera rekommendationer i Gör din Azure DevOps säker.
– Grundläggande kunskaper om YAML och Azure Pipelines. Mer information finns i Skapa din första pipeline.
Behörigheter – Ändra pipelinebehörigheter: Medlem i gruppen Projektadministratörer.
– Ändra organisationsbehörigheter: Medlem i gruppen Projektsamlingsadministratörer.

Begränsa åtkomst till projekt, lagringsplats och tjänstanslutning

För att förbättra säkerheten kan du överväga att separera dina projekt, använda grenprinciper och lägga till fler säkerhetsåtgärder för gafflarna. Minimera omfånget för tjänstanslutningar och använd de säkraste autentiseringsmetoderna.

  • Separata projekt: Hantera varje produkt och team i separata projekt. Detta förhindrar att pipelines från en produkt oavsiktligt kommer åt öppna resurser från en annan produkt, vilket minimerar lateral exponering.
  • Använd identiteter på projektnivå: Använd en projektbaserad byggidentitet för pipelines i stället för en identitet på samlingsnivå. Identiteter på projektnivå kan bara komma åt resurser i deras associerade projekt, vilket minimerar risken för obehörig åtkomst av skadliga aktörer. För mer information, se omfångsbegränsade byggidentiteter och jobbauktoriseringsomfång.
  • Använd grenprinciper: Om du vill säkerställa säkra ändringar i kod och pipeline tillämpar du behörigheter och grenprinciper. Överväg också att lägga till pipelinebehörigheter och kontroller till lagringsplatser.
  • Lägg till extra säkerhet för förgreningar: När du arbetar med offentliga lagringsplatser från GitHub bör du noga överväga din metod för byggprocesser av förgreningar. Förgreningar utanför din organisation utgör särskilda risker.
    • Ange inte hemligheter för gaffelbyggen: Som standard är pipelines konfigurerade för att bygga gafflar, men hemligheter och skyddade resurser är inte automatiskt åtkomliga för jobben i dessa pipelines. Det är viktigt att inte inaktivera det här skyddet för att upprätthålla säkerheten.
    • Överväg att utlösa förgreningsversioner manuellt: Inaktivera automatiska förgreningsversioner och använd pull-begärandekommentorer för att manuellt skapa dessa bidrag. Den här inställningen ger dig möjlighet att granska koden innan du utlöser en version. För mer information, se Stänga av automatiska förgreningsversioner.
    • Ange inte hemligheter för förgreningsversioner: Som standard görs hemligheter som är associerade med din pipeline inte tillgängliga för validering av pull-begäranden för gafflar. Aktivera inte alternativet för att göra hemligheter tillgängliga för versioner av gafflar. Anvisningar om hur du hittar och verifierar den här inställningen finns i Bidrag från förgreningar.
    • Överväg att utlösa förgreningsversioner manuellt: Inaktivera automatiska förgreningsversioner och använd pull-begärandekommentorer för att manuellt skapa dessa bidrag. Den här inställningen ger dig möjlighet att granska koden innan du utlöser en version. Anvisningar om hur du gör detta finns i Inaktivera automatiska förgreningsversioner.
    • Använd Microsoft-värdbaserade agenter för bygge av förgreningar: Undvik att köra byggen från förgreningar på självhostade agenter. Det kan göra det möjligt för externa organisationer att köra extern kod på datorer i företagets nätverk. När det är möjligt använder du Microsoft-värdbaserade agenter.
    • Använd Azure Pipelines GitHub-appen för begränsning av tokenomfång: När du skapar en GitHub-förgrenad pull-begäran ser Azure Pipelines till att pipelinen inte kan ändra något GitHub-lagringsplatsinnehåll. Den här begränsningen gäller endast om du använder GitHub-appen Azure Pipelines för att integrera med GitHub.

Säkra tjänstanslutningar

  • Minimera omfattningen för tjänstanslutningar: Tjänstanslutningar bör endast ha åtkomst till nödvändiga resurser. När du skapar en ny Azure Resource Manager-tjänstanslutning väljer du alltid en specifik resursgrupp. Kontrollera att resursgruppen endast innehåller de virtuella datorer eller resurser som krävs för bygget. Anvisningar om hur du konfigurerar tjänstanslutningar finns i Använda en Azure Resource Manager-tjänstanslutning.
  • Använd arbetsbelastningsidentitetsfederation för autentisering: Använd arbetsbelastningsidentitetsfederation i stället för tjänstens huvudnamn för din Azure-tjänstanslutning när det är möjligt. Arbetsbelastningsidentitetsfederation använder Open ID Connect (OIDC), en branschstandardteknik, för att underlätta autentisering mellan Azure och Azure DevOps utan att förlita sig på hemligheter. Anvisningar om hur du gör detta finns i Skapa en tjänstanslutning med arbetsbelastningsidentitetsfederation (automatisk).
  • Minimera GitHub App-åtkomst: När du konfigurerar GitHub-appen till Azure DevOps beviljar du endast åtkomst till de lagringsplatser som du tänker skapa med hjälp av pipelines.
  • Begränsa tjänstanslutningar till specifika grenar: Använd en kontrollkontroll för grenen för att begränsa vilka grenar som kan använda tjänstanslutningen. Om du har en kontrollkontroll för grenen ser du till att tjänstanslutningar endast körs på auktoriserade grenar och att alla länkade pipelineresurser skapas från tillåtna grenar.

Använda YAML-pipelines i stället för klassiska pipelines

För ökad säkerhet och för att minska risken för oavsiktliga felkonfigurationer använder du YAML-pipelines i stället för klassiska pipelines. Den här försiktighetsåtgärden förhindrar ett säkerhetsproblem som uppstår vid YAML och klassiska pipelines som delar samma resurser, till exempel tjänstanslutningar. Om din organisation använder klassiska pipelines migrerar du pipelines till YAML.

  • YAML erbjuder fördelarna med infrastruktur som kod: Behandla YAML-pipelines som annan kod eftersom steg och beroenden definieras i kod. Det finns också tydlig insyn i pipelinekonfigurationer och en minskad risk för oavsiktliga felkonfigurationer.
  • YAML-pipelines kan kombineras med förbättrade säkerhetsåtgärder: Genom kodgranskningar och pull-begäranden använder du grenprinciper för att konfigurera en granskningsprocess för pull-begäranden för att förhindra felaktiga sammanslagningar.
  • Resursåtkomsthantering: Resursägare styr om en YAML-pipeline kan komma åt specifika resurser. Den här säkerhetsfunktionen förhindrar attacker som att stjäla en annan lagringsplats. Använd Godkännanden och kontroller för att ge åtkomstkontroll för varje pipelinekörning.
    • Skyddad grenkontroll: Om du har manuella kodgranskningsprocesser för specifika grenar kan du utöka det här skyddet till pipelines. En skyddad grenkontroll för en resurs förhindrar att pipelines körs automatiskt på obehöriga grenar.
    • Manuell godkännandekontroll: Använd en manuell godkännandekontroll för att blockera pipelinebegäranden från att använda en skyddad resurs tills den godkänns manuellt av angivna användare eller grupper.
    • Kontroll av kontorstid: Använd den här kontrollen för att säkerställa att en pipelinedistribution startar inom en angiven dag och ett angivet tidsfönster.
  • Inaktivera skapandet av klassiska pipelines: Inaktivera skapandet av klassiska byggpipelines och klassiska versionspipelines oberoende av varandra. När båda är inaktiverade kan ingen klassisk bygg-pipeline, klassisk versionspipeline, aktivitetsgrupper eller distributionsgrupper skapas via användargränssnittet eller REST-API:et. Mer information finns i Inaktivera skapande av klassiska pipelines.

Säkra agenter

För att skydda containrar markerar du volymer som skrivskyddade, anger resursgränser, använder betrodda avbildningar, söker efter säkerhetsrisker och tillämpar säkerhetsprinciper.

  • Använd Microsoft-hostade i stället för lokalt installerade agenter: Microsoft-hostade agenter erbjuder isolering och en ren virtuell dator för varje körning av en pipeline. Använd Microsoft-värdbaserade agenter i stället för lokalt installerade agenter. Mer information finns i Microsoft-värdbaserade agenter.
  • Separata agenter för varje projekt: För att minimera lateral förflyttning och förhindra korskontaminering mellan projekt, underhålla separata agentpooler, var och en dedikerad till ett visst projekt.
  • Använd lågprivilegierade konton för att köra agenter: Använd det lägsta privilegierade kontot för att köra lokalt installerade agenter för att förbättra systemsäkerheten. Överväg till exempel att använda ditt datorkonto eller en hanterad tjänstidentitet. Kör inte en agent under en identitet med direkt åtkomst till Azure DevOps-resurser.
  • Isolera produktionsartefakter och känsliga agentpooler: Använd olika agentpooler för att förhindra säkerhetsproblem.
    • Använd en separat agentpool för produktionsartefakter: Isolera produktionsartefakter med hjälp av en distinkt agentpool, vilket förhindrar oavsiktliga distributioner från icke-produktionsgrenar.
    • Segmentkänsliga pooler: Skapa separata pooler för känsliga och meningslösa arbetsbelastningar. Tillåt endast autentiseringsuppgifter i versionsdefinitioner som är associerade med lämplig pool.
  • Konfigurera restriktiva brandväggar för lokalt installerade agenter: Konfigurera brandväggar så att de är så restriktiva som möjligt samtidigt som agenter kan fungera, balansera säkerhet och användbarhet.
  • Uppdatera agentpooler med egen värd regelbundet: Håll dina lokalt installerade agenter uppdaterade med regelbundna uppdateringar för att säkerställa att sårbar kod inte körs, vilket minskar risken för utnyttjande.

Använda variabler och parametrar på ett säkert sätt

Använd variabler och parametrar på ett säkert sätt i dina pipelines genom att följa metodtipsen för att ange hemligheter. Metodtips är att begränsa hemlig användning, använda kötidsvariabler och aktivera validering av shell-uppgiftsargument för att skydda din pipeline mot hot och sårbarheter.

  • Begränsa åtkomsten till hemligheter: Ta bort hemligheter eller nycklar från att visas i pipelines. Flytta till hemliga autentiseringsmetoder som arbetsbelastningsidentitetsfederation eller ange hemligheter i användargränssnittet, en variabelgrupp eller en variabelgrupp som kommer från Azure Key Vault.
  • Aktivera validering av shell-parameter: När inställningen Aktivera parameterverifiering av shell-uppgifter har aktiverats, finns det en extra kontroll för tecken som semikolon, citattecken och parenteser. Aktivera Aktivera parameterverifiering av shell-uppgifter på organisations- eller projektnivå under Inställningar>Pipelines-inställningar>.
  • Begränsa variabler som kan ställas in vid kötid: Förhindra användare från att definiera nya variabler i kö genom att aktivera de inställningsgränsvariabler som kan anges vid kötid i Inställningar för organisationsinställningar>Pipelines>.
  • Använd parametrar i stället för variabler: Till skillnad från variabler kan en pipeline som körs inte ändra pipelineparametrar. Parametrar har datatyper som number och string, och de kan begränsas till specifika värdeunderuppsättningar. Den här begränsningen är värdefull när en användarkonfigurerbar aspekt av pipelinen endast ska acceptera värden från en fördefinierad lista, vilket säkerställer att pipelinen inte accepterar godtyckliga data.
  • Referenshemligheter från mallar: I stället för att inkludera infogade skript med hemliga parametrar direkt i din YAML-pipeline använder du mallar för att abstrahera känslig information från huvudpipelinen. Om du vill implementera den här metoden skapar du en separat YAML-fil för skriptet och lagrar sedan skriptet på en separat, säker lagringsplats. Du kan sedan referera till mallen och skicka en hemlig variabel i YAML som en parameter. Den säkra variabeln ska komma från Azure Key Vault, en variabelgrupp eller pipelinegränssnittet. Mer information finns i Använda mallar.
  • Begränsa hemligheter med grenprinciper och behörigheter för variabelgrupper: Du kan använda en kombination av behörigheter för variabelgrupper, infogning av villkorsjobb och grenprinciper för att se till att hemligheterna är knutna till grenen main . Mer information finns i Skydda hemligheter.
  • Använd setvariable för att begränsa inställningsvariabler: Använd settableVariables attributet för att konfigurera vilka variabler pipelineförfattare tillåts ange i en pipeline. Utan den här inställningen kan pipelineförfattare deklarera obegränsade nya variabler med loggningskommandot setvariable . När du anger en tom lista with settableVariablestillåts inte alla variabelinställningar. Mer information finns i attributetsettableVariables i YAML-schemat.

Den bästa metoden för att skydda en hemlighet är att inte ha en hemlighet i första hand. Undvik att använda hemligheter när det är möjligt, lagra dem aldrig i YAML-filer och se till att de inte loggas eller skrivs ut för att upprätthålla säkerheten.

  • Undvik att använda hemligheter när det är möjligt: Kontrollera om din pipeline kan använda en annan metod än att använda en hemlighet för att utföra en uppgift, till exempel en tjänstanslutning med arbetsbelastningsidentitetsfederation eller en hanterad identitet. Hanterade identiteter gör att dina program och tjänster kan autentisera med Azure utan att kräva explicita autentiseringsuppgifter. Mer information finns i Använda tjänstens huvudnamn och hanterade identiteter. Placera inte hemligheter i YAML: Lagra aldrig känsliga värden som klartext i en Azure Pipelines -.yml-fil .
  • Logga inte eller skriv inte ut hemligheter: Undvik att upprepa hemligheter till konsolen, använda dem i kommandoradsparametrar eller logga dem till filer. Azure Pipelines försöker rensa hemligheter från loggar där det är möjligt, men kan inte fånga alla sätt som hemligheter kan läcka.
  • Använd inte strukturerade data som JSON som hemligheter: Skapa enskilda hemligheter för varje känsligt värde. Den här metoden säkerställer bättre redigeringsnoggrannhet och minimerar risken för att exponera känsliga data oavsiktligt.

Granska och rotera hemligheter

För att skydda dina pipelines granskar du regelbundet hemlig hantering i uppgifter och loggar, granskar och tar bort onödiga hemligheter och roterar hemligheter för att minimera säkerhetsrisker.

  • Granska hemlig hantering i uppgifter och loggar: Kontrollerar uppgifter för att se till att hemligheter inte skickas till värdar eller skrivs ut till loggar. Kontrollera att det inte finns några hemligheter i några loggfiler, inklusive felloggarna.
  • Granska registrerade säkerhetsnycklar: Bekräfta att säkerhetsnycklar i din pipeline fortfarande är nödvändiga och ta bort alla som inte längre behövs för att minska överflöd och potentiella säkerhetsrisker.
  • Rotera hemligheter: Rotera hemligheter regelbundet för att minimera tidsperioden då en komprometterad hemlighet kan utnyttjas.

Förhindra körning av skadlig kod

Om du vill se till att endast testad och sanerad kod körs via din pipeline granskar du regelbundet dina pipelines för vanliga problem.

  • Kodgenomsökning: Undvik specialtecken i argument för att undvika shell-kommandoinmatning. Du kan använda GitHub Advanced Security för Azure DevOps för att automatisera kodgenomsökning.
  • Verifiera indata och användningsparametrar: Verifiera indataparametrar och argument för att förhindra oavsiktligt beteende. Använd parametriserade frågor i skript för att förhindra SQL-inmatning. Körningsparametrar hjälper till att undvika säkerhetsproblem som rör variabler, till exempel argumentinmatning.
  • Använd inte PATH i skript: Det är farligt att förlita sig på agentens PATH inställning eftersom den kan ändras av ett tidigare skript eller verktyg. Använd alltid en fullständigt kvalificerad sökväg i stället.
  • Kontrollera tillgängliga uppgifter: Inaktivera möjligheten att installera och köra uppgifter från Marketplace, vilket ger dig större kontroll över koden som körs i en pipeline.

Säkra containrar

Lär dig hur du skyddar containrar genom konfigurationsändringar, genomsökning och principer.

  • Markera volymer som skrivskyddade: Containrar innehåller systembaserade volymmonteringar för uppgifter, verktyg och externa komponenter som krävs för att arbeta med värdagent. Ange externals, tasksoch tools till skrivskyddad för extra säkerhet.
  • Ange containerspecifika resursgränser: Ange gränser för PROCESSOR och minne för att förhindra att containrar förbrukar för stora resurser, vilket kan leda till överbelastning eller säkerhetsrisker.
  • Använd betrodda avbildningar: Använd officiella och verifierade avbildningar från välrenommerade källor som Azure Container Registry eller Docker Hub. Ange alltid en specifik version eller tagg för att upprätthålla konsekvens och tillförlitlighet i stället för att förlita dig på taggen latest. Uppdatera regelbundet basavbildningarna så att de innehåller de senaste säkerhetskorrigeringarna och felkorrigeringarna.
  • Sök igenom containrar efter säkerhetsrisker och säkerställ skydd mot körningstidshot: Använd verktyg som Microsoft Defender för Molnet för att övervaka och upptäcka säkerhetsrisker. Dessutom erbjuder Azure Container Registry integrerad sårbarhetsgenomsökning för att säkerställa att containeravbildningar är säkra före distributionen. Du kan också integrera genomsökningsverktyg från tredje part via Azure DevOps-tillägg för extra säkerhetskontroller.
  • Implementera säkerhetsprinciper för att förhindra privilegiereskalering och se till att containrar körs med minsta möjliga behörighet: Till exempel Azure Kubernetes Service (AKS),rollbaserad åtkomstkontroll och Pod Security Admission kan du tillämpa principer som begränsar containerprivilegier, säkerställer icke-rotkörning och begränsar åtkomsten till kritiska resurser.
  • Använd nätverksprinciper: Nätverksprinciper kan användas för att begränsa kommunikationen mellan containrar, vilket säkerställer att endast auktoriserade containrar kan komma åt känsliga resurser i nätverket. Dessutom kan Azure Policy for AKS tillämpas för att tillämpa bästa praxis för containersäkerhet, till exempel att se till att endast betrodda containeravbildningar distribueras.

Använda mallar för att tillämpa metodtips

Börja med en minimal mall och framtvinga tillägg gradvis. Den här metoden säkerställer att när du implementerar säkerhetsrutiner har du en centraliserad startpunkt som omfattar alla pipelines.

  • Använd mallar som utökar: Mallarna som utökar definierar den yttre strukturen och erbjuder specifika punkter för riktade anpassningar. Utökningsmallar kan förhindra skadlig kod från att infiltrera en pipeline.
  • Begränsa åtkomsten med steg: Begränsa nätverksåtkomsten genom att låta steg som nedladdning av paket utföras på en container istället för på värden. När steg körs i en container förhindrar du att en felaktig aktör ändrar agentkonfigurationen eller lämnar skadlig kod för senare körning.