Mengamankan Build Container

1. Pengantar

ead1609267034bf7.png

Kerentanan software adalah kelemahan yang dapat menyebabkan kegagalan sistem yang tidak disengaja atau mengekspos celah bagi pelaku kejahatan untuk membahayakan software Anda. Container Analysis menyediakan dua jenis pemindaian OS untuk menemukan kerentanan dalam container:

  • On-Demand Scanning API memungkinkan Anda memindai image container secara manual untuk mendeteksi kerentanan OS, baik secara lokal di komputer Anda maupun dari jarak jauh di Container Registry atau Artifact Registry.
  • Container Scanning API memungkinkan Anda mengotomatiskan deteksi kerentanan OS, dengan melakukan pemindaian setiap kali Anda mengirim image ke Container Registry atau Artifact Registry. Mengaktifkan API ini juga akan mengaktifkan pemindaian paket bahasa untuk mencari kerentanan Go dan Java.

On-Demand Scanning API memungkinkan Anda memindai image yang disimpan secara lokal di komputer Anda, atau dari jarak jauh di Container Registry atau Artifact Registry. Tindakan ini memberi Anda kontrol terperinci atas container yang ingin dideteksi kerentanannya. Anda dapat menggunakan Pemindaian On-Demand untuk memindai image di pipeline CI/CD sebelum menentukan apakah akan menyimpannya di registry atau tidak.

Yang akan Anda pelajari

Di lab ini, Anda akan:

  • Membuat Image dengan Cloud Build
  • Menggunakan Artifact Registry untuk Container
  • Memanfaatkan pemindaian kerentanan otomatis
  • Mengonfigurasi Pemindaian On-Demand
  • Menambahkan pemindaian image dalam CICD di Cloud Build

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (biasanya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan melihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Penyiapan Lingkungan

Di Cloud Shell, tetapkan project ID dan nomor project untuk project Anda. Simpan sebagai variabel PROJECT_ID dan PROJECT_ID.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

Mengaktifkan layanan

Aktifkan semua layanan yang diperlukan:

gcloud services enable \
  cloudkms.googleapis.com \
  cloudbuild.googleapis.com \
  container.googleapis.com \
  containerregistry.googleapis.com \
  artifactregistry.googleapis.com \
  containerscanning.googleapis.com \
  ondemandscanning.googleapis.com \
  binaryauthorization.googleapis.com 

3. Membangun Image dengan Cloud Build

Di bagian ini, Anda akan membuat pipeline build otomatis yang akan membangun image container, memindainya, lalu mengevaluasi hasilnya. Jika tidak ditemukan kerentanan KRITIS, image akan dikirim ke repositori. Jika ditemukan kerentanan KRITIS, build akan gagal dan keluar.

Sediakan akses untuk Akun Layanan Cloud Build

Cloud Build memerlukan hak untuk mengakses API pemindaian on-demand. Berikan akses dengan perintah berikut.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/iam.serviceAccountUser"
        
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/ondemandscanning.admin"

Buat dan ubah menjadi direktori kerja

mkdir vuln-scan && cd vuln-scan

Tentukan gambar sampel

Buat file bernama Dockerfile dengan konten berikut.

cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a

# System
RUN apt update && apt install python3-pip -y

# App
WORKDIR /app
COPY . ./

RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

EOF

Buat file bernama main.py dengan isi sebagai berikut

cat > ./main.py << EOF
import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    name = os.environ.get("NAME", "Worlds")
    return "Hello {}!".format(name)

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF

Membuat pipeline Cloud Build

Perintah berikut akan membuat file cloudbuild.yaml di direktori Anda yang akan digunakan untuk proses otomatis. Untuk contoh ini, langkah-langkahnya terbatas pada proses build container. Namun, dalam praktiknya, Anda harus menyertakan petunjuk dan pengujian spesifik per aplikasi selain langkah-langkah container.

Buat file dengan perintah berikut.

cat > ./cloudbuild.yaml << EOF
steps:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']


EOF

Menjalankan pipeline CI

Kirim build untuk diproses

gcloud builds submit

Meninjau Detail Build

Setelah proses build dimulai, tinjau progres di dasbor Cloud Build.

  1. Buka Cloud Build di Konsol Cloud
  2. Klik build untuk melihat isinya

4. Artifact Registry untuk Container

Buat Repositori Artifact Registry

Di lab ini, Anda akan menggunakan Artifact Registry untuk menyimpan dan memindai image. Buat repositori dengan perintah berikut.

gcloud artifacts repositories create artifact-scanning-repo \
  --repository-format=docker \
  --location=us-central1 \
  --description="Docker repository"

Konfigurasi Docker untuk menggunakan kredensial gcloud Anda saat mengakses Artifact Registry.

gcloud auth configure-docker us-central1-docker.pkg.dev

Mengupdate pipeline Cloud Build

Ubah pipeline build untuk mengirim image yang dihasilkan ke Artifact Registry

cat > ./cloudbuild.yaml << EOF
steps:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']

# push to artifact registry
- id: "push"
  name: 'gcr.io/cloud-builders/docker'
  args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']

images:
  - us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF

Menjalankan pipeline CI

Kirim build untuk diproses

gcloud builds submit

5. Memanfaatkan pemindaian kerentanan Otomatis

Pemindaian artefak dipicu secara otomatis setiap kali Anda mengirim image baru ke Artifact Registry atau Container Registry. Informasi kerentanan terus diperbarui ketika kerentanan baru ditemukan. Di bagian ini, Anda akan meninjau image yang baru saja dibuat dan dikirim ke Artifact Registry serta mempelajari hasil kerentanan.

Meninjau Detail Image

Setelah proses build sebelumnya selesai, tinjau hasil image dan Kerentanan di dasbor Artifact Registry.

  1. Buka Artifact Registry di Konsol Cloud
  2. Klik artifact-scanning-repo untuk melihat isinya
  3. Klik detail gambar
  4. Klik ringkasan terbaru gambar Anda
  5. Setelah pemindaian selesai, klik tab kerentanan untuk image tersebut

Dari tab vulnerabilities, Anda akan melihat hasil pemindaian otomatis untuk image yang baru saja Anda buat.

361be7b3bf293fca.png

Otomatisasi pemindaian diaktifkan secara default. Jelajahi Setelan Artifact Registry untuk melihat cara menonaktifkan/mengaktifkan pemindaian otomatis.

6. Mengonfigurasi pemindaian on-demand

Ada berbagai skenario yang mengharuskan Anda melakukan pemindaian sebelum mengirim image ke repositori. Sebagai contoh, developer container dapat memindai image dan memperbaiki masalahnya, sebelum mengirimkan kode ke kontrol sumber. Dalam contoh di bawah, Anda akan membuat dan menganalisis image secara lokal sebelum mengambil tindakan berdasarkan hasilnya.

Mem-build Image

Pada langkah ini, Anda akan menggunakan Docker lokal untuk mem-build image ke cache lokal Anda.

docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .

Memindai gambar

Setelah image dibuat, buat permintaan pemindaian image. Hasil pemindaian disimpan di server metadata. Tugas selesai dan informasi lokasi hasilnya dapat ditemukan di server metadata.

gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --format="value(response.scan)" > scan_id.txt

Meninjau File Output

Luangkan waktu untuk meninjau output langkah sebelumnya yang disimpan dalam file scan_id.txt. Perhatikan lokasi laporan hasil pemindaian di server metadata.

cat scan_id.txt

Meninjau hasil pemindaian mendetail

Untuk melihat hasil pemindaian yang sebenarnya, gunakan perintah list-vulnerabilities di lokasi laporan yang tercantum dalam file output.

gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) 

Output berisi sejumlah besar data tentang semua kerentanan dalam image.

Menandai Masalah penting

Manusia jarang menggunakan data yang disimpan dalam laporan secara langsung. Biasanya, hasilnya digunakan oleh proses otomatis. Gunakan perintah di bawah untuk membaca detail laporan dan membuat log jika ditemukan kerentanan KRITIS:

export SEVERITY=CRITICAL

gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi

Output dari perintah ini adalah

Failed vulnerability check for CRITICAL level

7. Memindai di CICD dengan Cloud Build

Sediakan akses untuk Akun Layanan Cloud Build

Cloud Build memerlukan hak untuk mengakses API pemindaian on-demand. Berikan akses dengan perintah berikut.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/iam.serviceAccountUser"
        
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/ondemandscanning.admin"

Mengupdate pipeline Cloud Build

Perintah berikut akan membuat file cloudbuild.yaml di direktori Anda yang akan digunakan untuk proses otomatis. Untuk contoh ini, langkah-langkahnya terbatas pada proses build container. Namun, dalam praktiknya, Anda harus menyertakan petunjuk dan pengujian spesifik per aplikasi selain langkah-langkah container.

Buat file dengan perintah berikut.

cat > ./cloudbuild.yaml << EOF
steps:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']

#Run a vulnerability scan at _SECURITY level
- id: scan
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    (gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --location us \
    --format="value(response.scan)") > /workspace/scan_id.txt

#Analyze the result of the scan
- id: severity check
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
      gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
      --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
      then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi

#Retag
- id: "retag"
  name: 'gcr.io/cloud-builders/docker'
  args: ['tag',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']


#pushing to artifact registry
- id: "push"
  name: 'gcr.io/cloud-builders/docker'
  args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']

images:
  - us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF

Menjalankan pipeline CI

Kirimkan build untuk diproses guna memverifikasi bahwa proses build gagal saat ditemukan kerentanan dengan tingkat keparahan KRITIS.

gcloud builds submit

Meninjau Kegagalan Build

Build yang baru saja Anda kirimkan akan gagal karena image berisi kerentanan KRITIS.

Tinjau kegagalan build di halaman Histori Cloud Build

Memperbaiki Kerentanan

Perbarui Dockerfile agar menggunakan image dasar yang tidak berisi kerentanan KRITIS.

Timpa Dockerfile agar menggunakan image Debian 10 dengan perintah berikut

cat > ./Dockerfile << EOF
from python:3.8-slim  

# App
WORKDIR /app
COPY . ./

RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0

CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app

EOF

Jalankan proses CI dengan gambar yang bagus

Kirimkan build untuk diproses guna memverifikasi bahwa build akan berhasil jika tidak ditemukan kerentanan dengan tingkat keparahan KRITIS.

gcloud builds submit

Meninjau Keberhasilan Build

Build yang baru saja Anda kirimkan akan berhasil karena image yang diperbarui tidak berisi kerentanan KRITIS.

Tinjau keberhasilan build di halaman Histori Cloud Build

Meninjau Hasil pemindaian

Meninjau image yang berhasil di Artifact Registry

  1. Buka Artifact Registry di Konsol Cloud
  2. Klik artifact-scanning-repo untuk melihat isinya
  3. Klik detail gambar
  4. Klik ringkasan terbaru gambar Anda
  5. Klik tab kerentanan untuk image tersebut

8. Selamat!

Selamat, Anda telah menyelesaikan codelab!

Yang telah kita bahas:

  • Membangun Image dengan Cloud Build
  • Artifact Registry untuk Container
  • Memanfaatkan pemindaian kerentanan Otomatis
  • Mengonfigurasi pemindaian on-demand
  • Memindai di CICD dengan Cloud Build

Langkah berikutnya:

Pembersihan

Agar tidak menimbulkan 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

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Terakhir diperbarui: 21/3/23