Freigeben über


Sichere Verwendung von Pipelinevariablen und -parametern

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

In Azure-Pipelines können Sie Es Benutzern ermöglichen, die Pipelineausführung anzupassen, indem Sie ihre Eingaben mit Variablen und Parametern erfassen. Das Akzeptieren von Benutzereingaben kann jedoch auch Sicherheitsrisiken darstellen, wenn sie nicht ordnungsgemäß behandelt werden. In diesem Artikel erfahren Sie, wie Sie Variablen und Parameter in Ihrer Pipeline sicher verwenden.

Dieser Artikel ist Teil einer Reihe, mit der Sie Sicherheitsmaßnahmen für Azure-Pipelines implementieren können. Weitere Informationen finden Sie unter Secure Azure Pipelines.

Voraussetzungen

Kategorie Anforderungen
Azure DevOps – Implementieren Sie die Empfehlungen in Make your Azure DevOps secure und Secure Azure Pipelines.
- Grundkenntnisse in YAML und Azure Pipelines. Weitere Informationen finden Sie unter Erstellen Sie Ihre erste Pipeline.
Berechtigungen – So ändern Sie Pipelineberechtigungen: Mitglied der Gruppe "Projektadministratoren".
- Ändern von Berechtigungen für Organisationen: Mitglied der Gruppe der Projekt-Sammlungsadministratoren.

Variablen

Variablen sind eine bequeme Möglichkeit, benutzereingaben im Voraus zu sammeln und die Datenübertragung zwischen Pipelineschritten zu erleichtern. Variablen, die in YAML-Aufgaben oder Skripten definiert sind, sind jedoch standardmäßig lese-schreibbar. Werte, die in vorgelagerten Schritten festgelegt werden, können nachgeschaltete Werte unerwartet ändern.

Der folgende Skriptausschnitt ruft z. B. eine Variable mit dem Namen MyConfig.

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

Wenn ein vorheriger Schritt den MyConfig Variablenwert Debug & deltree /y c:auf festgelegt hat, löscht das Ausführen dieses Skripts den Inhalt des Build-Agents und kann zu unbeabsichtigten Folgen führen. In diesem Beispiel wird die potenzielle Gefahr solcher Einstellungen hervorgehoben.

Systemvariablen wie Build.SourcesDirectory und Task-Ausgabevariablen sind immer schreibgeschützt. Sie können eine variable, die in einem Skript oder einer YAML-Aufgabe erstellt wurde, auch als schreibgeschützt festlegen, indem Sie das isReadonly=true Flag im Protokollierungsbefehl übergeben.

In einer YAML-Variablendefinition können Sie eine schreibgeschützte Variable mithilfe des spezifischen readonly Schlüssels angeben:

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

Verwenden Sie besondere Vorsicht bei geheimen Variablen. Die empfohlenen Methoden zum Festlegen geheimer Variablen umfassen die Verwendung der Benutzeroberfläche, das Erstellen einer Variablengruppe oder die Verwendung einer Variablengruppe, die aus Azure Key Vault stammt. Weitere Informationen finden Sie unter Festlegen geheimer Variablen.

Warteschlangenzeitvariablen

Wenn Sie eine Variable in der Azure Pipelines-Benutzeroberfläche definieren, können Sie auswählen, ob Benutzer den Wert während der Pipelineausführung außer Kraft setzen können. Variablen, mit denen Benutzer ihren Wert zur Warteschlangenzeit festlegen können, werden als Warteschlangenzeitvariablen bezeichnet und können nur in der Benutzeroberfläche von Azure Pipelines Variables definiert werden.

Im klassischen Pipeline-Editor definieren Sie die Variable für die Warteschlangenzeit, indem Sie das Kontrollkästchen für "Zur Warteschlangenzeit festlegen" aktivieren. In YAML-Pipelines legen Sie sie fest, indem Sie "Zulassen" auswählen, dass Benutzer diesen Wert beim Ausführen dieser Pipeline außer Kraft setzen.

Hinweis

Wählen Sie in einer Releasepipeline die Option Zum Zeitpunkt der Freigabe festlegbar aus. Weitere Informationen finden Sie unter Wie kann ich Variablen zur Veröffentlichungszeit bearbeiten?

Screenshot: Definieren einer Warteschlangenzeitvariable.

Wenn ein Benutzer die Pipeline manuell ausführt, kann er Variablen für die Warteschlangenzeit auswählen und die Werte ändern.

Screenshot: Aktualisieren des Werts einer Warteschlangenzeitvariable.

Benutzer müssen über die Berechtigung "Warteschlangenbuildkonfiguration bearbeiten" für eine Pipeline verfügen, um zur Warteschlangenzeit festgelegte Variablen zu definieren.

Einschränken von Variablen, die während der Warteschlangenzeit festgelegt werden können

Die Benutzeroberfläche von Azure Pipelines und die REST-API, die eine Pipeline ausführt, bieten Benutzern Möglichkeiten, neue Variablen zur Warteschlangenzeit hinzuzufügen. Mit dieser Möglichkeit können Benutzer Variablen erstellen, die der Pipelineautor nicht definiert hat, Systemvariablen außer Kraft setzen und Werte für vorhandene Variablen zur Warteschlangenzeit festlegen.

Screenshot: Hinzufügen einer Variable für die Warteschlangenzeit direkt vor dem Ausführen der Pipeline.

Um Probleme zu vermeiden, die durch diese Fähigkeiten verursacht werden, können Sie Variablen einschränken, die zur Warteschlangenzeit festgelegt werden können. Sie können die Einstellung Variablen einschränken, die zur Warteschlangenzeit festgelegt werden können aktivieren, sodass Benutzer nur Variablen festlegen können, die explizit zur Warteschlangenzeit als "festlegbar" gekennzeichnet sind, oder Benutzer können diesen Wert außer Kraft setzen, wenn diese Pipeline zur Warteschlangenzeit ausgeführt wird.

Diese Einstellung kann auf Organisations- und Projektebene angewendet werden.

Screenshot der Option, Variablen zu begrenzen, die zur Warteschlangenzeit auf Organisationsebene festgelegt werden können.

Projektsammlungsadministratoren können diese Einstellung auf Organisationsebene in den Organisationseinstellungen>Pipelines>Einstellungen anwenden. Wenn die Einstellung aktiviert ist, können nur Variablen, die explizit als Settable at queue time gekennzeichnet sind, während der Warteschlangenzeit für alle Pipelines in allen Projekten in der Organisation festgelegt werden.

Screenshot der aktivierten Option zur Einschränkung der Variablen, die zur Warteschlangenzeit auf Organisationsebene festgelegt werden können.

Project-Administratoren können diese Einstellung auf Projektebene in den Einstellungen von Project-Einstellungen>für Pipelines>anwenden. Wenn die Einstellung aktiviert ist, können nur Variablen, die explizit als "Settable at queue time " gekennzeichnet sind, für alle Pipelines in diesem Projekt zur Warteschlangenzeit festgelegt werden. Wenn die Einstellung nicht auf Organisationsebene aktiviert ist, kann sie für einzelne Projekte aktiviert oder deaktiviert werden.

Wenn die Einstellung auf Organisationsebene aktiviert ist, gilt sie für alle Projekte in der Organisation und kann nicht auf Projektebene deaktiviert werden.

Screenshot der Option, die Variablen begrenzt, die zur Warteschlangenzeit festgelegt werden können, und auf Projektebene nicht verfügbar ist.

Das folgende Beispiel zeigt die Variablen für eine klassische Pipeline, wobei einige von ihnen als "zur Warteschlangenzeit gesetzt werden können" gekennzeichnet sind. Die BuildPlatform Variable kann zur Warteschlangenzeit festgelegt werden, dies ist jedoch BuildConfiguration nicht möglich.

Screenshot der Definition einer Variablen in einer klassischen Pipeline.

Wenn Sie diese Pipeline ausführen, sind nur die Variablen, die zur Warteschlangenzeit festlegbar sind, auf dem Bildschirm Variablen sichtbar, um ausgewählt zu werden.

Screenshot: Variablenbereich mit aktivierter Einstellung.

Wenn Limit-Variablen, die zur Warteschlangenzeit festgelegt werden können , auf Projekt- oder Organisationsebene aktiviert sind, wird die Schaltfläche " Variable hinzufügen " nicht angezeigt.

Screenshot davon, dass bei eingeschalteter Einstellung Variablen zur Laufzeit nicht hinzugefügt werden können.

Verwenden der Builds – Warteschlange oder Läufe – Pipeline ausführen APIs, um einen Pipelineablauf in die Warteschlange zu stellen, und der Versuch, den Wert einer Variablen festzulegen, die nicht als zur Warteschlangenzeit setzbar gekennzeichnet ist, schlägt mit einem Fehler wie dem folgenden fehl:

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

Parameter

Eine ausgeführte Pipeline kann im Gegensatz zu Variablen keine Pipelineparameter ändern. Parameter haben Datentypen wie number und string und können auf spezifische Wertemengen beschränkt werden. Diese Einschränkung ist nützlich, wenn ein vom Benutzer konfigurierbarer Aspekt der Pipeline nur Werte aus einer vordefinierten Liste akzeptieren sollte, um sicherzustellen, dass die Pipeline keine beliebigen Daten akzeptiert.

Aktivierung der Validierung von Shell-Aufgabenargumenten

Pipelines können auf Aufgaben verweisen, die innerhalb der Pipeline ausgeführt werden. Einige Aufgaben enthalten einen arguments Parameter, mit dem Benutzer weitere Optionen für die Aufgabe angeben können.

Durch Anwenden der Überprüfungseinstellung "Shellaufgaben aktivieren" werden argument Parameter für integrierte Shellaufgaben überprüft, um nach Eingaben zu suchen, die Befehle in Skripts einfügen können. Die Überprüfung stellt sicher, dass die Shell Zeichen wie Semikolons, Anführungszeichen und Klammern in den folgenden Pipelineaufgaben korrekt ausführt.

  • PowerShell
  • BatchScript (BatchScript)
  • Schlagen
  • SSH
  • AzureFileCopy (Azure-Dateikopie)
  • WindowsMachineFileKopieren

Sie können die Überprüfung von Shellaufgabenargumenten auf Organisationsebene unter Organisationseinstellungen>Pipelines>Einstellungen oder auf Projektebene unter Projekteinstellungen>Pipelines>Einstellungen anwenden. Wenn die Einstellung auf Organisationsebene aktiviert ist, gilt sie für alle Projekte in der Organisation und kann nicht auf Projektebene deaktiviert werden.

Wenn diese Einstellung aktiviert ist, löst jedes Überprüfungsproblem im Zusammenhang mit einem arguments Parameter die folgende Fehlermeldung aus:

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

Um das Problem zu beheben, passen Sie das Argument an, indem Sie Sonderzeichen wie in der Fehlermeldung angegeben entfernen.