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

onay denetimi başarısız

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

onay denetimi geçişleri

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.