Tentang codelab ini
1. Pengantar
Kerentanan perangkat lunak adalah kelemahan yang dapat menyebabkan kegagalan sistem yang tidak disengaja atau menyediakan cara bagi pihak tidak bertanggung jawab untuk menyusupi perangkat lunak 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 atau dari jarak jauh di Container Registry atau Artifact Registry.
- Container Scanning API memungkinkan Anda mengotomatiskan deteksi kerentanan OS, yang memindai setiap kali Anda mengirim image ke Container Registry atau Artifact Registry. Dengan mengaktifkan API ini, Anda juga akan mengaktifkan pemindaian paket bahasa untuk mendeteksi kerentanan Go dan Java.
On-Demand Scanning API memungkinkan Anda memindai gambar 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 dipindai untuk mendeteksi kerentanan. Anda dapat menggunakan Pemindaian On-Demand untuk memindai gambar di pipeline CI/CD sebelum memutuskan apakah akan menyimpannya dalam registry.
Yang akan Anda pelajari
Di lab ini, Anda akan:
- Membuat Image dengan Cloud Build
- Menggunakan Artifact Registry untuk Container
- Menggunakan pemindaian kerentanan otomatis
- Mengonfigurasi Pemindaian On Demand
- Menambahkan pemindaian image dalam CICD di Cloud Build
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- 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.
- 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
peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai
PROJECT_ID
). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat 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.
- 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. Untuk 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. Membuat Gambar 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 KITIS, image akan dikirim ke repositori. Jika kerentanan CRITICAL ditemukan, build akan gagal dan keluar.
Memberikan 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"
Membuat dan mengubah menjadi direktori kerja
mkdir vuln-scan && cd vuln-scan
Menentukan gambar contoh
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 konten 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 akan menyertakan petunjuk dan pengujian khusus 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
Mengirim build untuk diproses
gcloud builds submit
Meninjau Detail Build
Setelah proses build dimulai, tinjau progres di dasbor Cloud Build.
- Buka Cloud Build di Cloud Console
- Klik build untuk melihat kontennya
4. Artifact Registry untuk Container
Membuat Artifact Registry Repository
Di lab ini, Anda akan menggunakan Artifact Registry untuk menyimpan dan memindai image Anda. Buat repositori dengan perintah berikut.
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location=us-central1 \
--description="Docker repository"
Konfigurasi Docker untuk memanfaatkan kredensial gcloud saat mengakses Artifact Registry.
gcloud auth configure-docker us-central1-docker.pkg.dev
Mengupdate pipeline Cloud Build
Mengubah 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
Mengirim build untuk diproses
gcloud builds submit
5. Pemindaian kerentanan otomatis
Pemindaian artefak akan otomatis dipicu setiap kali Anda mengirim image baru ke Artifact Registry atau Container Registry. Informasi kerentanan akan terus diperbarui jika kerentanan baru ditemukan. Di bagian ini, Anda akan meninjau image yang baru saja Anda bangun dan kirim ke Artifact Registry serta menjelajahi hasil kerentanannya.
Tinjau Detail Gambar
Setelah proses build sebelumnya selesai, tinjau image dan hasil Kerentanan di dasbor Artifact Registry.
- Buka Artifact Registry di Konsol Cloud
- Klik artifact-scanning-repo untuk melihat kontennya
- Klik detail gambar
- Klik ringkasan terbaru gambar Anda
- Setelah pemindaian selesai, klik tab kerentanan untuk gambar tersebut
Dari tab kerentanan, Anda akan melihat hasil pemindaian otomatis untuk image yang baru saja Anda buat.
Mengotomatiskan pemindaian diaktifkan secara default. Jelajahi Setelan Artifact Registry untuk melihat cara menonaktifkan/mengaktifkan pemindaian otomatis.
6. Pemindaian On Demand
Ada berbagai skenario yang mungkin mengharuskan Anda melakukan pemindaian sebelum mengirim image ke repositori. Misalnya, developer container dapat memindai image dan memperbaiki masalah, sebelum mengirim kode ke kontrol sumber. Pada contoh di bawah ini, Anda akan membangun dan menganalisis gambar secara lokal sebelum menindaklanjuti hasilnya.
Membuat Gambar
Pada langkah ini, Anda akan menggunakan Docker lokal untuk membangun image ke cache lokal.
docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
Pindai gambar
Setelah image dibuat, minta pemindaian image. Hasil pemindaian disimpan di server metadata. Tugas selesai dengan lokasi hasil 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
Tinjau File Output
Luangkan waktu untuk meninjau {i>output<i} dari langkah sebelumnya yang disimpan di file pemindai_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)
Outputnya berisi data dalam jumlah yang signifikan tentang semua kerentanan pada image.
Tandai Masalah kritis
Manusia jarang menggunakan data yang disimpan dalam laporan secara langsung. Biasanya hasilnya digunakan oleh proses otomatis. Gunakan perintah di bawah ini untuk membaca detail laporan dan membuat log jika ada kerentanan KRITIS yang ditemukan
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 akan
Failed vulnerability check for CRITICAL level
7. Memindai dalam CICD dengan Cloud Build
Memberikan 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 akan menyertakan petunjuk dan pengujian khusus 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
Kirim build untuk diproses guna memverifikasi jeda build saat kerentanan tingkat keparahan KRITIS ditemukan.
gcloud builds submit
Tinjau Kegagalan Build
Build yang baru saja Anda kirimkan akan gagal karena image berisi kerentanan KRITIS.
Tinjau kegagalan build di halaman Cloud Build History
Memperbaiki Kerentanan
Update Dockerfile untuk menggunakan image dasar yang tidak memiliki kerentanan CRITICAL.
Timpa Dockerfile untuk 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
Menjalankan proses CI dengan image yang bagus
Kirim build untuk diproses guna memverifikasi bahwa build akan berhasil jika tidak ditemukan kerentanan tingkat keparahan KRITIS.
gcloud builds submit
Tinjau Keberhasilan Build
Build yang baru saja Anda kirimkan akan berhasil karena image yang diupdate tidak berisi kerentanan KRITIS.
Tinjau kesuksesan build di halaman Cloud Build History
Tinjau hasil Pemindaian
Tinjau image yang bagus di Artifact registry
- Buka Artifact Registry di Konsol Cloud
- Klik artifact-scanning-repo untuk melihat kontennya
- Klik detail gambar
- Klik ringkasan terbaru gambar Anda
- Klik tab kerentanan untuk image
8. Selamat!
Selamat, Anda telah menyelesaikan codelab!
Yang telah kita bahas:
- Membuat Gambar dengan Cloud Build
- Artifact Registry untuk Container
- Pemindaian kerentanan otomatis
- Pemindaian On Demand
- Memindai dalam CICD dengan Cloud Build
Langkah berikutnya:
- Mengamankan deployment image ke Cloud Run dan Google Kubernetes Engine | Dokumentasi Cloud Build
- Panduan memulai: Mengonfigurasi kebijakan Otorisasi Biner dengan GKE | Google Cloud
Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource, atau simpan project dan hapus resource satu per satu.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
—
Terakhir diperbarui: 21/3/23