Aracılığıyla paylaş


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 şablonunu steps 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 okbir 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 , , powershellpwshve 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.

Başarısız onay denetimini gösteren ekran görüntüsü.

Gerekli şablonu kullandığınızda, denetim geçer.

Geçirilen onay denetimini gösteren ekran görüntüsü.

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'