Biztonsági sablonok

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

Az Azure Pipelines-sablonok lehetővé teszik az újrafelhasználható tartalom, logika és paraméterek meghatározását a YAML-folyamatokban. Ez a cikk azt ismerteti, hogyan segíthetnek a sablonok a folyamatok biztonságának javításában:

  • A folyamat külső szerkezetének meghatározása a rosszindulatú kódok beszivárgásának megakadályozásához.
  • Automatikusan belefogadhatja az olyan feladatok elvégzésének lépéseit, mint a hitelesítő adatok vizsgálata.
  • Segítség a védett erőforrások ellenőrzésének kikényszerítéséhez, amely az Azure Pipelines alapvető biztonsági keretrendszerét képezi, és minden folyamatstruktúrára és összetevőre vonatkozik.

Ez a cikk egy sorozat része, amely segít az Azure Pipelines biztonsági intézkedéseinek megvalósításában. További információért tekintse meg Biztonságos Azure Pipelines.

Előfeltételek

Kategória Követelmények
Azure DevOps – Javaslatok megvalósítása az Azure DevOps biztonságossá tételében és az Azure Pipelines biztonságossá tételében.
- A YAML és az Azure Pipelines alapszintű ismerete. További információ: Az első pipeline létrehozása.
Engedélyek – Folyamatengedélyek módosítása: A Projektgazdák csoport tagja.
– A szervezeti engedélyek módosítása: A Projektcsoportgazdák csoport tagja.

Sablonokat tartalmaz és bővít

Az Azure Pipelines sablonokat tartalmaz és bővít .

  • A includes sablon a sablon kódját közvetlenül a sablonra hivatkozó külső fájlban tartalmazza, hasonlóan #include a C++-hoz. Az alábbi példafolyamat beszúrja a include-npm-steps.yml sablont a steps szakaszba.

      steps:
      - template: templates/include-npm-steps.yml 
    
  • A extends sablon meghatározza a folyamat külső szerkezetét, és konkrét pontokat kínál a célzott testreszabásokhoz. A C++ extends kontextusában a sablonok az örökléshez hasonlítanak.

Ha extends sablonokat használ, a sablonban és a végső folyamatban (pipeline) includes közös konfigurációs elemeket is használhat. További információ: YAML-sablonok használata folyamatokban újrafelhasználható és biztonságos folyamatokhoz.

Sablonok kiterjesztése

A legbiztonságosabb folyamatokhoz először sablonokat használjon extends . Ezek a sablonok határozzák meg a folyamat külső szerkezetét, és segítenek megakadályozni a rosszindulatú kódbeszivárgást.

Az alábbi példa egy template.yml nevű sablonfájlt mutat be.

parameters:
- name: usersteps
  type: stepList
  default: []
steps:
- ${{ each step in parameters.usersteps }}:
  - ${{ step }}

Az alábbi példafolyamat kibővíti a template.yml sablont.

# 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.

Sablonok beállításakor extends érdemes lehet egy adott Git-ághoz vagy címkéhez rögzíteni őket, hogy a kompatibilitástörő változások ne befolyásolják a meglévő folyamatokat. Az előző példa ezt a funkciót használja.

Folyamatbiztonsági funkciók

A YAML-folyamat szintaxisa számos beépített védelmet tartalmaz. Extends A sablonok kikényszeríthetik használatukat a folyamatbiztonság javítása érdekében. Az alábbi korlátozások bármelyikét implementálhatja.

Lépéscélok

A megadott lépéseket korlátozhatja úgy, hogy a tárolóban fusson, nem pedig a gazdagépen. A konténerekben található lépések nem férnek hozzá az ügynök gazdagépéhez, így nem tudják módosítani az ügynök konfigurációját, és nem hagyhatnak kártékony kódot későbbi végrehajtásra.

Például futtathatja a felhasználói lépéseket egy tárolóban, hogy megakadályozza hozzáférésüket a hálózathoz, így nem tudják jogosulatlan forrásokból lekérni a csomagokat, valamint kódot és titkos adatokat külső helyekre feltölteni.

Az alábbi példafolyamat futtat egy olyan lépést az ügynök gazda egyen, amely esetleg megváltoztathatja a gazda hálózatot, ezt követi egy lépés egy kontejnerben, amely korlátozott hálózati hozzáférést biztosít.

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

Típusbiztos paraméterek

A folyamat futtatása előtt a sablonok és paramétereik állandókká alakulnak. A sablonparaméterek javíthatják a bemeneti paraméterek típusbiztonságát.

Az alábbi példasablonban a paraméterek úgy korlátozzák a rendelkezésre álló folyamatkészlet-beállításokat, hogy a sztringek megadása helyett konkrét lehetőségeket sorolnak fel.

# 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

A sablon kiterjesztéséhez a folyamatnak meg kell adnia az elérhető készletlehetőségek egyikét.

# azure-pipelines.yml
extends:
  template: template.yml
  parameters:
    userpool: private-pool-1

Ügynöknaplózási parancsok korlátozásai

A felhasználói lépések a naplózási parancsok használatával kérnek szolgáltatásokat, amelyek speciálisan formázott, szabványos kimenetre nyomtatott sztringek. Korlátozhatja a naplózási parancsok által a felhasználói lépésekhez biztosított szolgáltatásokat. restricted módban a legtöbb ügynökszolgáltatás, mint például a fájlok feltöltése és a teszteredmények csatolása, nem érhető el a naplózási parancsokhoz való használatra.

A következő példában a target tulajdonság arra utasítja az ügynököt, hogy korlátozza a közzétételi összetevőket, így az összetevő-közzétételi feladat meghiúsul.

- task: PublishBuildArtifacts@1
  inputs:
    artifactName: myartifacts
  target:
    commands: restricted

Változók a naplózási parancsokban

A setvariable parancs a restricted módban továbbra is megengedett, így azok a feladatok, amelyek felhasználó által megadott adatokat adnak ki, mint például a REST API-val lekért nyitott problémák, sebezhetők lehetnek injektálási támadásokkal szemben. A rosszindulatú felhasználói tartalom beállíthat olyan változókat, amelyek későbbi feladatokhoz környezeti változóként exportálódnak, és kompromittálhatják az ügynök gazdagépét.

A kockázat csökkentése érdekében a naplózási paranccsal explicit módon deklarálhatja a setvariable beállítható változókat. Ha megad egy üres listát settableVariables, nem engedélyezett az összes változó beállítása.

Az alábbi példa a settableVariables-t a expectedVar-ra korlátozza, valamint minden ok előtaggal ellátott változót. A feladat meghiúsul, mert egy másik, úgynevezett BadVarváltozót próbál beállítani.

- task: PowerShell@2
  target:
    commands: restricted
    settableVariables:
    - expectedVar
    - ok*
  inputs:
    targetType: 'inline'
    script: |
      Write-Host "##vso[task.setvariable variable=BadVar]myValue"

Feltételes szakasz vagy feladat végrehajtása

A szakaszok és feladatok csak meghatározott feltételek mellett futtathatók. Az alábbi példa biztosítja, hogy a korlátozott kód csak az main ágra épüljön.

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

Szintaxis módosítása

Az Azure Pipelines-sablonok rugalmasságot biztosítanak a YAML-szintaxis iterálásához és módosításához. Az iteráció használatával bizonyos YAML-biztonsági funkciókat kényszeríthet ki.

A sablonok átírhatják a felhasználói lépéseket is, így csak a jóváhagyott feladatok futtathatók. A sablon például megakadályozhatja a beágyazott szkriptek végrehajtását.

Az alábbi példasablon megakadályozza a bash, powershell, pwsh és script típusú szkriptlépések futtatását. A szkriptek teljes zárolásához letilthatja a BatchScript és ShellScript is.

# 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 }}'

Az alábbi példafolyamatban, amely kiterjeszti az előző sablont, a szkript lépései le lesznek vetve, és nem futnak.

# 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

Sablon lépései

A sablon automatikusan folyamatlépéseket foglalhat magában, például hitelesítő adatok szkennelését vagy statikus kódellenőrzések elvégzését. Az alábbi sablon beszúrja a lépéseket a felhasználói lépések elé és után minden feladatba.

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()

Sablon kényszerítése

A sablonok biztonsági mechanizmusként való hatékonysága a kényszerítésen alapul. A sablonhasználat kikényszerítésének fő vezérlőpontjai a védett erőforrások.

Konfigurálhatja a jóváhagyásokat és az ellenőrzéseket az ügynökkészlet vagy más védett erőforrások, például az adattárak esetében. Példa: Adattárerőforrás-ellenőrzés hozzáadása.

Kötelező sablonok

Egy adott sablon használatának kényszerítéséhez konfigurálja a szükséges sablonellenőrzést egy erőforrás szolgáltatáskapcsolatán. Ez az ellenőrzés csak akkor érvényes, ha a folyamat egy sablonból terjed ki.

A folyamatfeladat megtekintésekor figyelheti az ellenőrzés állapotát. Ha a folyamat nem terjed ki a szükséges sablonból, az ellenőrzés sikertelen lesz.

A sikertelen jóváhagyási ellenőrzés képernyőképe.

Ha a szükséges sablont használja, az ellenőrzés sikeres lesz.

A jóváhagyott jóváhagyási ellenőrzés képernyőképe.

A következő params.yml sablonra például minden olyan folyamatban hivatkozni kell, amely kibővíti azt.

# 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 }}

Az alábbi példafolyamat kibővíti a params.yml sablont, és jóváhagyásra van szüksége. A folyamathibák bemutatásához megjegyzést fűzhet a extendsparams.yml hivatkozásához.

# azure-pipeline.yml

resources:
 containers:
     - container: my-container
       endpoint: my-service-connection
       image: mycontainerimages

extends:
    template: params.yml
    parameters:
        yesNo: true
        image: 'windows-latest'