Biztonság sablonokon keresztül

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

A védett erőforrások ellenőrzése az Azure Pipelines alapvető biztonsági építőeleme. Az ellenőrzések a folyamat szerkezetétől – szakaszaitól és feladataitól függetlenül – működnek. Ha a csapatban vagy a szervezetben több folyamat is ugyanazzal a struktúrával rendelkezik, a sablonok használatával tovább egyszerűsítheti a biztonságot.

Az Azure Pipelines kétféle sablont kínál: tartalmazza és bővíti. A belefoglalt sablonok ugyanúgy viselkednek, mint #include a C++-ban: mintha közvetlenül a külső fájlba illessze be a sablon kódját, amely hivatkozik rá. Itt például egy sablon (include-npm-steps.yml) van beszúrva a fájlba steps.

  steps:
  - template: templates/include-npm-steps.yml 

A C++ metafora extends folytatásához a sablonok inkább az öröklődéshez hasonlóak: a sablon biztosítja a folyamat külső szerkezetét, és olyan helyeket, ahol a sablonfelhasználó célzott módosításokat végezhet.

Bővítősablonok használata

A legbiztonságosabb folyamatokhoz javasoljuk, hogy a sablonokkal kezdjen extends . A külső struktúra biztosításával egy sablon megakadályozhatja, hogy a rosszindulatú kód bekerüljön a folyamatba. Továbbra is használhatja includesa sablonban és az utolsó folyamatban is a gyakori konfigurációk figyelembe vételéhez. A bővítménysablon használatához a folyamat az alábbi példához hasonlóan nézhet ki.

# template.yml
parameters:
- name: usersteps
  type: stepList
  default: []
steps:
- ${{ each step in parameters.usersteps }}:
  - ${{ step }}
# 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

A sablonok beállításakor extends érdemes lehet egy adott Git-ághoz vagy címkéhez rögzíteni őket. Így, ha törési módosításokat kell végrehajtani, a meglévő folyamatok nem lesznek hatással. A fenti példák ezt a funkciót használják.

A YAML-ben kikényszerített biztonsági funkciók

A YAML-szintaxisba számos védelem van beépítve, és egy kiterjesztett sablon bármelyik vagy az összes használatát kikényszerítheti.

Lépéscélok

A tárolóban való futtatás néhány lépésének korlátozása a gazdagép helyett. Az ügynök gazdagépéhez való hozzáférés nélkül a felhasználói lépések nem módosíthatják az ügynök konfigurációját, és nem hagyhatnak kártékony kódot későbbi végrehajtás céljából. Először futtassa a kódot a gazdagépen a tároló biztonságosabbá tételéhez. Javasoljuk például, hogy korlátozza a hálózathoz való hozzáférést. A hálózathoz való nyílt hozzáférés nélkül a felhasználói lépések nem fognak tudni hozzáférni a jogosulatlan forrásokból származó csomagokhoz, vagy nem tölthetnek fel kódot és titkos kódokat egy hálózati helyre.

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

Korlátozza, hogy az Azure Pipelines-ügynök milyen szolgáltatásokat nyújt a felhasználói lépésekhez. A lépések "naplózási parancsokat" (speciálisan stdoutra nyomtatott sztringeket) használva kérik le a szolgáltatásokat. 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.

# this task will fail because its `target` property instructs the agent not to allow publishing artifacts
- task: PublishBuildArtifacts@1
  inputs:
    artifactName: myartifacts
  target:
    commands: restricted

A korlátozott módban továbbra is engedélyezett parancsok egyike a setvariable parancs. Mivel a folyamatváltozókat környezeti változókként exportálják a későbbi feladatokba, a felhasználó által megadott adatokat (például a REST API-ból lekért nyitott problémák tartalmát) ki lehet téve az injektálási támadásoknak. Az ilyen felhasználói tartalmak környezeti változókat állíthatnak be, amelyek felhasználhatók az ügynök gazdagépének kihasználására. Ennek letiltásához 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. Az üres lista megadása nem engedélyezi az összes változó beállítását.

# this task will fail because the task is only allowed to set the 'expectedVar' variable, or a variable prefixed with "ok"
- task: PowerShell@2
  target:
    commands: restricted
    settableVariables:
    - expectedVar
    - ok*
  inputs:
    targetType: 'inline'
    script: |
      Write-Host "##vso[task.setvariable variable=BadVar]myValue"

Szakaszok vagy feladatok feltételes beszúrása

A szakaszok és feladatok meghatározott feltételek mellett történő futtatásának korlátozása. A feltételek segíthetnek például annak biztosításában, hogy csak bizonyos ágakat építsen.

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

Bizonyos szintaxis megkövetelése kiterjesztési sablonokkal

A sablonok áthatolódhatnak, és bármilyen YAML-szintaxist módosíthatnak vagy tilthatnak le. Az iteráció bizonyos YAML-szintaxis használatát kényszerítheti, beleértve a fenti funkciókat is.

A sablonok átírhatják a felhasználói lépéseket, és csak bizonyos jóváhagyott feladatok futtatását engedélyezhetik. Megakadályozhatja például a beágyazott szkriptek végrehajtását.

Figyelmeztetés

Az alábbi példában a "bash", "powershell", "pwsh" és "script" lépéseket nem lehet végrehajtani. Az alkalmi szkriptek teljes zárolásához a "BatchScript" és a "ShellScript" parancsot is le kell tiltania.

# 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 lines below will 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 }}'
# 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 sablonok és paramétereik konstansokká alakulnak a folyamat futtatása előtt. A sablonparaméterek típusbiztonságot biztosítanak a bemeneti paraméterek számára. Korlátozhatja például, hogy mely készletek használhatók egy folyamatban úgy, hogy a szabadkérelmű sztring helyett a lehetséges lehetőségek számbavételét kínálja.

# 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
# azure-pipelines.yml
extends:
  template: template.yml
  parameters:
    userpool: private-pool-1

A szükséges sablonok beállítása

Ha egy adott sablon használatát szeretné megkövetelni, beállíthatja a szükséges sablonellenőrzést egy erőforrás vagy környezet számára. A szükséges sablonellenőrzés használható a sablonból való kiterjesztéskor.

A folyamatfeladatok megtekintésekor ellenőrizheti az ellenőrzés állapotát. Ha egy folyamat nem terjed ki a kötelező sablonból, az ellenőrzés sikertelen lesz, és a futtatás leáll. Látni fogja, hogy az ellenőrzés sikertelen volt.

a jóváhagyás ellenőrzése sikertelen

Ha a szükséges sablont használja, látni fogja, hogy a csekk megfelelt.

jóváhagyási ellenőrző bérletek

Itt a sablonra params.yml az erőforrás jóváhagyásával van szükség. A folyamat sikertelen indításához megjegyzést fűzhet a következőhöz: params.yml.

# 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 }}
# azure-pipeline.yml

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

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

További lépések

A sablonok anélkül adhatnak hozzá lépéseket, hogy a folyamat szerzőjének bele kellene foglalnia őket. Ezekkel a lépésekkel hitelesítőadat-vizsgálatot vagy statikus kódellenőrzéseket futtathat.

# template to insert a step before and after user steps in every job
parameters:
  jobs: []

jobs:
- ${{ each job in parameters.jobs }}: # Each job
  - ${{ each pair in job }}:  # Insert all properties other than "steps"
      ${{ if ne(pair.key, 'steps') }}:
        ${{ pair.key }}: ${{ pair.value }}
    steps:                            # Wrap the steps
    - task: CredScan@1                # Pre steps
    - ${{ job.steps }}                # Users steps
    - task: PublishMyTelemetry@1      # Post steps
      condition: always()

Sablon kényszerítése

A sablon csak akkor biztonsági mechanizmus, ha kényszeríthető. A sablonok használatának kikényszerítésére használt vezérlőpont egy védett erőforrás. Jóváhagyásokat és ellenőrzéseket konfigurálhat az ügynökkészleten vagy más védett erőforrásokon, például adattárakon. Példa: Adattár erőforrás-ellenőrzés hozzáadása.

Következő lépések

Ezután megtudhatja, hogyan használhatja biztonságosan a bemeneteket változókon és paramétereken keresztül.