Aracılığıyla paylaş


Güvenlik şablonları

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 #include baş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 şablonlar extends devralmayı 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.

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ü.

Ö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'