Keamanan melalui templat

Layanan Azure DevOps | Azure DevOps Server 2022 | Azure DevOps Server 2020

Pemeriksaan pada sumber daya yang dilindungi adalah blok penyusun dasar keamanan untuk Azure Pipelines. Memeriksa pekerjaan apa pun strukturnya - tahapan dan pekerjaan - dari alur Anda. Jika beberapa alur di tim atau organisasi Anda memiliki struktur yang sama, Anda dapat menyederhanakan keamanan lebih lanjut menggunakan templat.

Azure Pipelines menawarkan dua jenis templat: meliputi dan memperluas. Templat yang disertakan berkinerja seperti #include di C++: seolah-olah Anda menempelkan kode templat langsung ke file luar, yang mereferensikannya. Misalnya, di sini templat yang disertakan (include-npm-steps.yml) disisipkan ke dalam steps.

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

Untuk melanjutkan metafora C++, extends templat lebih seperti pewarisan: templat menyediakan struktur luar alur dan serangkaian tempat di mana konsumen templat dapat membuat perubahan yang ditargetkan.

Menggunakan templat perluasan

Untuk alur yang paling aman, sebaiknya mulai dengan extends templat. Dengan menyediakan struktur luar, templat dapat mencegah kode berbahaya masuk ke alur Anda. Anda masih dapat menggunakan includes, baik dalam templat maupun di alur akhir, untuk memperhitungkan bagian konfigurasi umum. Untuk menggunakan templat perluasan, alur Anda mungkin terlihat seperti contoh di bawah ini.

# 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

Saat Anda menyiapkan extends templat, pertimbangkan untuk menjangkarkannya ke cabang atau tag Git tertentu. Dengan begitu, jika perubahan yang melanggar perlu dilakukan, alur yang ada tidak akan terpengaruh. Contoh di atas menggunakan fitur ini.

Fitur keamanan yang diberlakukan melalui YAML

Ada beberapa perlindungan yang disertakan dalam sintaks YAML, dan templat perluasan dapat memberlakukan penggunaan salah satu atau semuanya.

Target langkah

Batasi beberapa langkah untuk dijalankan dalam kontainer alih-alih host. Tanpa akses ke host agen, langkah pengguna tidak dapat memodifikasi konfigurasi agen atau meninggalkan kode berbahaya untuk eksekusi nanti. Jalankan kode pada host terlebih dahulu untuk membuat kontainer lebih aman. Misalnya, sebaiknya batasi akses ke jaringan. Tanpa akses terbuka ke jaringan, langkah-langkah pengguna tidak akan dapat mengakses paket dari sumber yang tidak sah, atau mengunggah kode dan rahasia ke lokasi jaringan.

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

Pembatasan perintah pengelogan agen

Batasi layanan apa yang akan disediakan agen Azure Pipelines untuk langkah-langkah pengguna. Langkah-langkah meminta layanan menggunakan "perintah pengelogan" (string yang diformat khusus yang dicetak ke stdout). Dalam mode terbatas, sebagian besar layanan agen seperti mengunggah artefak dan melampirkan hasil pengujian tidak tersedia.

# 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

Salah satu perintah yang masih diizinkan dalam mode terbatas adalah setvariable perintah . Karena variabel alur diekspor sebagai variabel lingkungan ke tugas berikutnya, tugas yang menghasilkan data yang disediakan pengguna (misalnya, konten masalah terbuka yang diambil dari REST API) dapat rentan terhadap serangan injeksi. Konten pengguna tersebut dapat mengatur variabel lingkungan yang pada gilirannya dapat digunakan untuk mengeksploitasi host agen. Untuk melarang ini, penulis alur dapat secara eksplisit menyatakan variabel mana yang dapat diatur melalui setvariable perintah pengelogan. Menentukan daftar kosong melarang pengaturan semua variabel.

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

Penyisipan tahapan atau pekerjaan bersyar

Batasi tahapan dan pekerjaan untuk dijalankan dalam kondisi tertentu. Kondisi dapat membantu, misalnya, untuk memastikan bahwa Anda hanya membangun cabang tertentu.

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

Memerlukan sintaks tertentu dengan templat perluas

Templat dapat melakukan iterasi dan mengubah/melarang sintaks YAML apa pun. Perulangan dapat memaksa penggunaan sintaks YAML tertentu termasuk fitur di atas.

Templat dapat menulis ulang langkah-langkah pengguna dan hanya mengizinkan tugas tertentu yang disetujui untuk dijalankan. Misalnya, Anda dapat mencegah eksekusi skrip sebaris.

Peringatan

Dalam contoh di bawah ini, langkah-langkah jenis "bash", "powershell", "pwsh" dan "script" dicegah untuk dieksekusi. Untuk penguncian penuh skrip ad-hoc, Anda juga perlu memblokir "BatchScript" dan "ShellScript".

# 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

Parameter jenis aman

Templat dan parameternya diubah menjadi konstanta sebelum alur berjalan. Parameter templat memberikan keamanan jenis untuk parameter input. Misalnya, ini dapat membatasi kumpulan mana yang dapat digunakan dalam alur dengan menawarkan enumerasi opsi yang mungkin daripada string bentuk bebas.

# 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

Mengatur templat yang diperlukan

Untuk mengharuskan templat tertentu digunakan, Anda dapat mengatur pemeriksaan templat yang diperlukan untuk sumber daya atau lingkungan. Pemeriksaan templat yang diperlukan dapat digunakan saat memperluas dari templat.

Anda dapat memeriksa status pemeriksaan saat melihat pekerjaan alur. Ketika alur tidak diperluas dari templat yang diperlukan, pemeriksaan akan gagal dan eksekusi akan berhenti. Anda akan melihat bahwa pemeriksaan Anda gagal.

pemeriksaan persetujuan gagal

Saat templat yang diperlukan digunakan, Anda akan melihat bahwa pemeriksaan Anda lulus.

cek persetujuan lolos

Di sini templat params.yml diperlukan dengan persetujuan pada sumber daya. Untuk memicu alur gagal, komentari referensi ke 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'

Langkah-langkah tambahan

Templat dapat menambahkan langkah-langkah tanpa penulis alur harus menyertakannya. Langkah-langkah ini dapat digunakan untuk menjalankan pemindaian kredensial atau pemeriksaan kode statis.

# 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()

Penegakan templat

Templat hanyalah mekanisme keamanan jika Anda dapat menerapkannya. Titik kontrol untuk menerapkan penggunaan templat adalah sumber daya yang dilindungi. Anda dapat mengonfigurasi persetujuan dan pemeriksaan pada kumpulan agen Anda atau sumber daya lain yang dilindungi seperti repositori. Misalnya, lihat Menambahkan pemeriksaan sumber daya repositori.

Langkah berikutnya

Selanjutnya, pelajari tentang mengambil input dengan aman melalui variabel dan parameter.