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.
Saat templat yang diperlukan digunakan, Anda akan melihat bahwa pemeriksaan Anda lulus.
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk