Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Azure Pipelines şablonları YAML işlem hatlarında yeniden kullanılabilir içerik, mantık ve parametreler tanımlamanıza olanak sağlar. Bu makalede şablonların işlem hattı güvenliğini artırmaya nasıl yardımcı olabileceği açıklanır:
- Kötü amaçlı kod sızmasını önlemeye yardımcı olmak için işlem hattının dış yapısını tanımlama.
- Kimlik bilgisi tarama gibi görevleri gerçekleştirme adımlarını otomatik olarak ekleme.
- Azure Pipelines için temel güvenlik çerçevesini oluşturan ve tüm işlem hattı yapılarına ve bileşenlerine uygulanan korumalı kaynaklar üzerinde denetimlerin uygulanmasına yardımcı olma.
Bu makale, Azure Pipelines için güvenlik önlemleri uygulamanıza yardımcı olan bir serinin parçasıdır. Daha fazla bilgi için bkz . Azure Pipelines'ın güvenliğini sağlama.
Önkoşullar
| Kategori | Gereksinimler |
|---|---|
| Azure DevOps | - Azure DevOps'unuzu güvenli hale getirme ve Azure Pipelines'ı güvenli hale getirme bölümünde öneriler uygulayın. - YAML ve Azure Pipelines hakkında temel bilgiler. Daha fazla bilgi için bkz. İlk işlem hattınızı oluşturma. |
| İzinler | - İşlem hattı izinlerini değiştirmek için: Proje Yöneticileri grubunun üyesi. - Kuruluş izinlerini değiştirmek için: Proje Koleksiyonu Yöneticileri grubunun üyesi. |
Şablonları içerir ve genişletir
Azure Pipelines şablonları içerir ve genişletir .
Şablon
includes, C++ içindekine benzer şekilde, şablonun kodunu doğrudan şablona#includebaşvuran dış dosyada içerir. Aşağıdaki örnek işlem hattı, include-npm-steps.yml.steps: - template: templates/include-npm-steps.ymlŞablon
extends, işlem hattının dış yapısını tanımlar ve hedeflenen özelleştirmeler için belirli noktalar sunar. C++ bağlamında şablonlarextendsdevralmayı andırır.
Şablonları kullandığınızda extends , hem şablonda hem de son işlem hattında ortak yapılandırma parçaları yapmak için de kullanabilirsiniz includes . Daha fazla bilgi için bkz. Yeniden kullanılabilir ve güvenli işlemler için işlem hatlarında YAML şablonlarını kullanma.
Şablonları genişletir
En güvenli işlem hatları için extends şablonları kullanmaya başlayın. Bu şablonlar işlem hattının dış yapısını tanımlar ve kötü amaçlı kod sızmasını önlemeye yardımcı olur.
Aşağıdaki örnekte template.yml adlı bir şablon dosyası gösterilmektedir.
parameters:
- name: usersteps
type: stepList
default: []
steps:
- ${{ each step in parameters.usersteps }}:
- ${{ step }}
Aşağıdaki örnek 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, mevcut işlem hatlarını etkilememesi için bunları belirli bir Git dalına veya etiketine bağlamayı düşünün, böylece hataya neden olan değişikliklerden etkilenmezler. Yukarıdaki örnekte bu özellik kullanılır.
İşlem hattı güvenlik özellikleri
YAML işlem hattı söz diziminde çeşitli yerleşik korumalar bulunur.
Extends şablonlar, işlem hattı güvenliğini geliştirmek için kullanımlarını zorunlu kılabilir. Aşağıdaki kısıtlamalardan herhangi birini uygulayabilirsiniz.
Adım hedefleri
Belirtilen adımları konak yerine bir kapsayıcıda çalışacak şekilde kısıtlayabilirsiniz. Kapsayıcılardaki adımlar aracı konağına erişemez, bu nedenle aracı yapılandırmasını değiştiremez veya daha sonra yürütülebilecek kötü amaçlı kod bırakamaz.
Örneğin, kullanıcı adımlarını bir kapsayıcıda çalıştırarak, ağ erişimlerini engelleyebilir ve böylece yetkisiz kaynaklardan paket almalarını ya da harici konumlara kod ve gizli bilgileri yüklemelerini önleyebilirsiniz.
Aşağıdaki örnek işlem hattı, önce aracı ana bilgisayar üzerinde konak ağını potansiyel olarak değiştirebilecek bir adımı, ardından ağ erişimini sınırlayan bir kapsayıcı içinde bir adımı çalıştırır.
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ür güvenli parametreler
İşlem hattı çalışmadan önce şablonlar ve parametreleri sabitlere dönüşür. Şablon parametreleri , giriş parametreleri için tür güvenliğini iyileştirebilir.
Aşağıdaki örnek şablonda, parametreler herhangi bir dizeye izin vermek yerine belirli seçenekleri numaralandırarak 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: echo Hello world
Şablonu genişletmek için işlem hattının kullanılabilir havuz seçimlerinden birini belirtmesi gerekir.
# azure-pipelines.yml
extends:
template: template.yml
parameters:
userpool: private-pool-1
Aracı günlüğü komut kısıtlamaları
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. Günlük komutlarının kullanıcı adımları için sağladığı hizmetleri kısıtlayabilirsiniz. Modda restricted , yapıtları karşıya yükleme ve test sonuçlarını ekleme gibi aracı hizmetlerinin çoğu günlük komutları için kullanılamaz.
Aşağıdaki örnekte, target özelliği aracıya yapıtların yayımını kısıtlamasını talimat verir, bu nedenle yapıt yayım görevi başarısız olur.
- task: PublishBuildArtifacts@1
inputs:
artifactName: myartifacts
target:
commands: restricted
Günlük komutlarındaki değişkenler
Komut setvariable, restricted modunda izin verilen bir durumda kalır, bu nedenle REST API aracılığıyla alınan açık talepler gibi kullanıcı tarafından sağlanan verileri veren görevler enjeksiyon saldırılarına karşı savunmasız olabilir. Kötü niyetli kullanıcı içeriği, sonraki görevlere ortam değişkenleri olarak aktarılacak değişkenler ayarlayabilir ve ajan sunucunun güvenliğini tehlikeye atabilir.
Bu riski azaltmak için günlük komutunu kullanarak setvariable ayarlanabilir değişkenleri açıkça bildirebilirsiniz. içinde settableVariablesboş bir liste belirtirseniz, tüm değişken ayarlarına izin verilmez.
Aşağıdaki örnek, settableVariables ile expectedVar ve ok ön ekine sahip herhangi bir değişkeni kısıtlar. Adlı BadVarfarklı bir değişken ayarlamaya çalıştığından görev başarısız oluyor.
- 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 örnek, kısıtlanmış kodun yalnızca main dalı için oluşturulmasını sağlayacaktır.
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, şablon satır içi kod yürütmeyi engelleyebilir.
Aşağıdaki örnek şablon, bash, powershell, pwsh ve script betik adım türlerinin çalışmasını önler. Betikleri tamamen kilitlemek için BatchScript ve ShellScript de engelleyebilirsiniz.
# 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 }}'
Yukarıdaki şablonu genişleten aşağıdaki örnek 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 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
Şablon adımları
Şablon, kimlik bilgisi tarama veya statik kod denetimleri yapmak gibi işlem hattındaki adımları otomatik olarak içerebilir. 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ın güvenlik mekanizması olarak etkinliğ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 kaynağın hizmet bağlantısında 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.
Gerekli şablonu kullandığınızda, denetim geçer.
Örneğin, aşağıdaki params.yml şablonuna atıfta bulunulmalıdır, çünkü bu, onu genişleten herhangi bir işlem hattında gereklidir.
# 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 extends başvurusunu yorum satırı olarak işaretleyin.
# azure-pipeline.yml
resources:
containers:
- container: my-container
endpoint: my-service-connection
image: mycontainerimages
extends:
template: params.yml
parameters:
yesNo: true
image: 'windows-latest'