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 asteps
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 ok
rendelkező 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
, pwsh
powershell
és script
nem futtatható. Az alkalmi szkriptek teljes zárolásához letilthatja és ShellScript
letilthatja 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.
Ha a szükséges sablont használja, az ellenőrzés sikeres lesz.
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'