Şablonlar aracılığıyla güvenlik

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Korumalı kaynaklar üzerindeki denetimler , Azure Pipelines için temel güvenlik yapı taşıdır. İşlem hattınızın yapısından (aşamaları ve işleri) bağımsız olarak çalışır. Ekibinizdeki veya kuruluşunuzdaki birkaç işlem hattı aynı yapıya sahipse ş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 #include davranır: Şablonun kodunu doğrudan dış dosyaya yapıştırırsınız ve buna başvurur. Örneğin, burada içine stepsbir ekleme şablonu (include-npm-steps.yml) eklenir.

  steps:
  - template: templates/include-npm-steps.yml 

C++ metaforunu devam etmek için şablonlar extends daha çok devralma gibidir: şablon işlem hattının dış yapısını ve şablon tüketicisinin hedeflenen değişiklikler gerçekleştirebileceği bir dizi yer sağlar.

Extends şablonlarını kullanma

En güvenli işlem hatları için şablonlarla extends başlamanızı öneririz. Dış yapıyı sağlayarak, bir şablon kötü amaçlı kodun işlem hattınıza girmesini engelleyebilir. Ortak yapılandırma parçalarını dikkate almak için hem şablonda hem de son işlem hattında kullanabilirsiniz includes. Genişletme şablonu kullanmak için işlem hattınız aşağıdaki örnekteki 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

Şablonları ayarlarken extends , bunları belirli bir Git dalı veya etiketine bağlamayı göz önünde bulundurun. Bu şekilde, hataya neden olan değişikliklerin yapılması gerekiyorsa mevcut işlem hatları etkilenmez. Yukarıdaki örneklerde bu özellik kullanılır.

YAML aracılığıyla uygulanan güvenlik özellikleri

YAML söz diziminde yerleşik olarak bulunan çeşitli korumalar vardır ve genişletme şablonu, bunların herhangi birinin veya tümünün kullanımını zorlayabilir.

Adım hedefleri

Bazı adımları konak yerine kapsayıcıda çalışacak şekilde kısıtlayın. Aracının konağına erişim olmadan, kullanıcı adımları aracı yapılandırmasını değiştiremez veya daha sonra yürütülmek üzere kötü amaçlı kod bırakamaz. Kapsayıcıyı daha güvenli hale getirmek için önce konakta kod ç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 paketlere erişemez veya bir ağ konumuna kod ve gizli diziler yükleyemez.

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ğlayacağını kısıtlayın. "Günlük komutları" (stdout'a yazdırılan özel olarak biçimlendirilmiş dizeler) kullanarak hizmet isteğinde bulunma adımlarını izleyin. Kısıtlı modda, aracıya ait yapıtları karşıya yükleme ve test sonuçları 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ıtlı modda hala izin verilen komutlardan biri komutudur setvariable . İşlem hattı değişkenleri sonraki görevlere ortam değişkenleri olarak dışarı aktarıldığından, kullanıcı tarafından sağlanan verileri (örneğin, REST API'den alınan açık sorunların içeriği) veren görevler ekleme saldırılarına karşı savunmasız olabilir. Bu tür kullanıcı içeriği, aracı ana bilgisayarından yararlanmak için kullanılabilecek ortam değişkenleri ayarlayabilir. İşlem hattı yazarları bunu reddetmek için, hangi değişkenlerin günlüğe kaydetme komutuyla setvariable ayarlandığını açıkça bildirebilir. Boş bir liste belirtilmesi, tüm değişkenlerin ayarlanmasına izin vermemektedir.

# 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 eklenmesi

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ı oluşturduğunuzdan emin olmanıza 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ıyla belirli bir söz dizimi iste

Şablonlar yaml söz dizimlerini yineleyebilir ve değiştirebilir/izin vermeyebilir. Yineleme, yukarıdaki özellikler de dahil olmak üzere belirli YAML söz diziminin kullanılmasını zorlayabilir.

Şablon, kullanıcı adımlarını yeniden yazabilir ve yalnızca onaylanan belirli görevlerin çalışmasına izin verebilir. Örneğin, satır içi betik yürütmeyi engelleyebilirsiniz.

Uyarı

Aşağıdaki örnekte "bash", "powershell", "pwsh" ve "script" gibi adımların yürütülmesi engellenmiştir. Geçici betiklerin tam olarak kilitlenmesi için "BatchScript" ve "ShellScript" öğelerini de engellemeniz gerekir.

# 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 lines below will 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 }}'
# 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 açısından güvenli parametreler

Şablonlar ve parametreleri, işlem hattı çalışmadan önce sabitlere dönüştürülür. Şablon parametreleri , giriş parametreleri için tür güvenliği sağlar. Örneğin, serbest biçimli bir dize yerine olası seçeneklerin bir numaralandırmasını sunarak işlem hattında 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ı ayarlama

Belirli bir şablonun kullanılmasını gerektirmek için bir kaynak veya ortam için gerekli şablon denetimini ayarlayabilirsiniz. Gerekli şablon denetimi, bir şablondan genişletirken kullanılabilir.

İşlem hattı işini görüntülerken denetimin durumunu de kontrol edebilirsiniz. İşlem hattı gerekli şablonun kapsamını genişletmediğinde denetim başarısız olur ve çalıştırma durur. Denetiminizin başarısız olduğunu görürsünüz.

onay denetimi başarısız oluyor

Gerekli şablon kullanıldığında, denetiminizin başarılı olduğunu görürsünüz.

onay denetimi başarılı oldu

Burada şablon params.yml kaynak üzerinde onay ile birlikte gereklidir. İşlem hattının başarısız olmasını tetikleyebilmek için başvurusuna açıklama ekleyin 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 dahil etmek zorunda kalmadan adımlar ekleyebilir. Bu adımlar kimlik bilgisi taramasını veya statik kod denetimlerini ç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()

Şablon zorlama

Şablon yalnızca bunu zorunlu kılabilirseniz bir güvenlik mekanizmasıdır. Şablonların kullanımını zorunlu kılmaya ilişkin denetim noktası korumalı bir kaynaktır. Aracı havuzunuzda veya depolar gibi diğer korumalı kaynaklarda onayları ve denetimleri yapılandırabilirsiniz. Örnek için bkz. Depo kaynağı denetimi ekleme.

Sonraki adımlar

Ardından , değişkenler ve parametreler aracılığıyla girişleri güvenli bir şekilde alma hakkında bilgi edinin.