Menggunakan Pemindaian On-Demand di pipeline Cloud Build Anda


Dengan menggunakan Pemindaian On-Demand sebagai bagian dari pipeline Cloud Build, Anda dapat memblokir build jika image container memiliki kerentanan dengan tingkat keparahan yang cocok dengan tingkat yang telah ditentukan.

Tutorial ini menunjukkan cara menggunakan Cloud Build untuk mem-build image container dari kode sumber, memindainya untuk menemukan kerentanan, memeriksa tingkat keparahan kerentanan, dan mengirim image ke Artifact Registry jika tidak ada kerentanan dengan tingkat keparahan tertentu.

Sebaiknya buat project Google Cloud baru untuk tutorial ini, dan selesaikan langkah-langkahnya di lingkungan yang terisolasi.

Tujuan

  • Build image dengan Cloud Build.
  • Pindai image yang di-build dengan Pemindaian On-Demand.
  • Menilai tingkat kerentanan yang dapat diterima.
  • Simpan image di Artifact Registry.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

Peran yang diperlukan

Akun layanan yang Anda gunakan dengan Cloud Build memerlukan peran berikut:

Akun layanan Cloud Build default memiliki izin yang diperlukan untuk repositori Artifact Registry dalam project yang sama. Jika repositori Anda berada dalam project yang sama dengan yang Anda gunakan untuk Cloud Build, Anda hanya perlu memberikan peran Admin Pemindaian On-Demand.

Jika menggunakan akun layanan yang disediakan pengguna untuk Cloud Build, Anda perlu memberikan kedua peran tersebut.

Menyiapkan file sumber

Untuk tutorial ini, Anda akan mem-build image dari Dockerfile. Dockerfile adalah file sumber yang berisi petunjuk bagi Docker untuk mem-build image.

  1. Buka terminal, buat direktori baru bernama ods-tutorial, lalu buka direktori tersebut:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. Buat file bernama Dockerfile dengan konten berikut:

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

Membuat repositori Artifact Registry

  1. Tetapkan project ID ke project yang sama tempat Anda mengaktifkan API:

    gcloud config set project PROJECT_ID
    
  2. Buat repositori Docker bernama ods-build-repo di lokasi us-central1:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. Pastikan repositori Anda berhasil dibuat:

    gcloud artifacts repositories list
    

Mem-build dan memindai

Di bagian ini, Anda akan menjalankan pipeline build menggunakan file konfigurasi build. File konfigurasi build memberi tahu Cloud Build cara melakukan beberapa tugas berdasarkan spesifikasi Anda.

  1. Di folder ods-tutorial/, buat file cloudbuild.yaml dengan konten berikut:

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    File ini menyertakan lokasi dan repositori yang sebelumnya dibuat di Artifact Registry. Jika Anda memutuskan untuk menggunakan nilai yang berbeda, ubah file cloudbuild.yaml yang sesuai. Nilai untuk PROJECT_ID dan SEVERITY diteruskan ke skrip dalam perintah build.

  2. Tentukan tingkat SEVERITY kerentanan yang ingin Anda blokir dan mulai build Anda.

    Anda dapat menggunakan nilai berikut untuk SEVERITY:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    Anda dapat menentukan beberapa tingkat keparahan menggunakan ekspresi reguler.

    Dalam contoh berikut, Anda menentukan nilai keparahan CRITICAL dan HIGH. Tindakan ini akan menginstruksikan Cloud Build untuk memeriksa kerentanan yang diklasifikasikan pada atau di atas tingkat keparahan HIGH.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    Dari mana

    • PROJECT_ID adalah project ID Anda.
    • SEVERITY memungkinkan Anda menetapkan tingkat keparahan yang ingin diblokir. Jika Pemindaian On-Demand menemukan kerentanan yang cocok dengan salah satu tingkat keparahan yang ditentukan, build Anda akan gagal.

Memahami hasil

Jika Anda menetapkan nilai SEVERITY ke CRITICAL|HIGH, setelah Pemindaian On Demand memindai kerentanan, pemindaian akan melihat apakah ada kerentanan di tingkat HIGH dan tingkat CRITICAL yang lebih parah. Jika tidak ada kerentanan yang cocok yang ditemukan dalam image Anda, build akan berhasil dan Cloud Build akan mengirimkan image Anda ke Artifact Registry.

Outputnya mirip dengan hal berikut ini:

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

Jika Pemindaian On-Demand menemukan kerentanan HIGH atau CRITICAL dalam image Anda, langkah build scan akan gagal, langkah build berikutnya tidak akan dimulai, dan Cloud Build tidak akan mengirim image ke Artifact Registry.

Outputnya mirip dengan hal berikut ini:

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

Dalam tutorial ini, hasil Anda mungkin berbeda, karena kode sumber contoh adalah distribusi Linux yang tersedia secara publik, debian10:latest. Distribusi Linux dan data kerentanan terkait menerima update secara berkelanjutan.

Untuk mempelajari alat dan praktik terbaik Google Cloud tambahan guna membantu melindungi supply chain software Anda, lihat Keamanan supply chain software.

Untuk informasi selengkapnya tentang praktik terbaik pengelolaan kerentanan Linux, Anda dapat menggunakan pelatihan online gratis yang disediakan oleh Linux Foundation. Lihat Mengembangkan Software yang Aman.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus resource satu per satu

Sebelum menghapus repositori, pastikan gambar yang ingin Anda simpan tersedia di lokasi lain.

Untuk menghapus repositori:

Konsol

  1. Buka halaman Repositories di konsol Google Cloud.

    Buka halaman Repositori

  2. Dalam daftar repositori, pilih repositori ods-build-repo.

  3. Klik Hapus.

gcloud

Untuk menghapus ods-build-repo repositori, jalankan perintah berikut:

gcloud artifacts repositories delete ods-build-repo --location=us-central1

Langkah selanjutnya