Sdílet prostřednictvím


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

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

V Azure Pipelines můžete ke shromažďování vstupu od uživatelů použít proměnné a parametry. Tato funkce je užitečná, když chcete povolit uživatelům přizpůsobení provádění pipeline. 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é slouží jako praktická metoda shromažďování uživatelských vstupů předem a usnadnění přenosu dat mezi kroky v rámci potrubí. Při práci s proměnnými ale buďte opatrní. Nově vytvořené proměnné, ať už definované v JAZYCE YAML nebo skriptované, jsou ve výchozím nastavení pro čtení i zápis. Podřízené kroky mohou neočekávaně měnit hodnoty proměnných.

Představte si například následující fragment kódu skriptu:

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

Pokud se předchozí krok nastaví MyConfig na Debug & deltree /y c:, může to vést k nezamýšleným důsledkům. I když tento příklad pouze odstraní obsah agenta sestavení, zvýrazní potenciální nebezpečí těchto nastavení.

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 pouze 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í následujícího konkrétního klíče:

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

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

Proměnné čekací doby

Při definování proměnné v editoru uživatelského rozhraní Pipelines můžete uživatelům povolit přepsání její hodnoty během provádění kanálu. Tyto proměnné se označují jako proměnné doby čekání a jsou vždy definovány v editoru uživatelského rozhraní Pipelines.

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

Proměnné času spuštění jsou koncovému uživateli zpřístupněny při ručním spuštění potrubí a uživatelé mohou hodnoty proměnných změnit. Snímek obrazovky s aktualizací hodnoty proměnné fronty a času

Uživatelé potřebují oprávnění upravit konfiguraci sestavení fronty v rámci kanálu k určení proměnných nastavených v čase zařazení do 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 přidání proměnné času fronty těsně před spuštěním potrubí.

V prvních dnech služby Azure Pipelines měla tato funkce následující problémy:

  • Umožňuje uživatelům definovat nové proměnné, které ještě nedefinuje autor kanálu v definici.
  • Umožňovala uživatelům přepsat systémové proměnné.

Abychom tyto problémy vyřešili, definovali jsme nastavení pro omezení proměnných, které je možné nastavit v době fronty. Když je toto nastavení zapnuté, je možné nastavit pouze tyto proměnné, které jsou explicitně označené jako Settable at queue time (Nastavitelné v době fronty). Jinými slovy, můžete nastavit jakékoli proměnné v době fronty, pokud není toto nastavení zapnuté.

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

  • Úroveň organizace:
    • Když je nastavení zapnuté, vynucuje, že pro všechny kanály ve všech projektech v organizaci mohou být upraveny pouze proměnné explicitně označené jako "Nastavitelné v době fronty".
    • Správci kolekce projektů můžou toto nastavení povolit nebo zakázat.
    • Najdete toto nastavení v části Nastavení organizace>Kanály>Nastavení. Snímek obrazovky o omezování proměnných, které je možné nastavit na úrovni organizace během fronty.
  • Úroveň projektu:
    • Podobně jako na úrovni organizace je povolením tohoto nastavení zajištěno, že u všech potrubí v rámci konkrétního projektu je možné upravit pouze proměnné označené jako nastavit v době fronty.
    • Pokud je nastavení na úrovni organizace povolené, platí pro všechny projekty a nejde ho vypnout.
    • Správci projektů můžou toto nastavení povolit nebo zakázat.
    • Přejděte k tomuto nastavení v části Nastavení projektu>Kanály>Nastavení. Snímek obrazovky s omezením proměnných, které je možné nastavit v době fronty na úrovni projektu

Následující příklad ukazuje, že je nastavení zapnuté a váš kanál definuje proměnnou my_variable, kterou nelze nastavit po dobu fronty. Snímek obrazovky s definováním proměnné v klasické pipeline.

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í volání rozhraní REST API pro Builds - Fronta a Runs - Spuštění Pipeline k zařazení spuštění kanálu do fronty 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 nemůže spuštěný kanál upravovat parametry kanálu. 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í parametru argumentů úloh prostředí

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

Pokud je povolené nastavení Povolit ověřování parametrů argumentů úkolů shellu, projde parametr argumentů kontrolou, aby se zajistilo, že shell správně provádí znaky, jako jsou středníky, uvozovky a závorky. Podobně jako možnost proměnných limitů, které lze nastavit při sestavování fronty, můžete nakonfigurovat ověření parametrů povolení argumentů úkolů shellu na úrovni organizace nebo projektu v části Nastavení>Pipelines>Nastavení.

Pokud je tato funkce zapnutá, všechny problémy s ověřením související s parametrem arguments aktivují chybovou zprávu, například následující:

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

Chcete-li tento problém vyřešit, upravte argumenty tak, že uvozíte speciální znaky, jak je uvedeno v chybové zprávě. Toto ověření se vztahuje na arguments parametr v následujících konkrétních úlohách:

  • PowerShell
  • Dávkový skript
  • Udeřit
  • SSH
  • AzureFileCopy
  • WindowsMachineFileCopy