Şablonlar üzerinden güvenlik
Korunan kaynakların denetimleri , Azure Pipelines için temel yapı güvenlik bloğudur. İşler, işlem hattınızdaki aşamalar ve işler için yapıyı ne belirtmeksizin çalışır. Takımınızda veya kuruluşunuzda bulunan birkaç işlem hattı aynı yapıya sahip ise, ş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 davranır #include : şablonun kodunu, buna başvuran dış dosyaya doğrudan yapıştırmış olur.
C++ metaphor 'a devam etmek için, extends Şablonlar devralıma benzer: şablon, işlem hattının dış yapısını ve şablon tüketicisinin hedeflenen değişiklikleri yapabilecekleri bir dizi yeri sağlar.
Extends şablonlarını kullan
En güvenli işlem hatları için şablonlarla başlamasını öneririz extends .
Bir şablon, Dış yapıyı sağlayarak kötü amaçlı kodun işlem hattınıza alınmasını önleyebilir.
includesOrtak yapılandırma parçalarını çarpanlara ayırmak için hem şablonda hem de nihai işlem hattında kullanabilirsiniz.
Bir extends şablonu kullanmak için işlem hattınızda aşağıdaki örnek 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
extendsŞablonları ayarlarken, bunları belirli bir git dalına veya etiketine tutturmayı düşünün.
Bu şekilde, önemli değişiklikler yapılması gerekiyorsa, varolan işlem hatları etkilenmez.
Yukarıdaki örnekler bu özelliği kullanır.
YAML aracılığıyla zorlanan güvenlik özellikleri
YAML sözdiziminde yerleşik olarak bulunan çeşitli korumalar vardır ve bir extends şablonu, bunlardan herhangi birinin veya tümünün kullanımını zorunlu kılabilir.
Adım hedefleri
Bazı adımları konak yerine bir kapsayıcıda çalıştırmak için kısıtlayın. Aracının ana bilgisayarına erişim olmadan Kullanıcı adımları, daha sonra yürütülmesi için aracı yapılandırmasını değiştiremez veya kötü amaçlı kodlar bırakabilir. Kapsayıcıyı daha güvenli hale getirmek için önce konakta kodu ç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 gelen paketlere erişemez veya bir ağ konumuna kod ve gizli dizileri yükleyebilir.
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ğlayabileceklerini kısıtlayın. Adımlar, "günlüğe kaydetme komutları" kullanılarak hizmetler ister (stdout 'a yazdırılmış özel biçimlendirilmiş dizeler). Kısıtlı modda, aracının yapıtları yükleme ve test sonuçlarını 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ıtlanmış modda hala izin verilen komutlardan biri setvariable komuttur. İşlem hattı değişkenleri sonraki görevlere ortam değişkenleri olarak aktarıldığından, Kullanıcı tarafından belirtilen verileri (örneğin, bir REST API alınan açık sorunların içerikleri) içeren görevler, ekleme saldırılarına karşı savunmasız olabilir. Bu tür Kullanıcı içerikleri, aracı ana bilgisayarını kullanmak için kullanılabilecek ortam değişkenlerini ayarlayabilir. Buna izin vermemek için, işlem hattı yazarları günlüğe kaydetme komutu aracılığıyla hangi değişkenlerin ayarlanabilir olduğunu açıkça bildirebilir setvariable . Boş bir liste belirtildiğinde tüm değişkenler ayarlanmasına izin vermez.
# 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 ekleme
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ın oluşturuldıklarından emin olmak için 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ı ile belirli bir sözdizimi gerektir
Şablonlar herhangi bir YAML sözdizimini yineleyebilir ve değiştirebilir/izin vermez. Yineleme, yukarıdaki özellikler dahil olmak üzere belirli YAML sözdiziminin kullanımını zorlayabilir.
Şablon, Kullanıcı adımlarını yeniden yazabilir ve yalnızca belirli onaylanan görevlerin çalışmasına izin verebilir. Örneğin, satır içi betik yürütmeyi engelleyebilirsiniz.
Uyarı
Aşağıdaki örnekte, yalnızca sabit değerli adım türü "Script" engellenir. Geçici betiklerin tam kilidi için, "Bash", "pwsh", "PowerShell" ve bu adımları geri döndüren görevleri de engellemeniz gerekir.
# template.yml
parameters:
- name: usersteps
type: stepList
default: []
steps:
- ${{ each step in parameters.usersteps }}:
- ${{ each pair in step }}:
${{ if ne(pair.key, 'script') }}:
${{ pair.key }}: ${{ pair.value }}
# azure-pipelines.yml
extends:
template: template.yml
parameters:
usersteps:
- task: MyTask@1
- script: echo This step will be stripped out and not run!
- task: MyOtherTask@2
Tür kullanımı uyumlu parametreler
İşlem hattı çalıştırılmadan önce şablonlar ve parametreleri sabitler halinde açıktır. Şablon parametreleri, giriş parametrelerine tür güvenliği sağlar. Örneğin, bir serbest biçim dizesi yerine olası seçeneklerin bir listesini sunarak, bir ardışık düzende 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ı ayarla
Belirli bir şablonun kullanılmasını gerektirmek için, gerekli şablon denetimini bir kaynak veya ortam için ayarlayabilirsiniz. Gerekli şablon denetimi bir şablondan genişletilerek kullanılabilir.
Bir işlem hattı işi görüntülerken bir denetim durumunu kontrol edebilirsiniz. İşlem hattı, gerekli şablondan genişlemezse, Denetim başarısız olur ve çalıştırma durur. Kontrol etmeniz başarısız olduğunu göreceksiniz.

Gerekli şablon kullanıldığında, çekin geçtiğini görürsünüz.

Bu şablonda, params.yml kaynak üzerinde bir onaylamanın olması gerekir. İşlem hattının başarısız olarak tetiklenmesi için başvuruyu not edin 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 bunları dahil etmek zorunda kalmadan adımlar ekleyebilir. Bu adımlar, kimlik bilgisi tarama veya statik kod denetimleri ç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()
Sonraki adımlar
Daha sonra, değişkenleri ve parametrelerikullanarak girdileri güvenle alma hakkında bilgi edinin.