Jak bezpečně používat proměnné a parametry v kanálu

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

Tento článek popisuje, jak bezpečně používat proměnné a parametry ke shromažďování vstupu od uživatelů kanálu. Další informace o používání proměnných a parametrů najdete tady:

U tajných proměnných buďte opatrní. Doporučené způsoby nastavení tajných proměnných jsou v uživatelském rozhraní, ve skupině proměnných a ve skupině proměnných ze služby Azure Key Vault. Další informace najdete v tématu nastavení tajných proměnných.

Proměnné

Proměnné můžou být pohodlným způsobem, jak předem shromažďovat informace od uživatele. Proměnné můžete použít také k předání dat z kroku do kroku v rámci kanálu.

Proměnné ale používejte s opatrností. Nově vytvořené proměnné, ať už jsou definované ve formátu YAML nebo napsané skriptem, jsou ve výchozím nastavení pro čtení i zápis. Podřízený krok může změnit hodnotu proměnné způsobem, který neočekáváte.

Váš skript například přečte:

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

Předchozí krok může být nastavený MyConfig na Debug & deltree /y c:hodnotu . I když by tento příklad odstranil pouze obsah agenta sestavení, můžete si představit, jak by toto nastavení mohlo být mnohem nebezpečnější.

Proměnné můžete nastavit jen pro čtení. Systémové proměnné jako Build.SourcesDirectory, výstupní proměnné úkolů a proměnné fronty jsou vždy jen pro čtení. Proměnné vytvořené v YAML nebo vytvořené v době běhu pomocí skriptu lze určit jako jen pro čtení. Když skript nebo úloha vytvoří novou proměnnou, může isReadonly=true předat příznak v příkazu protokolování, aby proměnná byla jen pro čtení.

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

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

Proměnné fronty a času

Při definování proměnné v editoru uživatelského rozhraní Pipelines můžete uživatelům umožnit, aby při spuštění kanálu přepsaly její hodnotu. Takovou proměnnou nazýváme proměnnou fronty a času. Proměnné fronty jsou vždy definovány v editoru uživatelského rozhraní Pipelines.

Snímek obrazovky s definováním proměnné fronty a času

Proměnné fronty jsou koncovému uživateli zpřístupněny při ručním spuštění kanálu a můžou změnit jejich hodnoty. Snímek obrazovky s aktualizací hodnoty proměnné fronty a času

Uživatelé potřebují oprávnění upravit konfiguraci sestavení fronty v kanálu k určení proměnných nastavených v době fronty.

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

Uživatelské rozhraní a rozhraní REST API používané ke spuštění kanálu poskytují uživatelům možnost definovat nové proměnné v době fronty.

Snímek obrazovky s přidáním proměnné fronty těsně před spuštěním kanálu

V počátcích služby Azure Pipelines měla tato funkce několik problémů:

  • Umožňuje uživatelům definovat nové proměnné, které nejsou explicitně definovány autorem kanálu v definici.
  • Umožňovala uživatelům přepsat systémové proměnné.

Abychom tyto problémy odstranili, definovali jsme nastavení pro omezení proměnných, které je možné nastavit v době ve frontě. Když je toto nastavení povolené, je možné nastavit pouze proměnné, které jsou explicitně označené jako „Nastavitelné v době zařazení do fronty“. Jinými slovy, pokud není toto nastavení povolené, můžete v době ve frontě nastavit libovolné proměnné.

Nastavení je navržené tak, aby fungovalo na úrovni organizace a na úrovni projektu.

  1. Úroveň organizace. Když je nastavení zapnuté, vynucuje to, aby pro všechny kanály ve všech projektech v organizaci byly nastaveny pouze proměnné, které jsou explicitně označené jako Settable at queue time (Nastavitelné v době fronty). Když je nastavení vypnuté, může každý projekt zvolit, jestli chcete omezit proměnné nastavené v době fronty, nebo ne. Nastavení je přepínač v části Nastavení organizace –> Kanály –> Nastavení. Povolit nebo zakázat ho můžou jenom Správa istrátory kolekce projektů. Snímek obrazovky s omezením proměnných, které je možné nastavit v době fronty na úrovni organizace
  2. Úroveň projektu. Když je nastavení zapnuté, vynucuje to, aby pro všechny kanály v projektu bylo možné nastavit pouze proměnné, které jsou explicitně označené jako Settable at queue time (Nastavitelné v době fronty). Pokud je nastavení zapnuté na úrovni organizace, je zapnuté pro všechny projekty a nejde ho vypnout. Nastavení je přepínač v části Project Nastavení –> Pipelines –> Nastavení. Povolit nebo zakázat ho můžou jenom Správa istrátory projectu. Snímek obrazovky s omezením proměnných, které je možné nastavit v době fronty na úrovni projektu

Podívejme se na příklad. Řekněme, že je nastavení zapnuté a váš kanál definuje proměnnou, my_variable která není v době fronty nastavená. Snímek obrazovky s definováním proměnné v klasickém kanálu

Dále předpokládejme, že chcete kanál spustit. Panel Proměnné nezobrazuje žádné proměnné a chybí tlačítko Přidat proměnnou .

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

Použití sestavení – Fronta a Spuštění – Volání rozhraní REST API spuštění kanálu pro frontu spuštění kanálu a nastavení hodnoty my_variable nebo nové proměnné selže s chybou podobnou následující.

{
  "$id": "1",
  "innerException": null,
  "message": "You can't set the following variables (my_variable). 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

Na rozdíl od proměnných nejde parametry kanálu během běhu kanálu změnit. Parametry mají datové typy, například number a stringa mohou být omezeny na podmnožinu hodnot. Omezení parametrů je užitečné, když uživatelsky konfigurovatelná část kanálu by měla mít hodnotu pouze z omezeného seznamu. Nastavení zajistí, že kanál nebude přijímat libovolná data.

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

Kanály můžou odkazovat na úlohy spuštěné v kanálu. Několik úloh zahrnutých v Azure DevOps má parametr argumentů, který umožňuje zadat více možností pro úlohu.

Pokud je povolené nastavení Povolit ověření argumentů úkolů prostředí, zkontroluje se parametr argumentů pro všechny znaky, které nemusí prostředí správně spustit. Mezi příklady znaků patří středníky, uvozovky a závorky.

Podobně jako u proměnných limitu, které je možné nastavit v možnosti fronty, může být na úrovni organizace na úrovni organizace nakonfigurované ověřování argumentů povolit úkoly prostředí na úrovni Nastavení> Pipelines> Nastavení nebo na úrovni projektu na Nastavení> Pipelines.>Nastavení.

Pokud je tato možnost povolená, zobrazí se zjištěný problém s ověřením, zaprotokoluje se chybová zpráva podobná následujícímu: 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 argumenty tak, že uvozíte speciální znaky, jak je uvedeno v chybové zprávě.

Pokud je povoleno ověření parametru argumentů Povolit úlohy prostředí, použije se ověření u parametru argumentů v následujících úkolech.

  • PowerShell
  • BatchScript
  • Bash
  • Ssh
  • AzureFileCopy
  • WindowsMachineFileCopy

Další kroky

Po zabezpečení vstupů je také potřeba zabezpečit sdílenou infrastrukturu.