1. Pengantar
Container Analysis menyediakan pemindaian kerentanan dan penyimpanan metadata untuk container. Layanan pemindaian melakukan pemindaian kerentanan pada image di Artifact Registry dan Container Registry, lalu menyimpan metadata yang dihasilkan dan menyediakannya untuk digunakan melalui API. Penyimpanan metadata memungkinkan Anda menyimpan informasi dari berbagai sumber, termasuk pemindaian kerentanan, layanan Google Cloud, dan penyedia pihak ketiga.
Pemindaian kerentanan dapat terjadi secara otomatis atau sesuai permintaan:
- Jika pemindaian otomatis diaktifkan, pemindaian akan dipicu secara otomatis setiap kali Anda mengirim image baru ke Artifact Registry atau Container Registry. Informasi kerentanan terus diperbarui ketika kerentanan baru ditemukan.
- Jika Pemindaian On-Demand diaktifkan, Anda harus menjalankan perintah untuk memindai image lokal atau image di Artifact Registry atau Container Registry. Pemindaian On-Demand memberi Anda fleksibilitas terkait waktu pemindaian container. Misalnya, Anda dapat memindai image yang dibuat secara lokal dan memulihkan kerentanan sebelum menyimpannya di registry. Hasil pemindaian tersedia hingga 48 jam setelah pemindaian selesai, dan informasi kerentanan tidak diperbarui setelah pemindaian.
Dengan Analisis Container yang terintegrasi ke dalam pipeline CI/CD, Anda dapat membuat keputusan berdasarkan metadata tersebut. Misalnya, Anda dapat menggunakan Otorisasi Biner untuk membuat kebijakan deployment yang hanya mengizinkan deployment untuk image yang sesuai dari registry tepercaya.
Yang akan Anda pelajari
- Cara mengaktifkan pemindaian otomatis
- Cara melakukan Pemindaian On-Demand
- Cara mengintegrasikan pemindaian dalam pipeline build
- Cara menandatangani gambar yang disetujui
- Cara menggunakan pengontrol Penerimaan GKE untuk memblokir image
- Cara mengonfigurasi GKE agar hanya mengizinkan image yang disetujui dan bertanda tangan
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 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.
- 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.
Mulai Cloud Shell Editor
Lab ini dirancang dan diuji untuk digunakan dengan Editor Google Cloud Shell. Untuk mengakses editor:
- mengakses project google Anda di https://console.cloud.google.com.
- Di pojok kanan atas, klik ikon editor cloud shell

- Panel baru akan terbuka di bagian bawah jendela
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
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
3. Pemindaian 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 mengirim image ke Artifact Registry dan mempelajari hasilnya.
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
Membangun dan Mengirim Image ke AR
Gunakan Cloud Build untuk mem-build dan secara otomatis mengirim container Anda ke Artifact Registry. Perhatikan tag bad pada gambar. Hal ini akan membantu Anda mengidentifikasinya untuk langkah-langkah selanjutnya.
gcloud builds submit . -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad
Meninjau Detail Image
Setelah proses build selesai, tinjau hasil image dan Kerentanan di dasbor Artifact Registry.
- Buka Artifact Registry di Konsol Cloud
- Klik artifact-scanning-repo untuk melihat isinya
- Klik detail gambar
- Klik ringkasan terbaru gambar Anda
- 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.

Otomatisasi pemindaian diaktifkan secara default. Jelajahi Setelan Artifact Registry untuk melihat cara menonaktifkan/mengaktifkan pemindaian otomatis.
4. Pemindaian On-Demand
Ada berbagai skenario yang mengharuskan Anda menjalankan 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
5. Pemindaian Pipeline 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"
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: ['-']
#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
- Buka Artifact Registry di Konsol Cloud
- Klik artifact-scanning-repo untuk melihat isinya
- Klik detail gambar
- Klik ringkasan terbaru gambar Anda
- Klik tab kerentanan untuk image tersebut
6. Menandatangani Gambar
Membuat Catatan Attestor
Catatan Attestor hanyalah sedikit data yang berfungsi sebagai label untuk jenis tanda tangan yang diterapkan. Misalnya, satu catatan mungkin menunjukkan pemindaian kerentanan, sementara catatan lain mungkin digunakan untuk persetujuan QA. Catatan akan dirujuk selama proses penandatanganan.
Membuat catatan
cat > ./vulnz_note.json << EOM
{
"attestation": {
"hint": {
"human_readable_name": "Container Vulnerabilities attestation authority"
}
}
}
EOM
Simpan catatan
NOTE_ID=vulnz_note
curl -vvv -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @./vulnz_note.json \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
Verifikasi catatan
curl -vvv \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"
Membuat Attestor
Attestor digunakan untuk melakukan proses penandatanganan image yang sebenarnya dan akan melampirkan kemunculan catatan ke image untuk verifikasi nanti. Buat pengesah untuk digunakan nanti.
Buat Attestor
ATTESTOR_ID=vulnz-attestor
gcloud container binauthz attestors create $ATTESTOR_ID \
--attestation-authority-note=$NOTE_ID \
--attestation-authority-note-project=${PROJECT_ID}
Verifikasi Attestor
gcloud container binauthz attestors list
Perhatikan baris terakhir yang menunjukkan NUM_PUBLIC_KEYS: 0 Anda akan memberikan kunci di langkah berikutnya
Perhatikan juga bahwa Cloud Build secara otomatis membuat attestor built-by-cloud-build di project Anda saat Anda menjalankan build yang menghasilkan image. Jadi, perintah di atas menampilkan dua attestor, vulnz-attestor dan built-by-cloud-build. Setelah image berhasil di-build, Cloud Build akan otomatis menandatangani dan membuat pengesahan untuk image tersebut.
Menambahkan Peran IAM
Akun layanan Otorisasi Biner akan memerlukan hak untuk melihat catatan pengesahan. Berikan akses dengan panggilan API berikut
PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")
BINAUTHZ_SA_EMAIL="service-${PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
cat > ./iam_request.json << EOM
{
'resource': 'projects/${PROJECT_ID}/notes/${NOTE_ID}',
'policy': {
'bindings': [
{
'role': 'roles/containeranalysis.notes.occurrences.viewer',
'members': [
'serviceAccount:${BINAUTHZ_SA_EMAIL}'
]
}
]
}
}
EOM
Gunakan file untuk membuat Kebijakan IAM
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @./iam_request.json \
"https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"
Menambahkan Kunci KMS
Attestor memerlukan kunci kriptografi untuk melampirkan catatan dan memberikan tanda tangan yang dapat diverifikasi. Pada langkah ini, Anda akan membuat dan menyimpan kunci di KMS agar dapat diakses oleh Cloud Build nanti.
Pertama, tambahkan beberapa variabel lingkungan untuk mendeskripsikan kunci baru
KEY_LOCATION=global
KEYRING=binauthz-keys
KEY_NAME=codelab-key
KEY_VERSION=1
Membuat keyring untuk menyimpan sekumpulan kunci
gcloud kms keyrings create "${KEYRING}" --location="${KEY_LOCATION}"
Buat pasangan kunci penandatanganan asimetris baru untuk attestor
gcloud kms keys create "${KEY_NAME}" \
--keyring="${KEYRING}" --location="${KEY_LOCATION}" \
--purpose asymmetric-signing \
--default-algorithm="ec-sign-p256-sha256"
Anda akan melihat kunci Anda muncul di halaman KMS di Konsol Google Cloud.
Sekarang, kaitkan kunci dengan attestor Anda melalui perintah binauthz gcloud:
gcloud beta container binauthz attestors public-keys add \
--attestor="${ATTESTOR_ID}" \
--keyversion-project="${PROJECT_ID}" \
--keyversion-location="${KEY_LOCATION}" \
--keyversion-keyring="${KEYRING}" \
--keyversion-key="${KEY_NAME}" \
--keyversion="${KEY_VERSION}"
Jika Anda mencetak daftar otoritas lagi, Anda akan melihat kunci yang terdaftar:
gcloud container binauthz attestors list
Membuat Pengesahan yang Ditandatangani
Pada tahap ini, Anda telah mengonfigurasi fitur yang memungkinkan Anda menandatangani image. Gunakan Attestor yang Anda buat sebelumnya untuk menandatangani Image Container yang telah Anda kerjakan
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:latest \
--format='get(image_summary.digest)')
Sekarang, Anda dapat menggunakan gcloud untuk membuat pengesahan. Perintah ini hanya akan mengambil detail kunci yang ingin Anda gunakan untuk penandatanganan, dan image container tertentu yang ingin Anda setujui
gcloud beta container binauthz attestations sign-and-create \
--artifact-url="${CONTAINER_PATH}@${DIGEST}" \
--attestor="${ATTESTOR_ID}" \
--attestor-project="${PROJECT_ID}" \
--keyversion-project="${PROJECT_ID}" \
--keyversion-location="${KEY_LOCATION}" \
--keyversion-keyring="${KEYRING}" \
--keyversion-key="${KEY_NAME}" \
--keyversion="${KEY_VERSION}"
Dalam istilah Container Analysis, tindakan ini akan membuat kemunculan baru, dan melampirkannya ke catatan attestor Anda. Untuk memastikan semuanya berfungsi seperti yang diharapkan, Anda dapat mencantumkan pengesahan Anda
gcloud container binauthz attestations list \
--attestor=$ATTESTOR_ID --attestor-project=${PROJECT_ID}
7. Menandatangani dengan Cloud Build
Anda telah mengaktifkan Penandatanganan image dan secara manual menggunakan Attestor untuk menandatangani contoh image Anda. Dalam praktiknya, Anda akan ingin menerapkan Pengesahan selama proses otomatis, seperti pipeline CI/CD.
Di bagian ini, Anda akan mengonfigurasi Cloud Build untuk Mengesahkan image secara otomatis
Peran
Tambahkan peran Binary Authorization Attestor Viewer ke Akun Layanan Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/binaryauthorization.attestorsViewer
Tambahkan peran Cloud KMS CryptoKey Signer/Verifier ke Akun Layanan Cloud Build (Penandatanganan berbasis KMS):
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/cloudkms.signerVerifier
Tambahkan peran Container Analysis Notes Attacher ke Akun Layanan Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role roles/containeranalysis.notes.attacher
Siapkan Langkah Custom Build Cloud Build
Anda akan menggunakan langkah Custom Build di Cloud Build untuk menyederhanakan proses pengesahan. Google menyediakan langkah Custom Build ini yang berisi fungsi bantuan untuk menyederhanakan proses. Sebelum digunakan, kode untuk langkah build kustom harus dibangun ke dalam container dan dikirim ke Cloud Build. Untuk melakukannya, jalankan perintah berikut:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
cd cloud-builders-community/binauthz-attestation
gcloud builds submit . --config cloudbuild.yaml
cd ../..
rm -rf cloud-builders-community
Menambahkan langkah penandatanganan ke cloudbuild.yaml
Pada langkah ini, Anda akan menambahkan langkah pengesahan ke pipeline Cloud Build yang Anda buat sebelumnya.
- Tinjau langkah baru yang akan Anda tambahkan.
Hanya tinjau. Jangan Salin
#Sign the image only if the previous severity check passes
- id: 'create-attestation'
name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
args:
- '--artifact-url'
- 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image'
- '--attestor'
- 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
- '--keyversion'
- 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
- Ganti file cloudbuild.yaml Anda dengan pipeline lengkap yang telah diupdate.
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']
#Sign the image only if the previous severity check passes
- id: 'create-attestation'
name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
args:
- '--artifact-url'
- 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good'
- '--attestor'
- 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
- '--keyversion'
- 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good
EOF
Menjalankan Build
gcloud builds submit
Tinjau build di Histori Cloud Build
Buka Konsol Cloud ke halaman Cloud Build History, lalu tinjau build terbaru dan keberhasilan eksekusi langkah-langkah build.
8. Kebijakan Kontrol Penerimaan
Otorisasi Biner adalah fitur di GKE dan Cloud Run yang memberikan kemampuan untuk memvalidasi aturan sebelum image container diizinkan untuk dijalankan. Validasi dijalankan pada setiap permintaan untuk menjalankan image, baik dari pipeline CI/CD tepercaya maupun pengguna yang mencoba men-deploy image secara manual. Dengan kemampuan ini, Anda dapat mengamankan lingkungan runtime secara lebih efektif daripada hanya pemeriksaan pipeline CI/CD.
Untuk memahami kemampuan ini, Anda akan mengubah kebijakan GKE default untuk menerapkan aturan otorisasi yang ketat.
Buat Cluster GKE
Buat cluster GKE:
gcloud beta container clusters create binauthz \
--zone us-central1-a \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
Izinkan Cloud Build men-deploy ke cluster ini:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/container.developer"
Kebijakan Izinkan Semua
Pertama, verifikasi status kebijakan default dan kemampuan Anda untuk men-deploy image apa pun
- Meninjau kebijakan yang ada
gcloud container binauthz policy export
- Perhatikan bahwa kebijakan terkait proses penegakan kebijakan ditetapkan ke
ALWAYS_ALLOW
evaluationMode: ALWAYS_ALLOW
- Deploy Contoh untuk memverifikasi bahwa Anda dapat men-deploy apa pun
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- Verifikasi bahwa deployment berfungsi
kubectl get pods
Anda akan melihat output berikut

- Hapus deployment
kubectl delete pod hello-server
Kebijakan Tolak Semua
Sekarang, perbarui kebijakan untuk melarang semua image.
- Mengekspor kebijakan saat ini ke file yang dapat diedit
gcloud container binauthz policy export > policy.yaml
- Ubah kebijakan
Di editor teks, ubah evaluationMode dari ALWAYS_ALLOW menjadi ALWAYS_DENY.
edit policy.yaml
File YAML kebijakan akan muncul sebagai berikut:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_DENY enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
- Buka Terminal, terapkan kebijakan baru, dan tunggu beberapa detik hingga perubahan diterapkan
gcloud container binauthz policy import policy.yaml
- Mencoba deployment workload contoh
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- Deployment gagal dengan pesan berikut
Error from server (VIOLATES_POLICY): admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image gcr.io/google-samples/hello-app:1.0 denied by Binary Authorization default admission rule. Denied by always_deny admission rule
Mengembalikan kebijakan untuk mengizinkan semua
Sebelum melanjutkan ke bagian berikutnya, pastikan untuk mengembalikan perubahan kebijakan
- Ubah kebijakan
Di editor teks, ubah evaluationMode dari ALWAYS_DENY menjadi ALWAYS_ALLOW.
edit policy.yaml
File YAML kebijakan akan muncul sebagai berikut:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_ALLOW enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
- Terapkan kebijakan yang telah dikembalikan
gcloud container binauthz policy import policy.yaml
9. Memblokir Kerentanan di GKE
Di bagian ini, Anda akan menggabungkan apa yang telah Anda pelajari sejauh ini dengan menerapkan pipeline CI/CD dengan Cloud Build yang memindai image, lalu memeriksa kerentanan sebelum menandatangani image dan mencoba men-deploy. GKE akan menggunakan Otorisasi Biner untuk memvalidasi bahwa image memiliki tanda tangan dari Pemindaian kerentanan sebelum mengizinkan image berjalan.

Memperbarui Kebijakan GKE untuk Mewajibkan Pengesahan
Mewajibkan penandatanganan image oleh Attestor Anda dengan menambahkan clusterAdmissionRules ke Kebijakan BinAuth GKE Anda
Ganti kebijakan dengan konfigurasi yang diperbarui menggunakan perintah di bawah ini.
COMPUTE_ZONE=us-central1-a
cat > binauth_policy.yaml << EOM
defaultAdmissionRule:
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
evaluationMode: ALWAYS_DENY
globalPolicyEvaluationMode: ENABLE
clusterAdmissionRules:
${COMPUTE_ZONE}.binauthz:
evaluationMode: REQUIRE_ATTESTATION
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
requireAttestationsBy:
- projects/${PROJECT_ID}/attestors/vulnz-attestor
EOM
Terapkan kebijakan
gcloud beta container binauthz policy import binauth_policy.yaml
Coba deploy image yang tidak ditandatangani
Buat deskriptor deployment untuk aplikasi yang Anda buat sebelumnya menggunakan perintah berikut. Image yang digunakan di sini adalah image yang Anda buat sebelumnya yang berisi kerentanan kritis dan TIDAK berisi pengesahan yang ditandatangani.
Pengontrol penerimaan GKE perlu mengetahui image yang tepat untuk di-deploy agar dapat memvalidasi tanda tangan secara konsisten. Untuk melakukannya, Anda harus menggunakan ringkasan image, bukan tag sederhana.
Dapatkan ringkasan image yang buruk
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:bad \
--format='get(image_summary.digest)')
Gunakan ringkasan dalam konfigurasi Kubernetes
cat > deploy.yaml << EOM
apiVersion: v1
kind: Service
metadata:
name: deb-httpd
spec:
selector:
app: deb-httpd
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deb-httpd
spec:
replicas: 1
selector:
matchLabels:
app: deb-httpd
template:
metadata:
labels:
app: deb-httpd
spec:
containers:
- name: deb-httpd
image: ${CONTAINER_PATH}@${DIGEST}
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
EOM
Coba deploy aplikasi ke GKE
kubectl apply -f deploy.yaml
Tinjau workload di konsol dan perhatikan error yang menyatakan bahwa deployment ditolak:
No attestations found that were valid and signed by a key trusted by the attestor
Men-deploy image yang ditandatangani
Dapatkan ringkasan image yang buruk
CONTAINER_PATH=us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:good \
--format='get(image_summary.digest)')
Gunakan ringkasan dalam konfigurasi Kubernetes
cat > deploy.yaml << EOM
apiVersion: v1
kind: Service
metadata:
name: deb-httpd
spec:
selector:
app: deb-httpd
ports:
- protocol: TCP
port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deb-httpd
spec:
replicas: 1
selector:
matchLabels:
app: deb-httpd
template:
metadata:
labels:
app: deb-httpd
spec:
containers:
- name: deb-httpd
image: ${CONTAINER_PATH}@${DIGEST}
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
EOM
Deploy aplikasi ke GKE
kubectl apply -f deploy.yaml
Tinjau workload di konsol dan perhatikan keberhasilan deployment image.
10. Selamat!
Selamat, Anda telah menyelesaikan codelab!
Yang telah kita bahas:
- Cara mengaktifkan pemindaian otomatis
- Cara melakukan Pemindaian On-Demand
- Cara mengintegrasikan pemindaian dalam pipeline build
- Cara menandatangani gambar yang disetujui
- Cara menggunakan pengontrol Penerimaan GKE untuk memblokir image
- Cara mengonfigurasi GKE agar hanya mengizinkan image yang disetujui dan bertanda tangan
Langkah berikutnya:
- Mengamankan deployment image di 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 tersebut, atau simpan project dan hapus setiap resource.
Menghapus project
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.