Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
includessablon a sablon kódját közvetlenül a sablonra hivatkozó külső fájlban tartalmazza, hasonlóan#includea C++-hoz. Az alábbi példafolyamat beszúrja a include-npm-steps.yml sablont astepsszakaszba.steps: - template: templates/include-npm-steps.ymlA
extendssablon meghatározza a folyamat külső szerkezetét, és konkrét pontokat kínál a célzott testreszabásokhoz. A C++extendskontextusá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.
Ha a szükséges sablont használja, az ellenőrzés sikeres lesz.
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'