Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
I Azure-pipelines kan du tillåta användare att anpassa pipelinekörning genom att samla in sina indata med variabler och parametrar. Att acceptera användarindata kan dock också medföra säkerhetsrisker om de inte hanteras korrekt. I den här artikeln får du lära dig hur du på ett säkert sätt använder variabler och parametrar i din pipeline.
Den här artikeln är en del av en serie som hjälper dig att implementera säkerhetsåtgärder för Azure-pipelines. Mer information finns i Skydda Azure-pipelines.
Förutsättningar
| Kategori | Krav |
|---|---|
| Azure DevOps | – Implementera rekommendationerna i Gör dina Azure DevOps säkra och Säkra Azure-pipelines. – 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. |
Variabler
Variabler är ett bekvämt sätt att samla in användarindata i förväg och underlätta dataöverföring mellan pipelinesteg. Variabler som definieras i YAML-uppgifter eller skript är dock läs- och skrivbara som standard. Värden som anges i uppströmssteg kan oväntat ändra underordnade värden.
Följande skriptfragment anropar till exempel en variabel med namnet MyConfig.
msbuild.exe myproj.proj -property:Configuration=$(MyConfig)
Om ett föregående steg anger MyConfig variabelvärdet till Debug & deltree /y c:tar körningen av det här skriptet bort innehållet i byggagenten och kan leda till oavsiktliga konsekvenser. Det här exemplet belyser den potentiella faran med sådana inställningar.
Systemvariabler som Build.SourcesDirectory och aktivitetsutdatavariabler är alltid skrivskyddade. Du kan också ange en variabel som skapats i ett skript eller en YAML-uppgift som skrivskyddad genom att skicka isReadonly=true flaggan i loggningskommandot.
I en YAML-variabeldefinition kan du ange en skrivskyddad variabel med hjälp av den specifika readonly nyckeln:
variables:
- name: myReadOnlyVar
value: myValue
readonly: true
Var särskilt försiktig med hemliga variabler. De rekommenderade metoderna för att ange hemliga variabler är att använda användargränssnittet, skapa en variabelgrupp eller använda en variabelgrupp som kommer från Azure Key Vault. Mer information finns i Ange hemliga variabler.
Kötidsvariabler
När du definierar en variabel i Azure-pipelines-användargränssnittet kan du välja om du vill tillåta att användare åsidosätter värdet under pipelinekörningen. Variabler som gör det möjligt för användare att ange sitt värde vid kötid kallas kötidsvariabler och kan endast definieras i användargränssnittet för Azure Pipelines-variabler .
I den klassiska pipelineredigeraren definierar du kötidsvariabeln genom att markera kryssrutan för Settable vid kötid. I YAML-pipelines anger du dem genom att välja Låt användare åsidosätta det här värdet när de kör den här pipelinen.
Anmärkning
I en versionspipeline väljer du Settable vid lanseringstillfället. Mer information finns i Hur kan jag redigera variabler vid lansering?
När en användare kör pipelinen manuellt kan de välja kötidsvariabler och ändra värdena.
Användare måste ha behörighet att redigera köversionskonfiguration på en pipeline för att kunna definiera variabler som anges vid kötiden.
Begränsa variabler som kan ställas in vid kötid
Användargränssnittet för Azure-pipelines och REST-API:et som kör en pipeline ger användarna olika sätt att lägga till nya variabler i kö. Den här funktionen gör att användare kan skapa variabler som författaren till pipelinen inte har definierat, åsidosätta systemvariabler och ange värden för befintliga variabler när de köar pipelinen.
För att undvika problem som orsakas av dessa funktioner kan du begränsa variabler som kan ställas in vid kötid. Du kan aktivera inställningen Gränsvariabler som kan ställas in vid kötid så att användarna bara kan ange variabler som uttryckligen är markerade som Settable vid kötid eller Låt användare åsidosätta det här värdet när de kör pipelinen vid kötid.
Den här inställningen kan användas på organisations- och projektnivå.
Projektsamlingsadministratörer kan tillämpa den här inställningen på organisationsnivå i Inställningar för organisationsinställningar>Pipelines>. När inställningen är Aktiverad kan endast variabler som uttryckligen markeras som Kan anges vid kötid anges vid kötid för alla pipelines i alla projekt i organisationen.
Projektadministratörer kan tillämpa den här inställningen på projektnivå i Projektinställningar>Pipeline>Inställningar. När inställningen är På kan endast variabler som uttryckligen markeras som Kan ställas in vid kötid anges vid kötid för alla pipelines i det här projektet. Om inställningen inte är aktiverad på organisationsnivå kan den aktiveras eller inaktiveras för enskilda projekt.
Om inställningen på organisationsnivå är aktiverad gäller den för alla projekt i organisationen och kan inte inaktiveras på projektnivå.
Följande exempel visar variablerna för en Classic-pipeline, där några av dem är markerade som kan anges vid köläggning. Variabeln BuildPlatform kan ställas in när kön startas, men det går inte med BuildConfiguration.
När du kör den här pipelinen är det bara variablerna som har markerats som kan anges vid kötid som är synliga på skärmen Variabler så att de kan väljas.
Om Gränsvariabler som kan anges vid kötiden är aktiverade på projekt- eller organisationsnivå visas inte knappen Lägg till variabel .
Om du använder API:erna Builds - Queue eller Runs - Run Pipeline för att köa en pipelinekörning och försöker ange värdet för en variabel som inte har markerats som Settable at queue time, visas ett felmeddelande som liknar följande:
{
"$id": "1",
"innerException": null,
"message": "You can't set the following variables (BuildConfiguration). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
"typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
"typeKey": "PipelineValidationException",
"errorCode": 0,
"eventId": 3000
}
Parametrar
En pipeline som körs kan inte ändra pipelineparametrar, till skillnad från variabler. Parametrar har datatyper som number och string, och 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.
Aktivera validering av shell-uppgiftsargument
Pipelines kan referera till uppgifter som körs i pipelinen. Vissa uppgifter innehåller en arguments parameter som gör att användarna kan ange fler alternativ för uppgiften.
Om du använder verifieringsinställningen Aktivera gränssnittsuppgifter valideras arguments parametrar för inbyggda gränssnittsuppgifter för att söka efter indata som kan mata in kommandon i skript. Kontrollen säkerställer att shellen korrekt tolkar och kör tecken som semikolon, citattecken och parenteser i följande pipelineuppgifter:
- PowerShell
- BatchScript (på engelska)
- Våldsamt slag
- SSH
- AzureFileCopy
- WindowsMachineFileCopy
- PowerShellOnTargetMachines
- SqlAzureDacpacDeployment
- SqlDacpacDeploymentOnMachineGroup
- AzureCLI
- AzurePowerShell
- ServiceFabricPowerShell
Du kan använda Aktivera validering av argument för shell-uppgifter på organisationsnivå under Organisationsinställningar>Pipelines>Inställningar eller på projektnivå under Projektinställningar>Pipelines>Inställningar. Om inställningen på organisationsnivå är aktiverad gäller den för alla projekt i organisationen och kan inte inaktiveras på projektnivå.
När den här inställningen är aktiverad utlöser alla valideringsproblem som rör en arguments parameter följande felmeddelande:
Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).
Lös problemet genom att justera argumentet genom att undvika specialtecken som anges i felmeddelandet.