Güvenlik için şablonları kullanma
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Bu makalede şablonların Azure Pipelines için güvenliği nasıl kolaylaştırabileceği açıklanmaktadır. Şablonlar işlem hattınızın dış yapısını tanımlayabilir ve kötü amaçlı kod sızmasını önlemeye yardımcı olabilir. Şablonlar, kimlik bilgisi tarama gibi görevleri gerçekleştirme adımlarını da otomatik olarak içerebilir. Ekibiniz veya kuruluşunuzdaki birden çok işlem hattı aynı yapıyı paylaşıyorsa şablonları kullanmayı göz önünde bulundurun.
Korumalı kaynaklar üzerindeki denetimler, Azure Pipelines için temel güvenlik çerçevesini oluşturur. Bu denetimler işlem hattı yapısına, aşamalara ve işlere bakılmaksızın geçerlidir. Bu denetimlerin uygulanmasına yardımcı olması için şablonları kullanabilirsiniz.
Şablonları içerir ve genişletir
Azure Pipelines şablonları içerir ve genişletir .
Şablonları içerir, şablonun kodunu C++ ile benzer şekilde
#include
doğrudan başvuruda bulunan dış dosyada içerir. Aşağıdaki örnek işlem hattı, include-npm-steps.yml şablonunusteps
bölümüne ekler.steps: - template: templates/include-npm-steps.yml
Şablonları genişletir, işlem hattının dış yapısını tanımlar ve hedeflenen özelleştirmeler için belirli noktalar sunar. C++ bağlamında şablonlar
extends
devralmayı andırır.
Şablonları kullanırken extends
, ortak yapılandırma parçalarını yapmak için hem şablonda hem de son işlem hattında da kullanabilirsiniz includes
. Tam başvuru için bkz . Şablon kullanım başvurusu.
Şablonları genişletir
En güvenli işlem hatları için başlangıç olarak extends şablonlarını kullanın. Bu şablonlar işlem hattının dış yapısını tanımlar ve kötü amaçlı kodun işlem hattına sızmasını önler.
Örneğin, aşağıdaki şablon dosyası template.yml olarak adlandırılır.
parameters:
- name: usersteps
type: stepList
default: []
steps:
- ${{ each step in parameters.usersteps }}:
- ${{ step }}
Aşağıdaki işlem hattı template.yml şablonunu genişletir.
# 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
İpucu
Şablonları ayarlarken extends
, hataya neden olan değişiklikler varsa mevcut işlem hatlarının etkilenmemesi için bunları belirli bir Git dalı veya etiketine bağlamayı göz önünde bulundurun. Yukarıdaki örnekte bu özellik kullanılır.
YAML işlem hattı güvenlik özellikleri
YAML işlem hattı söz diziminde çeşitli yerleşik korumalar bulunur. Extends şablonu kullanımını zorunlu kılabilir. İşlem hattı güvenliğini geliştirmek için aşağıdaki kısıtlamalardan herhangi birini uygulayabilirsiniz.
Adım hedefleri
Belirli adımları konak yerine bir kapsayıcıda çalışacak şekilde kısıtlayabilirsiniz. Kapsayıcılardaki adımların aracı konağına erişimi yoktur ve bu adımların aracı yapılandırmasını değiştirmesini veya daha sonra yürütülmek üzere kötü amaçlı kod bırakmasını önler.
Örneğin, ağ erişimini sınırlamayı göz önünde bulundurun. Açık ağ erişimi olmadan, kullanıcı adımları yetkisiz kaynaklardan paketleri alamaz veya kodu ve gizli dizileri dış ağ konumlarına yükleyemez.
Aşağıdaki örnek işlem hattı, kapsayıcı içindeki adımları çalıştırmadan önce aracı ana bilgisayarında adımları çalıştırır.
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 sağladığı hizmetleri kullanıcı adımlarıyla kısıtlayabilirsiniz. Kullanıcı adımları, standart çıktıya yazdırılan özel olarak biçimlendirilmiş dizeler olan günlük komutlarını kullanarak hizmet isteğinde bulunur. Kısıtlı modda, aracıya ait yapıtları karşıya yükleme ve test sonuçları ekleme gibi hizmetlerin çoğu kullanılamaz.
Aşağıdaki örnek görev, özelliği aracıya yayımlama yapıtlarına izin vermemesi talimatı verdiği için başarısız olur target
.
- task: PublishBuildArtifacts@1
inputs:
artifactName: myartifacts
target:
commands: restricted
Modunda restricted
komut setvariable
izin verilen durumda kalır, bu nedenle işlem hattı değişkenleri ortam değişkenleri olarak sonraki görevlere aktarıldığından dikkatli olunması gerekir. Görevler, REST API aracılığıyla alınan açık sorunlar gibi kullanıcı tarafından sağlanan verilerin çıkışını verirse ekleme saldırılarına karşı savunmasız olabilir. Kötü amaçlı kullanıcı içeriği, aracı ana bilgisayarının güvenliğini aşmak için yararlanabilecek ortam değişkenleri ayarlayabilir.
İşlem hattı yazarları bu riski azaltmak için günlük komutunu kullanarak hangi değişkenlerin ayarlanabileceğini setvariable
açıkça bildirebilir. Boş bir liste belirttiğinizde, tüm değişken ayarlarına izin verilmez.
Aşağıdaki örnek görev başarısız olur çünkü görevin yalnızca değişkeni veya ön ekli ok
bir değişkeni ayarlamasına expectedVar
izin verilir.
- task: PowerShell@2
target:
commands: restricted
settableVariables:
- expectedVar
- ok*
inputs:
targetType: 'inline'
script: |
Write-Host "##vso[task.setvariable variable=BadVar]myValue"
Koşullu aşama veya iş yürütme
Aşamaları ve işleri yalnızca belirli koşullar altında çalışacak şekilde kısıtlayabilirsiniz. Aşağıdaki örnekte koşul, kısıtlanmış kodun yalnızca ana dal için oluşturulmasını sağlar.
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
Söz dizimi değişikliği
Azure Pipelines şablonları YAML söz dizimini yineleme ve değiştirme esnekliğine sahiptir. Yinelemeyi kullanarak belirli YAML güvenlik özelliklerini zorunlu kılabilirsiniz.
Şablon ayrıca kullanıcı adımlarını yeniden yazarak yalnızca onaylanan görevlerin çalışmasına izin verebilir. Örneğin, satır içi betik yürütmeyi engelleyebilirsiniz.
Aşağıdaki örnek şablon , , powershell
pwsh
ve script
adım türlerinin bash
çalışmasını engeller. Geçici betiklerin tamamen kilitlenmesi için ve ShellScript
öğelerini de engelleyebilirsinizBatchScript
.
# 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 }}'
Bu şablonu genişleten aşağıdaki işlem hattında betik adımları çıkarılır ve çalıştırılmaz.
# 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 güvenli parametreler
İşlem hattı çalışmadan önce şablonlar ve parametreleri sabitlere dönüştürülür. Şablon parametreleri , giriş parametreleri için tür güvenliğini iyileştirebilir.
Aşağıdaki örnek şablonda parametreler, serbest biçimli dizelere izin vermek yerine belirli seçeneklerin bir numaralandırmasını sağlayarak kullanılabilir işlem hattı havuzu seçeneklerini kısıtlar.
# 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
İşlem hattı şablonu genişlettiğinde, kullanılabilir havuz seçimlerinden birini belirtmesi gerekir.
# azure-pipelines.yml
extends:
template: template.yml
parameters:
userpool: private-pool-1
Şablon adımları
Şablon, işlem hattına otomatik olarak adımlar ekleyebilir. Bu adımlar kimlik bilgisi tarama veya statik kod denetimleri gibi görevleri gerçekleştirebilir. Aşağıdaki şablon, her işte kullanıcı adımlarından önce ve sonra adımları ekler.
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()
Şablon zorlama
Şablonlar değerli bir güvenlik mekanizmasıdır, ancak bunların verimliliği zorlamaya dayanır. Şablon kullanımını zorlamaya yönelik temel denetim noktaları korumalı kaynaklardır. Aracı havuzunuzun veya depolar gibi diğer korumalı kaynakların onaylarını ve denetimlerini yapılandırabilirsiniz. Örnek için bkz . Depo kaynak denetimi ekleme.
Gerekli şablonlar
Belirli bir şablonun kullanımını zorunlu kılmak için bir kaynak için gerekli şablon denetimini yapılandırın. Bu denetim yalnızca işlem hattı bir şablondan genişletildiğinde geçerlidir.
İşlem hattı işini görüntülediğinizde, denetimin durumunu izleyebilirsiniz. İşlem hattı gerekli şablondan genişletilmezse, denetim başarısız olur. Çalıştırma durdurulur ve başarısız denetimi size bildirir.
Gerekli şablonu kullandığınızda, denetim geçer.
Aşağıdaki params.yml şablonu genişleten herhangi bir işlem hattında başvurulmalıdır.
# 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 }}
Aşağıdaki örnek işlem hattı, params.yml şablonunu genişletir ve onay için gerektirir. İşlem hattı hatasını göstermek için başvuruyu params.yml açıklama satırı oluşturun.
# azure-pipeline.yml
resources:
containers:
- container: my-container
endpoint: my-service-connection
image: mycontainerimages
extends:
template: params.yml
parameters:
yesNo: true
image: 'windows-latest'