Megosztás a következőn keresztül:


Sablonok használata a biztonság érdekében

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

Ez a cikk azt ismerteti, hogyan egyszerűsíthetik a sablonok az Azure Pipelines biztonságát. A sablonok definiálhatják a folyamat külső szerkezetét, és megakadályozhatják a rosszindulatú kódbeszivárgást. A sablonok automatikusan tartalmazhatnak olyan feladatokat is, mint a hitelesítő adatok vizsgálata. Ha a csapaton vagy a szervezeten belül több folyamat is ugyanazt a struktúrát használja, fontolja meg a sablonok használatát.

A védett erőforrások ellenőrzése képezi az Azure Pipelines alapvető biztonsági keretrendszerét. Ezek az ellenőrzések a folyamatszerkezettől, a szakaszoktól és a feladatoktól függetlenül érvényesek. Sablonokkal kényszerítheti ki ezeket az ellenőrzéseket.

Sablonokat tartalmaz és bővít

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

  • A sablonok tartalmazzák a sablon kódját közvetlenül a külső fájlban, amely hivatkozik rá, hasonlóan a #include 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 
    
  • Kibővíti a sablonokat, amelyek meghatározzák a folyamat külső szerkezetét, és konkrét pontokat kínálnak a célzott testreszabásokhoz. A C++ extends kontextusában a sablonok az örökléshez hasonlítanak.

Ha sablonokat használ extends , a sablonban és az utolsó folyamatban is használhatja includes a gyakori konfigurációs darabokat. A teljes referenciát a sablon használati referenciája tartalmazza.

Sablonok kiterjesztése

A legbiztonságosabb folyamatokhoz először használja az Extends-sablonokat. Ezek a sablonok határozzák meg a folyamat külső szerkezetét, és megakadályozzák, hogy rosszindulatú kódok beszivárogjanak a folyamatba.

Az alábbi sablonfájl neve például template.yml.

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

Az alábbi folyamat 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.

Amikor sablonokat állít be extends , érdemes lehet egy adott Git-ághoz vagy címkéhez rögzíteni őket, hogy törések esetén a meglévő folyamatok ne legyenek hatással. Az előző példa ezt a funkciót használja.

YAML-folyamat biztonsági funkciói

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

Lépéscélok

A tárolóban való futtatás bizonyos lépéseit korlátozhatja, nem pedig a gazdagépen. A tárolók lépései nem férnek hozzá az ügynök gazdagépéhez, így megakadályozhatják, hogy ezek a lépések módosítsák az ügynök konfigurációját, vagy rosszindulatú kódot hagyjanak a későbbi végrehajtáshoz.

Fontolja meg például a hálózati hozzáférés korlátozását. Nyílt hálózati hozzáférés nélkül a felhasználói lépések nem tudják lekérni a csomagokat jogosulatlan forrásokból, és nem tölthetnek fel kódot és titkos kódokat külső hálózati helyekre.

Az alábbi példafolyamat az ügynök gazdagépén futtatja a lépéseket, mielőtt lépéseket futtat egy tárolón belül.

resources:
  containers:
  - container: builder
    image: mysecurebuildcontainer:latest
steps:
- script: echo This step runs on the agent host, and it could use Docker commands to tear down or limit the container's network
- script: echo This step runs inside the builder container
  target: builder

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

Az Azure Pipelines-ügynök által biztosított szolgáltatásokat a felhasználói lépésekre korlátozhatja. A felhasználói lépések naplózási parancsokkal kérik le a szolgáltatásokat, amelyek speciálisan szabványos kimenetre nyomtatott sztringek. Korlátozott módban az ügynök legtöbb szolgáltatása, például az összetevők feltöltése és a teszteredmények csatolása nem érhető el.

A következő példafeladat meghiúsul, mert a target tulajdonsága arra utasítja az ügynököt, hogy ne engedélyezze az összetevők közzétételét.

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

Módban restricted a setvariable parancs továbbra is megengedett marad, ezért körültekintően kell eljárni, mert a folyamatváltozók környezeti változóként lesznek exportálva a későbbi tevékenységekbe. Ha a feladatok felhasználó által megadott adatokat adnak ki, például a REST API-val lekért nyitott problémákat, akkor sebezhetők lehetnek az injektálási támadások ellen. A rosszindulatú felhasználói tartalom olyan környezeti változókat állíthat be, amelyeket kihasználva veszélyeztetheti az ügynök gazdagépét.

A kockázat csökkentése érdekében a folyamatkészítők explicit módon deklarálhatják, hogy mely változók állíthatók be a naplózási setvariable paranccsal. Üres lista megadásakor a rendszer minden változóbeállítást letilt.

A következő példafeladat meghiúsul, mert a tevékenység csak a változót vagy egy expectedVar előtaggal okrendelkező változót állíthat be.

- 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éldában a feltétel biztosítja, hogy a korlátozott kód csak a főá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. Megakadályozhatja például a beágyazott szkriptek végrehajtását.

Az alábbi példasablon megakadályozza a lépéstípusokatbash, pwshpowershellés script nem futtatható. Az alkalmi szkriptek teljes zárolásához letilthatja és ShellScriptletilthatja BatchScript a .

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

A sablont kiterjesztő következő folyamatban 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 will be stripped out and not run!
    - bash: echo This step will be stripped out and not run!
    - powershell: echo "This step will be stripped out and not run!"
    - pwsh: echo "This step will be stripped out and not run!"
    - script: echo This step will be stripped out and not run!
    - task: CmdLine@2
      displayName: Test - Will be stripped out
      inputs:
        script: echo This step will be stripped out and not run!
    - task: MyOtherTask@2

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.

A következő példasablonban a paraméterek úgy korlátozzák a rendelkezésre álló folyamatkészlet-beállításokat, hogy a szabadkérelmű sztringek helyett egy adott választási lehetőségek számbavételét biztosítják.

# template.yml
parameters:
- name: userpool
  type: string
  default: Azure Pipelines
  values:
  - Azure Pipelines
  - private-pool-1
  - private-pool-2

pool: ${{ parameters.userpool }}
steps:
- script: # ... removed for clarity

Ha a folyamat kibővíti a sablont, meg kell adnia az elérhető készletlehetőségek egyikét.

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

Sablon lépései

A sablonok automatikusan belefoglalhatják a folyamat lépéseit. Ezek a lépések olyan feladatokat hajthatnak végre, mint a hitelesítő adatok vizsgálata vagy a statikus kódellenőrzések. 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 értékes biztonsági mechanizmusnak számítanak, de hatékonyságuk 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 az ügynökkészlet vagy más védett erőforrások, például az adattárak jóváhagyását és ellenőrzését. 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 az erőforráshoz szükséges sablonellenőrzést . 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 futtatás leáll, és értesíti a sikertelen ellenőrzésről.

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.

Az alábbi params.yml sablonra 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 params.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'