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 includes
a 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.
Ha a szükséges sablont használja, látni fogja, hogy a csekk megfelelt.
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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: