Şablonlar aracılığıyla güvenlik
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Korumalı kaynaklar üzerindeki denetimler , Azure Pipelines için temel güvenlik yapı taşıdır. İşlem hattınızın yapısından (aşamaları ve işleri) bağımsız olarak çalışır. Ekibinizdeki veya kuruluşunuzdaki birkaç işlem hattı aynı yapıya sahipse şablonları kullanarak güvenliği daha da basitleştirebilirsiniz.
Azure Pipelines iki tür şablon sunar: içerir ve genişletir.
Dahil edilen şablonlar C++'da olduğu gibi #include
davranır: Şablonun kodunu doğrudan dış dosyaya yapıştırırsınız ve buna başvurur. Örneğin, burada içine steps
bir ekleme şablonu (include-npm-steps.yml
) eklenir.
steps:
- template: templates/include-npm-steps.yml
C++ metaforunu devam etmek için şablonlar extends
daha çok devralma gibidir: şablon işlem hattının dış yapısını ve şablon tüketicisinin hedeflenen değişiklikler gerçekleştirebileceği bir dizi yer sağlar.
Extends şablonlarını kullanma
En güvenli işlem hatları için şablonlarla extends
başlamanızı öneririz.
Dış yapıyı sağlayarak, bir şablon kötü amaçlı kodun işlem hattınıza girmesini engelleyebilir.
Ortak yapılandırma parçalarını dikkate almak için hem şablonda hem de son işlem hattında kullanabilirsiniz includes
.
Genişletme şablonu kullanmak için işlem hattınız aşağıdaki örnekteki gibi görünebilir.
# 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
Şablonları ayarlarken extends
, bunları belirli bir Git dalı veya etiketine bağlamayı göz önünde bulundurun.
Bu şekilde, hataya neden olan değişikliklerin yapılması gerekiyorsa mevcut işlem hatları etkilenmez.
Yukarıdaki örneklerde bu özellik kullanılır.
YAML aracılığıyla uygulanan güvenlik özellikleri
YAML söz diziminde yerleşik olarak bulunan çeşitli korumalar vardır ve genişletme şablonu, bunların herhangi birinin veya tümünün kullanımını zorlayabilir.
Adım hedefleri
Bazı adımları konak yerine kapsayıcıda çalışacak şekilde kısıtlayın. Aracının konağına erişim olmadan, kullanıcı adımları aracı yapılandırmasını değiştiremez veya daha sonra yürütülmek üzere kötü amaçlı kod bırakamaz. Kapsayıcıyı daha güvenli hale getirmek için önce konakta kod çalıştırın. Örneğin, ağa erişimi sınırlamanızı öneririz. Ağa açık erişim olmadan, kullanıcı adımları yetkisiz kaynaklardan paketlere erişemez veya bir ağ konumuna kod ve gizli diziler yükleyemez.
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
Aracı günlüğü komut kısıtlamaları
Azure Pipelines aracısının kullanıcı adımlarına hangi hizmetleri sağlayacağını kısıtlayın. "Günlük komutları" (stdout'a yazdırılan özel olarak biçimlendirilmiş dizeler) kullanarak hizmet isteğinde bulunma adımlarını izleyin. Kısıtlı modda, aracıya ait yapıtları karşıya yükleme ve test sonuçları ekleme gibi hizmetlerinin çoğu kullanılamaz.
# 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
Kısıtlı modda hala izin verilen komutlardan biri komutudur setvariable
. İşlem hattı değişkenleri sonraki görevlere ortam değişkenleri olarak dışarı aktarıldığından, kullanıcı tarafından sağlanan verileri (örneğin, REST API'den alınan açık sorunların içeriği) veren görevler ekleme saldırılarına karşı savunmasız olabilir. Bu tür kullanıcı içeriği, aracı ana bilgisayarından yararlanmak için kullanılabilecek ortam değişkenleri ayarlayabilir. İşlem hattı yazarları bunu reddetmek için, hangi değişkenlerin günlüğe kaydetme komutuyla setvariable
ayarlandığını açıkça bildirebilir. Boş bir liste belirtilmesi, tüm değişkenlerin ayarlanmasına izin vermemektedir.
# 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"
Aşamaların veya işlerin koşullu eklenmesi
Aşamaları ve işleri belirli koşullar altında çalışacak şekilde kısıtlayın. Koşullar, örneğin yalnızca belirli dalları oluşturduğunuzdan emin olmanıza yardımcı olabilir.
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
Extends şablonlarıyla belirli bir söz dizimi iste
Şablonlar yaml söz dizimlerini yineleyebilir ve değiştirebilir/izin vermeyebilir. Yineleme, yukarıdaki özellikler de dahil olmak üzere belirli YAML söz diziminin kullanılmasını zorlayabilir.
Şablon, kullanıcı adımlarını yeniden yazabilir ve yalnızca onaylanan belirli görevlerin çalışmasına izin verebilir. Örneğin, satır içi betik yürütmeyi engelleyebilirsiniz.
Uyarı
Aşağıdaki örnekte "bash", "powershell", "pwsh" ve "script" gibi adımların yürütülmesi engellenmiştir. Geçici betiklerin tam olarak kilitlenmesi için "BatchScript" ve "ShellScript" öğelerini de engellemeniz gerekir.
# 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ür açısından güvenli parametreler
Şablonlar ve parametreleri, işlem hattı çalışmadan önce sabitlere dönüştürülür. Şablon parametreleri , giriş parametreleri için tür güvenliği sağlar. Örneğin, serbest biçimli bir dize yerine olası seçeneklerin bir numaralandırmasını sunarak işlem hattında hangi havuzların kullanılabileceğini kısıtlayabilir.
# 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
Gerekli şablonları ayarlama
Belirli bir şablonun kullanılmasını gerektirmek için bir kaynak veya ortam için gerekli şablon denetimini ayarlayabilirsiniz. Gerekli şablon denetimi, bir şablondan genişletirken kullanılabilir.
İşlem hattı işini görüntülerken denetimin durumunu de kontrol edebilirsiniz. İşlem hattı gerekli şablonun kapsamını genişletmediğinde denetim başarısız olur ve çalıştırma durur. Denetiminizin başarısız olduğunu görürsünüz.
Gerekli şablon kullanıldığında, denetiminizin başarılı olduğunu görürsünüz.
Burada şablon params.yml
kaynak üzerinde onay ile birlikte gereklidir. İşlem hattının başarısız olmasını tetikleyebilmek için başvurusuna açıklama ekleyin 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'
Ek adımlar
Şablon, işlem hattı yazarının dahil etmek zorunda kalmadan adımlar ekleyebilir. Bu adımlar kimlik bilgisi taramasını veya statik kod denetimlerini çalıştırmak için kullanılabilir.
# 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()
Şablon zorlama
Şablon yalnızca bunu zorunlu kılabilirseniz bir güvenlik mekanizmasıdır. Şablonların kullanımını zorunlu kılmaya ilişkin denetim noktası korumalı bir kaynaktır. Aracı havuzunuzda veya depolar gibi diğer korumalı kaynaklarda onayları ve denetimleri yapılandırabilirsiniz. Örnek için bkz. Depo kaynağı denetimi ekleme.
Sonraki adımlar
Ardından , değişkenler ve parametreler aracılığıyla girişleri güvenli bir şekilde alma hakkında bilgi edinin.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin