Bezpečné použití proměnných a parametrů pipeline

služby Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

V Azure Pipelines můžete uživatelům povolit přizpůsobení provádění kanálu tím, že shromažďují vstup s proměnnými a parametry. Přijetí uživatelského vstupu ale může také zavést bezpečnostní rizika, pokud se nezpracovává správně. V tomto článku se dozvíte, jak bezpečně používat proměnné a parametry ve vašem kanálu.

Tento článek je součástí série, která vám pomůže implementovat bezpečnostní opatření pro Azure Pipelines. Další informace najdete v tématu Zabezpečení služby Azure Pipelines.

Požadavky

Kategorie Požadavky
Azure DevOps – Implementujte doporučení v Make your Azure DevOps secure a Secure Azure Pipelines.
– Základní znalost YAML a Azure Pipelines. Další informace naleznete v Vytvoření vašeho prvního potrubí.
Oprávnění - Chcete-li upravit oprávnění kanálů: Člen skupiny Správci projektu.
- Úprava oprávnění organizace: Člen skupiny Správci kolekce projektů.

Proměnné

Proměnné představují pohodlný způsob, jak předem shromáždit uživatelský vstup a usnadnit přenos dat mezi kroky kanálu. Proměnné definované v úlohách nebo skriptech YAML jsou ve výchozím nastavení určeny k čtení i zápisu. Hodnoty nastavené v upstreamových krocích můžou neočekávaně upravovat podřízené hodnoty.

Například následující fragment kódu skriptu volá proměnnou s názvem MyConfig.

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

Pokud předchozí krok nastaví MyConfig hodnotu proměnné na Debug & deltree /y c:, spuštění tohoto skriptu odstraní obsah agenta sestavení a může vést k nezamýšleným důsledkům. Tento příklad zvýrazňuje potenciální nebezpečí těchto nastavení.

Systémové proměnné jako Build.SourcesDirectory a výstupní proměnné úkolů jsou vždy jen pro čtení. Proměnnou vytvořenou ve skriptu nebo úkolu YAML můžete také určit jako jen pro čtení předáním příznaku isReadonly=true v příkazu protokolování.

V definici proměnné YAML můžete zadat proměnnou jen pro čtení pomocí konkrétního readonly klíče:

variables:
- name: myReadOnlyVar
  value: myValue
  readonly: true

U tajných proměnných buďte opatrní. Mezi doporučené metody nastavení proměnných tajných kódů patří použití uživatelského rozhraní, vytvoření skupiny proměnných nebo použití skupiny proměnných ze služby Azure Key Vault. Další informace naleznete v tématu Nastavení tajných proměnných.

Proměnné čekací doby

Když definujete proměnnou v uživatelském rozhraní Azure Pipelines, můžete vybrat, jestli chcete uživatelům povolit přepsání hodnoty během spuštění kanálu. Proměnné, které uživatelům umožňují nastavit hodnotu během zařazení do fronty, se nazývají proměnné pro čas fronty a dají se definovat pouze v uživatelském rozhraní proměnných Azure Pipelines.

V klasickém editoru kanálů definujete proměnnou v čase fronty tak, že zaškrtnete políčko Nastavitelné během fronty. V YAML potrubích je označíte výběrem Umožnit uživatelům přepsat tuto hodnotu při spuštění tohoto potrubí.

Poznámka:

V kanálu verze vyberte Nastavitelné v době vydání. Další informace najdete v tématu Jak můžu upravovat proměnné v době vydání?

Snímek obrazovky s definováním proměnné frontového času.

Když uživatel spustí pipeline ručně, může vybrat proměnné nastavené v době spuštění fronty a změnit jejich hodnoty.

Snímek obrazovky s aktualizací hodnoty proměnné fronty a času

Uživatelé musí mít oprávnění upravit konfiguraci sestavení fronty v pipeline, aby mohli definovat proměnné nastavené při zařazení do fronty.

Omezení proměnných, které je možné nastavit v době fronty

Uživatelské rozhraní Azure Pipelines a rozhraní REST API, které spouští pipeline, poskytují uživatelům způsoby přidání nových proměnných při zařazení do fronty. Tato možnost umožňuje uživatelům vytvářet proměnné, které autor kanálu nedefinoval, překonfigurovat systémové proměnné a nastavit hodnoty existujících proměnných v době zařazení do fronty.

Snímek obrazovky přidání proměnné času fronty těsně před spuštěním potrubí.

Abyste se vyhnuli problémům způsobeným těmito schopnostmi, můžete omezit proměnné, které je možné nastavit v době fronty. Můžete povolit nastavení omezení proměnných, které lze nastavit během doby fronty, aby uživatelé mohli nastavit pouze proměnné, které jsou explicitně označené jako nastavitelné během doby fronty nebo umožnit uživatelům přepsat tuto hodnotu při spuštění tohoto potrubí během doby fronty.

Toto nastavení lze použít na úrovni organizace a projektu.

Snímek obrazovky s možnostmi omezujícími proměnné, které je možné nastavit v době fronty na úrovni organizace

Správci kolekcí projektů můžou toto nastavení použít na úrovni organizace v Nastavení organizace>Kanály>Nastavení. Pokud je nastavení zapnuté, mohou být během fronty nastaveny pouze proměnné, které jsou explicitně označené jako nastavitelné během fronty, a to pro všechny pipeline ve všech projektech v organizaci.

Snímek obrazovky s povolenou možností omezující proměnné, které je možné nastavit v době fronty na úrovni organizace

Správci projektu můžou toto nastavení použít na úrovni projektu v Nastavení projektů>Pipelines>Nastavení. Pokud je nastavení zapnuto, mohou být pro všechny procesy v tomto projektu nastaveny pouze proměnné, které jsou explicitně označené jako nastavitelné v době fronty. Pokud nastavení není na úrovni organizace povolené, můžete ho povolit nebo zakázat pro jednotlivé projekty.

Pokud je nastavení na úrovni organizace povolené, platí pro všechny projekty v organizaci a nejde ho vypnout na úrovni projektu.

Snímek obrazovky s možnostmi omezujícími proměnné, které je možné nastavit v době fronty, není k dispozici na úrovni projektu

Následující příklad ukazuje proměnné pro Classic pipeline, přičemž některé z nich jsou označeny jako nastavitelné při zařazení do fronty. Proměnnou BuildPlatform lze nastavit během zařazení do fronty, ale BuildConfiguration nelze.

Snímek obrazovky s definicí proměnné v klasickém potrubí

Při spuštění tohoto kanálu jsou na obrazovce Proměnné viditelné k výběru pouze proměnné označené jako nastavitelné v čase fronty.

Snímek obrazovky s panelem proměnných s nastavením

Pokud jsou na úrovni projektu nebo organizace povoleny omezení proměnných, které je možné nastavit v době fronty , tlačítko Přidat proměnnou se nezobrazí.

Snímek obrazovky znázorňující nemožnost přidat proměnné za běhu s nastaveným zapnutím.

Použití rozhraní API pro Buildy – Fronta nebo Spuštění – Spustit kanál k zařazení spuštění kanálu do fronty a pokus o nastavení hodnoty proměnné, která není označena jako konfigurovatelná v době fronty, selže s chybou podobnou následující:

{
  "$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
}

Parametry

Běžící kanál nemůže změnit parametry kanálu, na rozdíl od proměnných. Parametry mají datové typy, například number a stringa mohou být omezeny na konkrétní podmnožinu hodnot. Toto omezení je užitečné, když by uživatel konfigurovatelný aspekt kanálu měl přijímat pouze hodnoty z předdefinovaného seznamu a zajistit, aby kanál nepřijme libovolná data.

Povolení ověření argumentů úloh prostředí

Potrubí mohou odkazovat na úlohy prováděné v rámci pipeline. Některé úkoly zahrnují arguments parametr, který uživatelům umožňuje zadat další možnosti úkolu.

Použití nastavení povolit ověření argumentů úloh prostředí ověřuje arguments parametry pro předdefinované úlohy prostředí a kontroluje vstupy, které můžou vkládat příkazy do skriptů. Kontrola zajistí, že shell správně vykonává znaky, jako jsou středníky, uvozovky a závorky, v následujících úkolách pipeline:

  • PowerShell
  • Dávkový skript
  • Bash
  • SSH
  • AzureFileCopy
  • WindowsMachineFileCopy
  • PowerShellOnTargetMachines
  • SqlAzureDacpacDeployment
  • SqlDacpacDeploymentOnMachineGroup
  • AzureCLI
  • AzurePowerShell
  • ServiceFabricPowerShell

Můžete použít povolit ověřování argumentů shell úkolů na úrovni organizace v části Nastavení organizace>Kanály>Nastavení nebo na úrovni projektu v části Nastavení projektu>Kanály>Nastavení. Pokud je nastavení na úrovni organizace povolené, platí pro všechny projekty v organizaci a nejde ho vypnout na úrovni projektu.

Pokud je toto nastavení povolené, všechny problémy s ověřením související s parametrem arguments aktivují následující chybovou zprávu:

Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

Pokud chcete tento problém vyřešit, upravte argument tak, že uvozíte speciální znaky, jak je uvedeno v chybové zprávě.