Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
I modelli di Azure Pipelines consentono di definire contenuto riutilizzabile, logica e parametri nelle pipeline YAML. Questo articolo descrive in che modo i modelli consentono di migliorare la sicurezza della pipeline tramite:
- Definizione della struttura esterna di una pipeline per impedire l'infiltrazione di codice dannoso.
- Inclusi automaticamente i passaggi per eseguire attività come l'analisi delle credenziali.
- Aiutare a applicare controlli sulle risorse protette, che costituiscono il framework di sicurezza fondamentale per Azure Pipelines e si applicano a tutte le strutture e i componenti della pipeline.
Questo articolo fa parte di una serie che consente di implementare misure di sicurezza per Azure Pipelines. Per altre informazioni, vedere Proteggere Azure Pipelines.
Prerequisiti
| Categoria | Requisiti |
|---|---|
| Azure DevOps | - Implementare le raccomandazioni in Rendere Azure DevOps sicuro e Proteggere Azure Pipelines. - Conoscenza di base di YAML e Azure Pipelines. Per altre informazioni, vedere Creare la prima pipeline. |
| Autorizzazioni | - Per modificare le autorizzazioni delle pipeline: membro del gruppo Project Administrators. - Per modificare le autorizzazioni dell'organizzazione: essere membri del gruppo Amministratori della Raccolta Progetti. |
Include ed estende i modelli
Azure Pipelines fornisce modelli che includono e estendono.
Un
includesmodello include il codice del modello direttamente nel file esterno che fa riferimento al modello, simile a#includein C++. La pipeline di esempio seguente inserisce il modello include-npm-steps.yml nella sezionesteps.steps: - template: templates/include-npm-steps.ymlUn
extendsmodello definisce la struttura esterna della pipeline e offre punti specifici per le personalizzazioni mirate. Nel contesto di C++,extendsi modelli sono simili all'ereditarietà.
Quando si usano extends modelli, è anche possibile usare includes per eseguire parti di configurazione comuni sia nel modello che nella pipeline finale. Per altre informazioni, vedere Usare modelli YAML nelle pipeline per processi riutilizzabili e sicuri.
Estende i modelli
Per le pipeline più sicure, inizia utilizzando extends modelli. Questi modelli definiscono la struttura esterna della pipeline e consentono di evitare l'infiltrazione di codice dannoso.
Nell'esempio seguente viene illustrato un file modello denominato template.yml.
parameters:
- name: usersteps
type: stepList
default: []
steps:
- ${{ each step in parameters.usersteps }}:
- ${{ step }}
La pipeline di esempio seguente estende il modello di template.yml .
# 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
Suggerimento
Quando si configurano extends i modelli, è consigliabile ancorarli a un determinato ramo Git o a un tag, in modo che eventuali modifiche di rilievo non abbiano impatto sulle pipeline esistenti. Nell'esempio precedente viene usata questa funzionalità.
Funzionalità di sicurezza della pipeline
La sintassi della pipeline YAML include diverse protezioni predefinite.
Extends I modelli possono imporre il loro uso per migliorare la sicurezza della pipeline. È possibile implementare una delle restrizioni seguenti.
Destinazioni passaggio
È possibile limitare i passaggi specificati per l'esecuzione in un contenitore anziché nell'host. I passaggi nei contenitori non possono accedere all'host dell'agente, quindi non possono modificare la configurazione dell'agente o lasciare codice dannoso per un'esecuzione successiva.
Ad esempio, è possibile eseguire i passaggi utente in un contenitore per impedire loro di accedere alla rete, in modo che non possano recuperare pacchetti da origini non autorizzate o caricare codice e segreti in posizioni esterne.
La pipeline di esempio seguente esegue un passaggio sull'host agente che potrebbe potenzialmente modificare la rete host, seguita da un passaggio all'interno di un contenitore che limita l'accesso alla rete.
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
Parametri indipendenti dai tipi
Prima dell'esecuzione di una pipeline, i modelli e i relativi parametri si trasformano in costanti. I parametri template possono migliorare la sicurezza dei tipi per i parametri di input.
Nel modello di esempio seguente i parametri limitano le opzioni del pool di pipeline disponibili enumerando scelte specifiche anziché consentire qualsiasi stringa.
# 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
Per estendere il modello, la pipeline deve specificare una delle opzioni disponibili per il pool.
# azure-pipelines.yml
extends:
template: template.yml
parameters:
userpool: private-pool-1
Restrizioni dei comandi di registrazione agente
Gli utenti richiedono servizi usando i comandi di registrazione, che sono stringhe appositamente formattate stampate sull'output standard. È possibile limitare i servizi forniti dai comandi di registrazione per i passaggi utente. In modalità restricted, la maggior parte dei servizi dell'agente, come il caricamento degli artefatti e l'associazione dei risultati dei test, non è disponibile per i comandi di registrazione.
Nell'esempio seguente, la target proprietà indica all'agente di limitare la pubblicazione degli artefatti, in modo che l'operazione di pubblicazione degli artefatti non riesca.
- task: PublishBuildArtifacts@1
inputs:
artifactName: myartifacts
target:
commands: restricted
Variabili nei comandi di registrazione
Il comando setvariable rimane consentito in modalità restricted, quindi le attività che producono dati forniti dall'utente, come le questioni aperte recuperate tramite un'API REST, potrebbero essere vulnerabili ad attacchi di injection. Il contenuto utente malintenzionato potrebbe impostare variabili da esportare nelle attività successive come variabili di ambiente e potrebbe compromettere l'host dell'agente.
Per attenuare questo rischio, è possibile dichiarare in modo esplicito le variabili che sono impostabili usando il setvariable comando di registrazione. Se si specifica un elenco vuoto in settableVariables, l'impostazione di tutte le variabili non è consentita.
L'esempio seguente limita settableVariables a expectedVar e qualsiasi variabile preceduta da ok. L'attività ha esito negativo perché tenta di impostare una variabile diversa denominata BadVar.
- task: PowerShell@2
target:
commands: restricted
settableVariables:
- expectedVar
- ok*
inputs:
targetType: 'inline'
script: |
Write-Host "##vso[task.setvariable variable=BadVar]myValue"
Fase condizionale o esecuzione del processo
È possibile limitare le fasi e i processi per l'esecuzione solo in condizioni specifiche. L'esempio seguente garantisce che il codice con restrizioni venga compilato solo per il main ramo .
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
Modifica della sintassi
I modelli di Azure Pipelines hanno la flessibilità necessaria per scorrere e modificare la sintassi YAML. Usando l'iterazione, è possibile applicare funzionalità di sicurezza YAML specifiche.
Un modello può anche riscrivere i passaggi utente, consentendo l'esecuzione solo delle attività approvate. Ad esempio, il modello può impedire l'esecuzione di script inline.
Il seguente modello di esempio impedisce l'esecuzione dei tipi di passaggio di script bash, powershell, pwsh e script. Per il blocco completo degli script, è anche possibile bloccare BatchScript e 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 }}'
Nella pipeline di esempio seguente che estende il modello precedente, i passaggi dello script vengono rimossi e non vengono eseguiti.
# 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
Passaggi del modello
Un modello può includere automaticamente i passaggi in una pipeline, ad esempio per eseguire l'analisi delle credenziali o i controlli del codice statico. Il modello seguente inserisce i passaggi prima e dopo i passaggi dell'utente in ogni processo.
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()
Applicazione del modello
L'efficacia dei modelli come meccanismo di sicurezza si basa sull'applicazione. I punti di controllo chiave per l'applicazione dell'utilizzo del modello sono risorse protette.
Puoi configurare le approvazioni e i controlli per il tuo pool di agenti o altre risorse protette, come i repository. Per un esempio, vedere Aggiungere un controllo delle risorse del repository.
Modelli obbligatori
Per imporre l'uso di un modello specifico, configurare la verifica del modello richiesto sulla connessione al servizio di una risorsa. Questo controllo si applica solo quando la pipeline si estende da un modello.
Quando si visualizza il processo della pipeline, è possibile monitorare lo stato del controllo. Se la pipeline non si estende dal modello richiesto, il controllo ha esito negativo.
Quando si usa il modello richiesto, il controllo viene superato.
Ad esempio, è necessario fare riferimento al modello di params.yml seguente in qualsiasi pipeline che lo estende.
# 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 }}
La pipeline di esempio seguente estende il modello di params.yml e richiede l'approvazione. Per illustrare un errore della pipeline, impostare come commento il extends riferimento a params.yml.
# azure-pipeline.yml
resources:
containers:
- container: my-container
endpoint: my-service-connection
image: mycontainerimages
extends:
template: params.yml
parameters:
yesNo: true
image: 'windows-latest'