Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Mithilfe von Azure Pipelines-Vorlagen können Sie wiederverwendbare Inhalte, Logik und Parameter in YAML-Pipelines definieren. In diesem Artikel wird beschrieben, wie Vorlagen zur Verbesserung der Pipelinesicherheit beitragen können:
- Das Ziel ist, die äußere Struktur einer Pipeline zu definieren, um die Infiltration von schädlichem Code zu verhindern.
- Das automatische Einschließen von Schritten zur Ausführung von Aufgaben wie der Überprüfung von Zugangsdaten.
- Helfen Sie bei der Durchsetzung von Prüfungen geschützter Ressourcen, die das grundlegende Sicherheitsframework für Azure-Pipelines bilden und für alle Pipelinestrukturen und -komponenten gelten.
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 Ihrer ersten Pipeline. |
| Erlaubnisse | – So ändern Sie Pipelineberechtigungen: Mitglied der Gruppe "Projektadministratoren". – So ändern Sie Organisationsberechtigungen: Mitglied der Gruppe "Projektsammlungsadministratoren". |
Enthält und erweitert Vorlagen
Azure-Pipelines enthält underweitert Vorlagen.
Eine
includesVorlage enthält den Code der Vorlage direkt in der äußeren Datei, die auf die Vorlage verweist, ähnlich#includewie in C++. Die folgende Beispielpipeline fügt die include-npm-steps.yml Vorlage in denstepsAbschnitt ein.steps: - template: templates/include-npm-steps.ymlEine
extendsVorlage definiert die äußere Struktur der Pipeline und bietet spezifische Punkte für gezielte Anpassungen. Im Kontext von C++extendsähneln Vorlagen der Vererbung.
Wenn Sie extends Vorlagen verwenden, können Sie auch includes verwenden, um allgemeine Konfigurationselemente sowohl in der Vorlage als auch in der endgültigen Pipeline durchzuführen. Weitere Informationen finden Sie unter Verwenden von YAML-Vorlagen in Pipelines für wiederverwendbare und sichere Prozesse.
Erweitert Vorlagen
Für die sichersten Pipelines verwenden Sie zunächst extends Vorlagen. Diese Vorlagen definieren die äußere Struktur der Pipeline und tragen dazu bei, bösartigen Code infiltration zu verhindern.
Das folgende Beispiel zeigt eine Vorlagendatei mit dem Namen template.yml.
parameters:
- name: usersteps
type: stepList
default: []
steps:
- ${{ each step in parameters.usersteps }}:
- ${{ step }}
Die folgende Beispielpipeline erweitert die template.yml-Vorlage .
# azure-pipelines.yml
resources:
repositories:
- repository: templates
type: git
name: MyProject/MyTemplates
ref: refs/tags/v1
extends:
template: template.yml@templates
parameters:
usersteps:
- script: echo This is my first step
- script: echo This is my second step
Tipp
Wenn Sie extends Vorlagen einrichten, sollten Sie diese an einer bestimmten Git-Verzweigung oder einem bestimmten Tag verankern, damit Breaking Changes sich nicht auf vorhandene Pipelines auswirken. Im vorherigen Beispiel wird dieses Feature verwendet.
Pipelinesicherheitsfunktionen
Die YAML-Pipelinesyntax enthält mehrere integrierte Schutzmaßnahmen.
Extends Vorlagen können ihre Verwendung erzwingen, um die Pipelinesicherheit zu verbessern. Sie können eine der folgenden Einschränkungen implementieren.
Schrittziele
Sie können die ausführungsspezifischen Schritte in einem Container und nicht auf dem Host einschränken. Schritte in Containern können nicht auf den Agenthost zugreifen, sodass sie die Agentkonfiguration nicht ändern oder bösartigen Code für eine spätere Ausführung hinterlassen können.
Sie können beispielsweise Benutzerschritte in einem Container ausführen, um den Zugriff auf das Netzwerk zu verhindern, sodass sie keine Pakete von nicht autorisierten Quellen abrufen oder Code und geheime Schlüssel an externe Speicherorte hochladen können.
Die folgende Beispielpipeline führt einen Schritt auf dem Agenthost aus, der das Hostnetzwerk möglicherweise ändern könnte, gefolgt von einem Schritt in einem Container, der den Netzwerkzugriff beschränkt.
resources:
containers:
- container: builder
image: mysecurebuildcontainer:latest
steps:
- script: echo This step runs on the agent host
- script: echo This step runs inside the builder container
target: builder
Typsichere Parameter
Bevor eine Pipeline ausgeführt wird, werden Vorlagen und deren Parameter zu Konstanten umgewandelt. Vorlagenparameter können die Typsicherheit für Eingabeparameter verbessern.
In der folgenden Beispielvorlage beschränken die Parameter die verfügbaren Pipelinepooloptionen, indem bestimmte Auswahlmöglichkeiten aufgelistet werden, anstatt eine Zeichenfolge zuzulassen.
# template.yml
parameters:
- name: userpool
type: string
default: Azure Pipelines
values:
- Azure Pipelines
- private-pool-1
- private-pool-2
pool: ${{ parameters.userpool }}
steps:
- script: echo Hello world
Um die Vorlage zu erweitern, muss die Pipeline eine der verfügbaren Pooloptionen angeben.
# azure-pipelines.yml
extends:
template: template.yml
parameters:
userpool: private-pool-1
Einschränkungen für Agent-Protokollierungsbefehle
Benutzerschritte fordern Dienste mithilfe von Protokollierungsbefehlen an, die speziell formatierte Zeichenfolgen sind, die in die Standardausgabe gedruckt werden. Sie können die Dienste, die Protokollierungsbefehle bei Benutzerschritten bereitstellen, einschränken. Im restricted Modus sind die meisten Agentdienste wie das Hochladen von Artefakten und das Anfügen von Testergebnissen für Protokollierungsbefehle nicht verfügbar.
Im folgenden Beispiel weist die target Eigenschaft den Agent an, Veröffentlichungsartefakte einzuschränken, sodass die Artefaktveröffentlichungsaufgabe fehlschlägt.
- task: PublishBuildArtifacts@1
inputs:
artifactName: myartifacts
target:
commands: restricted
Variablen in Protokollierungsbefehlen
Der setvariable Befehl bleibt im restricted Modus zulässig, sodass Aufgaben, die vom Benutzer bereitgestellte Daten ausgeben, z. B. offene Probleme, die über eine REST-API abgerufen wurden, möglicherweise anfällig für Einfügungsangriffe sind. Bösartige Benutzerinhalte könnten Variablen festlegen, die in nachfolgende Aufgaben als Umgebungsvariablen exportiert werden und den Agenthost kompromittieren könnten.
Um dieses Risiko zu minimieren, können Sie die Variablen explizit deklarieren, die mithilfe des setvariable Protokollierungsbefehls festgelegt werden können. Wenn Sie eine leere Liste in settableVariablesangeben, ist alle Variableneinstellung unzulässig.
Im folgenden Beispiel wird settableVariables auf expectedVar beschränkt und jede mit ok präfixierte Variable. Der Vorgang schlägt fehl, weil versucht wird, eine andere Variable mit dem Namen BadVar festzulegen.
- task: PowerShell@2
target:
commands: restricted
settableVariables:
- expectedVar
- ok*
inputs:
targetType: 'inline'
script: |
Write-Host "##vso[task.setvariable variable=BadVar]myValue"
Ausführung einer bedingten Phase oder eines Auftrags
Sie können Stufen und Aufträge so einschränken, dass sie nur unter bestimmten Bedingungen ausgeführt werden. Im folgenden Beispiel wird sichergestellt, dass eingeschränkter Code nur für die main Verzweigung erstellt wird.
jobs:
- job: buildNormal
steps:
- script: echo Building the normal, unsensitive part
- ${{ if eq(variables['Build.SourceBranchName'], 'refs/heads/main') }}:
- job: buildMainOnly
steps:
- script: echo Building the restricted part that only builds for main branch
Syntaxänderung
Azure Pipelines-Vorlagen haben die Flexibilität, die YAML-Syntax zu durchlaufen und zu ändern. Mithilfe der Iteration können Sie bestimmte YAML-Sicherheitsfeatures erzwingen.
Eine Vorlage kann auch Benutzerschritte neu schreiben, sodass nur genehmigte Aufgaben ausgeführt werden können. Die Vorlage kann beispielsweise die Inlineskriptausführung verhindern.
Die folgende Beispielvorlage verhindert, dass die Skriptschritttypen bash, powershell, pwsh und script ausgeführt werden. Für die vollständige Sperrung von Skripts können Sie auch blockieren BatchScript und ShellScript.
# template.yml
parameters:
- name: usersteps
type: stepList
default: []
steps:
- ${{ each step in parameters.usersteps }}:
- ${{ if not(or(startsWith(step.task, 'Bash'),startsWith(step.task, 'CmdLine'),startsWith(step.task, 'PowerShell'))) }}:
- ${{ step }}
# The following lines replace tasks like Bash@3, CmdLine@2, PowerShell@2
- ${{ else }}:
- ${{ each pair in step }}:
${{ if eq(pair.key, 'inputs') }}:
inputs:
${{ each attribute in pair.value }}:
${{ if eq(attribute.key, 'script') }}:
script: echo "Script removed by template"
${{ else }}:
${{ attribute.key }}: ${{ attribute.value }}
${{ elseif ne(pair.key, 'displayName') }}:
${{ pair.key }}: ${{ pair.value }}
displayName: 'Disabled by template: ${{ step.displayName }}'
In der folgenden Beispielpipeline, die die vorherige Vorlage erweitert, werden die Skriptschritte entfernt und nicht ausgeführt.
# azure-pipelines.yml
extends:
template: template.yml
parameters:
usersteps:
- task: MyTask@1
- script: echo This step is stripped out and not run
- bash: echo This step is stripped out and not run
- powershell: echo "This step is stripped out and not run"
- pwsh: echo "This step is stripped out and not run"
- script: echo This step is stripped out and not run
- task: CmdLine@2
displayName: Test - stripped out
inputs:
script: echo This step is stripped out and not run
- task: MyOtherTask@2
Vorlagenschritte
Eine Vorlage kann automatisch Schritte in einer Pipeline enthalten, z. B. zum Überprüfen von Anmeldeinformationen oder statischen Codeüberprüfungen. Die folgende Vorlage fügt Die Schritte vor und nach den Schritten des Benutzers in jeden Auftrag ein.
parameters:
jobs: []
jobs:
- ${{ each job in parameters.jobs }}:
- ${{ each pair in job }}:
${{ if ne(pair.key, 'steps') }}:
${{ pair.key }}: ${{ pair.value }}
steps:
- task: CredScan@1
- ${{ job.steps }}
- task: PublishMyTelemetry@1
condition: always()
Erzwingung von Vorlagen
Die Effektivität von Vorlagen als Sicherheitsmechanismus basiert auf der Durchsetzung. Die wichtigsten Kontrollpunkte zum Erzwingen der Vorlagenverwendung sind geschützte Ressourcen.
Sie können Genehmigungen und Überprüfungen für Ihren Agentpool oder andere geschützte Ressourcen wie Repositorys konfigurieren. Ein Beispiel finden Sie unter Hinzufügen einer Repositoryressourcenüberprüfung.
Erforderliche Vorlagen
Um die Verwendung einer bestimmten Vorlage zu erzwingen, konfigurieren Sie die erforderliche Vorlagenüberprüfung für die Dienstverbindung für eine Ressource. Diese Überprüfung gilt nur, wenn sich die Pipeline von einer Vorlage erstreckt.
Wenn Sie den Pipelineauftrag anzeigen, können Sie den Status der Überprüfung überwachen. Wenn die Pipeline nicht über die erforderliche Vorlage erweitert wird, schlägt die Überprüfung fehl.
Wenn Sie die erforderliche Vorlage verwenden, wird die Überprüfung bestanden.
Auf die folgende params.yml Vorlage muss beispielsweise in jeder Pipeline verwiesen werden, die sie erweitert.
# params.yml
parameters:
- name: yesNo
type: boolean
default: false
- name: image
displayName: Pool Image
type: string
default: ubuntu-latest
values:
- windows-latest
- ubuntu-latest
- macOS-latest
steps:
- script: echo ${{ parameters.yesNo }}
- script: echo ${{ parameters.image }}
Die folgende Beispielpipeline erweitert die params.yml-Vorlage und erfordert eine Genehmigung. Um einen Pipelinefehler zu veranschaulichen, kommentieren Sie den extends Verweis auf params.yml aus.
# azure-pipeline.yml
resources:
containers:
- container: my-container
endpoint: my-service-connection
image: mycontainerimages
extends:
template: params.yml
parameters:
yesNo: true
image: 'windows-latest'