Tutorial ini menunjukkan cara mengonfigurasi dan menguji kebijakan Otorisasi Biner yang memerlukan attestations. Jenis kebijakan ini mengamankan supply chain software berbasis container Anda dengan memverifikasi bahwa image container memiliki pengesahan yang ditandatangani sebelum mengizinkan deployment image.
Pada waktu deployment, Otorisasi Biner menggunakan attestor untuk memverifikasi tanda tangan digital di attestations. Pengesahan dibuat oleh penandatangan, biasanya sebagai bagian dari pipeline continuous integration (CI).
Dalam tutorial ini, cluster GKE, pengesahan, dan attestor semuanya berada dalam satu project. Konfigurasi project tunggal sebagian besar berguna untuk menguji atau bereksperimen dengan layanan. Untuk contoh yang lebih nyata, lihat konfigurasi multi-project.
Langkah-langkah di bawah ini menjelaskan tugas yang Anda lakukan pada command line. Untuk mengikuti langkah-langkah ini menggunakan Google Cloud Console, lihat Mulai menggunakan konsol Google Cloud.
Tujuan
Dalam tutorial ini, Anda akan mempelajari cara:
- Buat cluster Google Kubernetes Engine (GKE) dengan Otorisasi Biner yang diaktifkan
- Membuat attestor yang digunakan petugas Otorisasi Biner untuk memverifikasi tanda tangan pada pengesahan
- Mengonfigurasi kebijakan yang memerlukan pengesahan
- Membuat pasangan kunci kriptografis untuk menandatangani pengesahan dan kemudian memverifikasinya
- Menandatangani ringkasan image container, membuat tanda tangan
- Membuat pengesahan menggunakan tanda tangan
- Menguji kebijakan dengan men-deploy image container ke GKE
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
- Artifact Registry atau Container Registry
- Otorisasi Biner
- GKE
- Opsional: Cloud Key Management Service
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
- Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
- Menginstal Google Cloud CLI.
-
Untuk initialize gcloud CLI, jalankan perintah berikut:
gcloud init
- Instal
kubectl
untuk berinteraksi dengan GKE.
Aktifkan Otorisasi Biner
Menetapkan project default
Langkah pertama adalah menetapkan project Google Cloud default yang digunakan oleh perintah gcloud
:
PROJECT_ID=PROJECT_ID gcloud config set project ${PROJECT_ID}
dengan PROJECT_ID adalah nama project Anda.
Mengaktifkan API yang diperlukan
Aktifkan API untuk:
Container Registry
gcloud --project=${PROJECT_ID} \ services enable\ container.googleapis.com\ containerregistry.googleapis.com\ binaryauthorization.googleapis.com
Artifact Registry
gcloud --project=${PROJECT_ID} \ services enable\ container.googleapis.com\ artifactregistry.googleapis.com\ binaryauthorization.googleapis.com
Membuat cluster yang mengaktifkan Otorisasi Biner
Membuat cluster
Buat cluster GKE dengan Otorisasi Biner yang diaktifkan. Ini adalah cluster tempat Anda ingin menjalankan image container yang telah di-deploy. Saat membuat cluster, Anda meneruskan flag --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
ke
perintah gcloud container clusters create
.
Untuk membuat cluster, ikuti langkah-langkah berikut:
gcloud container clusters create \ --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \ --zone us-central1-a \ test-cluster
Di sini, Anda membuat cluster bernama test-cluster
di
zona GKE us-central1-a
.
Konfigurasi kubectl
Anda juga harus mengupdate file kubeconfig
lokal untuk penginstalan
kubectl
. Langkah ini memberikan kredensial dan informasi endpoint yang diperlukan untuk mengakses cluster di GKE.
Untuk mengupdate file kubeconfig
lokal:
gcloud container clusters get-credentials \ --zone us-central1-a \ test-cluster
Lihat kebijakan default
Kebijakan di Otorisasi Biner adalah serangkaian aturan yang mengatur deployment image container. Anda dapat memiliki satu kebijakan per project. Secara default, kebijakan ini dikonfigurasi untuk mengizinkan semua image container di-deploy.
Dengan Otorisasi Biner, Anda dapat mengekspor dan mengimpor file kebijakan dalam format YAML. Format ini mencerminkan struktur kebijakan saat disimpan oleh
layanan. Saat mengonfigurasi kebijakan menggunakan perintah gcloud
, Anda akan mengedit file
ini.
Untuk melihat kebijakan default, ekspor file YAML kebijakan:
gcloud container binauthz policy export
Secara default, file tersebut memiliki konten berikut:
admissionWhitelistPatterns: - namePattern: gcr.io/google_containers/* - namePattern: gcr.io/google-containers/* - namePattern: k8s.gcr.io/** - namePattern: gke.gcr.io/** - namePattern: gcr.io/stackdriver-agents/* globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_ALLOW enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/${PROJECT_ID}/policy
Daftar defaultnya berisi registry open source milik komunitas
k8s.gcr.io
yang diganti oleh registry.k8s.io
dan disimpan dalam daftar untuk kompatibilitas mundur. Registri
pengganti registry.k8s.io
tidak disertakan dalam daftar default.
Saat Anda bermigrasi dari k8s.gcr.io
, pindah ke registry yang dapat Anda kontrol atau tambahkan registry pengganti registry.k8s.io
ke daftar ini.
Di sini, aturan default ditentukan dalam node defaultAdmissionRule
.
evaluationMode
menentukan bahwa kebijakan mengizinkan semua upaya deployment image. Dalam tutorial ini, Anda akan memperbarui aturan default untuk mewajibkan pengesahan.
Untuk mengetahui informasi lebih lanjut mengenai struktur kebijakan, baca Referensi YAML Kebijakan.
Membuat attestor
attestor adalah otoritas verifikasi yang digunakan oleh pihak berwenang Otorisasi Biner pada waktu deployment untuk memutuskan apakah akan mengizinkan GKE men-deploy image container bertanda tangan yang sesuai. Attestor berisi kunci publik dan biasanya dikelola oleh personel di organisasi Anda yang bertanggung jawab atas keamanan supply chain software.
Membuat attestor mengharuskan Anda untuk:
- Buat catatan di Artifact Analysis untuk menyimpan metadata tepercaya yang digunakan dalam proses otorisasi
- Buat attestor itu sendiri di Otorisasi Biner dan kaitkan catatan yang Anda buat
Untuk tutorial ini, Anda memiliki satu attestor bernama test-attestor
dan catatan Analisis Container bernama test-attestor-note
. Dalam skenario nyata, Anda dapat memiliki berapa pun attestor, yang masing-masing mewakili pihak yang berpartisipasi dalam proses otorisasi untuk image container.
Membuat catatan Artifact Analysis
Tetapkan variabel yang menyimpan nama attestor dan catatan Artifact Analysis:
ATTESTOR_NAME=test-attestor NOTE_ID=test-attestor-note
Ganti:
- test-attestor: nama attestor pilihan Anda.
- attestor-note: nama catatan attestor pilihan Anda.
Buat file JSON di
/tmp/note_payload.json
yang mendeskripsikan catatan Container Analysis:cat > /tmp/note_payload.json << EOM { "name": "projects/${PROJECT_ID}/notes/${NOTE_ID}", "attestation": { "hint": { "human_readable_name": "Attestor Note" } } } EOM
Buat catatan dengan mengirim permintaan HTTP ke Artifact Analysis REST API:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/note_payload.json \ "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
Pastikan bahwa catatan telah dibuat:
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"
Membuat attestor
Sekarang, Anda dapat membuat attestor:
Buat attestor di Otorisasi Biner:
gcloud container binauthz attestors create ${ATTESTOR_NAME} \ --attestation-authority-note=${NOTE_ID} \ --attestation-authority-note-project=${PROJECT_ID}
Pastikan bahwa attestor sudah dibuat:
gcloud container binauthz attestors list
Attestor yang Anda buat belum dapat digunakan tanpa pasangan kunci PKIX terkait, yang Anda buat di bawah.
Membuat pasangan kunci
Otorisasi Biner menggunakan kunci kriptografis untuk memverifikasi identitas penanda tangan dengan aman. Tindakan ini memastikan bahwa hanya image container yang diizinkan yang dapat di-deploy. Pasangan kunci terdiri dari kunci pribadi dan kunci publik. Penanda tangan menggunakan kunci pribadi untuk menandatangani ringkasan image container, yang menghasilkan tanda tangan yang kemudian disimpan dalam pengesahan. Kunci publik disimpan di attestor. Pada waktu deployment, pemeriksa Otorisasi Biner menggunakan kunci publik attestor untuk memverifikasi tanda tangan dalam pengesahan sebelum mengizinkan container di-deploy.
Dalam tutorial ini, Anda menggunakan format Public-Key Infrastructure (X.509) (PKIX) untuk kunci kriptografis. Tutorial ini menggunakan Elliptic Curve Digital Signing Algorithm (ECDSA) yang direkomendasikan untuk menghasilkan pasangan kunci PKIX. Anda juga dapat menggunakan kunci RSA atau PGP untuk penandatanganan.
Tujuan dan algoritma utama untuk informasi selengkapnya tentang algoritma penandatanganan.
Kunci yang dihasilkan dan disimpan oleh Cloud Key Management Service (Cloud KMS) sudah mematuhi PKIX. Baca artikel Membuat attestor menggunakan gcloud CLI untuk mengetahui informasi lebih lanjut tentang penggunaan kunci PKIX dan Cloud KMS.
PKIX (Cloud KMS)
Untuk membuat pasangan kunci di Cloud KMS, lakukan langkah berikut:
Siapkan variabel lingkungan yang diperlukan untuk membuat pasangan kunci.
KMS_KEY_PROJECT_ID=${PROJECT_ID} KMS_KEYRING_NAME=my-binauthz-keyring KMS_KEY_NAME=my-binauthz-kms-key-name KMS_KEY_LOCATION=global KMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=ec-sign-p256-sha256 KMS_PROTECTION_LEVEL=software KMS_KEY_VERSION=1
Untuk membuat keyring, jalankan perintah berikut:
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location ${KMS_KEY_LOCATION}
Untuk membuat kunci, jalankan perintah berikut:
gcloud kms keys create ${KMS_KEY_NAME} \ --location ${KMS_KEY_LOCATION} \ --keyring ${KMS_KEYRING_NAME} \ --purpose ${KMS_KEY_PURPOSE} \ --default-algorithm ${KMS_KEY_ALGORITHM} \ --protection-level ${KMS_PROTECTION_LEVEL}
Untuk menambahkan kunci publik ke attestor, jalankan perintah berikut:
gcloud --project="${PROJECT_ID}" \ container binauthz attestors public-keys add \ --attestor="${ATTESTOR_NAME}" \ --keyversion-project="${KMS_KEY_PROJECT_ID}" \ --keyversion-location="${KMS_KEY_LOCATION}" \ --keyversion-keyring="${KMS_KEYRING_NAME}" \ --keyversion-key="${KMS_KEY_NAME}" \ --keyversion="${KMS_KEY_VERSION}"
Dapatkan ID kunci publik dari attestor sebagai berikut:
Anda dapat melihat ID kunci publik kapan saja menggunakan perintah:
gcloud container binauthz attestors describe <var>ATTESTOR_NAME</var>
.Untuk menyimpan ID kunci publik Anda dalam variabel lingkungan, masukkan perintah ini:
PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \ --format='value(userOwnedGrafeasNote.publicKeys[0].id)' --project ${PROJECT_ID})
PKIX (kunci lokal)
Untuk menghasilkan pasangan kunci PKIX, ikuti langkah-langkah berikut:
Buat kunci pribadi:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
Ekstrak kunci publik dari kunci pribadi:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
Tambahkan kunci publik ke attestor.
Sekarang, tambahkan kunci publik yang Anda ekspor ke attestor agar dapat digunakan oleh Otorisasi Biner untuk verifikasi identitas:
gcloud --project="${PROJECT_ID}" \ beta container binauthz attestors public-keys add \ --attestor="${ATTESTOR_NAME}" \ --pkix-public-key-file=${PUBLIC_KEY_FILE} \ --pkix-public-key-algorithm=ecdsa-p256-sha256
Simpan ID kunci publik.
Untuk menyimpan ID kunci publik, Anda dapat menyalinnya dari output
public-keys add
di atas. Untuk melihat ID kunci publik attestor setelah menambahkannya ke attestor, gunakangcloud container binauthz attestors describe ${ATTESTOR_NAME}
:PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \ --format='value(userOwnedGrafeasNote.publicKeys[0].id)')
Mengonfigurasi kebijakan
Sekarang, Anda dapat mengonfigurasi kebijakan. Pada langkah ini, Anda akan mengekspor file YAML kebijakan ke sistem lokal dan mengubah aturan default sehingga memerlukan pengesahan oleh attestor yang Anda tetapkan di atas.
Untuk mengonfigurasi kebijakan, ikuti langkah-langkah berikut:
Buat file kebijakan baru yang mengizinkan image sistem yang dikelola Google, setel
evaluationMode
keREQUIRE_ATTESTATION
, dan tambahkan node bernamarequireAttestationsBy
yang merujuk attestor yang Anda buat:cat > /tmp/policy.yaml << EOM globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: REQUIRE_ATTESTATION enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG requireAttestationsBy: - projects/${PROJECT_ID}/attestors/${ATTESTOR_NAME} name: projects/${PROJECT_ID}/policy EOM
Impor file YAML kebijakan ke Otorisasi Biner:
gcloud container binauthz policy import /tmp/policy.yaml
Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi kebijakan, baca Mengonfigurasi kebijakan menggunakan gcloud CLI.
Menguji kebijakan
Anda dapat menguji kebijakan yang dikonfigurasi di atas dengan mencoba men-deploy contoh image container ke cluster. Kebijakan ini akan memblokir deployment karena pengesahan yang diperlukan belum dibuat.
Untuk tutorial ini, Anda dapat menggunakan image contoh dari Container Registry dan Artifact Registry. Image dari Container Registry terletak di jalur gcr.io/google-samples/hello-app:1.0
. Image dari Artifact Registry terletak di jalur us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
.
Kedua jalur berisi image publik yang dibuat oleh Google yang berisi aplikasi
sampel "Hello,
World!".
Pertama, coba deploy image:
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
Sekarang, verifikasi bahwa deployment diblokir oleh Otorisasi Biner:
kubectl get pods
Perintah tersebut mencetak pesan berikut, yang menunjukkan bahwa image tidak di-deploy:
No resources found.
Anda bisa mendapatkan detail deployment lebih lanjut:
kubectl get event --template \ '{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}\{{.message}}{{"\n"}}{{end}}'
Anda akan melihat respons yang terlihat seperti berikut:
FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Image IMAGE_NAME denied by attestor ATTESTOR_NAME: No attestations found
Dalam output ini:
- POD_NAME: nama Pod.
- IMAGE_NAME: nama image.
- ATTESTOR_NAME: nama attestor.
Pastikan untuk menghapus deployment agar Anda dapat melanjutkan ke langkah berikutnya:
kubectl delete deployment hello-server
Membuat pengesahan
Pengesahan adalah dokumen digital yang dibuat oleh penandatangan yang menyatakan bahwa GKE diizinkan untuk men-deploy image container terkait. Proses pembuatan pengesahan terkadang disebut "menandatangani gambar". Penanda tangan dapat berupa orang atau, lebih sering, proses otomatis yang berjalan saat image container di-build. Tanda tangan dibuat menggunakan kunci pribadi dari pasangan kunci. Pada waktu deployment, penegakan Otorisasi Biner menggunakan kunci publik attestor untuk memverifikasi tanda tangan dalam pengesahan.
Dalam tutorial ini, pengesahan Anda hanya menyatakan bahwa Anda memberikan otorisasi pada image untuk deployment.
Untuk membuat pengesahan, ikuti langkah-langkah berikut:
Tetapkan variabel yang menyimpan jalur registry dan ringkasan gambar:
Container Registry
IMAGE_PATH="gcr.io/google-samples/hello-app" IMAGE_DIGEST="sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}
Artifact Registry
IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app" IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}
Untuk membuat pengesahan, lakukan hal berikut:
Cloud KMS PKIX
Untuk membuat pengesahan menggunakan kunci Cloud KMS, jalankan perintah berikut:
gcloud beta container binauthz attestations sign-and-create \ --project="${PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="${ATTESTOR_NAME}" \ --attestor-project="${PROJECT_ID}" \ --keyversion-project="${KMS_KEY_PROJECT_ID}" \ --keyversion-location="${KMS_KEY_LOCATION}" \ --keyversion-keyring="${KMS_KEYRING_NAME}" \ --keyversion-key="${KMS_KEY_NAME}" \ --keyversion="${KMS_KEY_VERSION}"
PKIX (kunci lokal)
Untuk membuat pengesahan menggunakan kunci lokal, lakukan langkah berikut:
Buat payload pengesahan:
gcloud container binauthz create-signature-payload \ --artifact-url=${IMAGE_TO_ATTEST} > /tmp/generated_payload.json
File JSON payload memiliki konten berikut:
{ "critical": { "identity": { "docker-reference": "gcr.io/google-samples/hello-app" }, "image": { "docker-manifest-digest": "sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea 882eb722c3be4" }, "type": "Google cloud binauthz container signature" } }
Untuk menandatangani payload dengan kunci pribadi PKIX dan membuat file tanda tangan, jalankan perintah berikut:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
File tanda tangan adalah versi file JSON payload yang ditandatangani yang sebelumnya Anda buat dalam panduan ini.
Buat dan validasi pengesahan:
gcloud container binauthz attestations create \ --project="${PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validate
Ganti
PUBLIC_KEY_ID
dengan ID kunci publik yang Anda temukan di Membuat pasangan kunci PKIX di atas.Flag
validate
memeriksa apakah pengesahan dapat diverifikasi oleh attestor yang Anda konfigurasi di kebijakan.
Pastikan bahwa pengesahan telah dibuat:
gcloud container binauthz attestations list \ --attestor=$ATTESTOR_NAME --attestor-project=$PROJECT_ID
Untuk informasi selengkapnya tentang cara membuat pengesahan, lihat Membuat Pengesahan.
Menguji ulang kebijakan
Sekali lagi, uji kebijakan dengan men-deploy contoh image container ke cluster.
Kali ini, Anda harus men-deploy image menggunakan ringkasan, bukan tag seperti 1.0
atau latest
, karena Otorisasi Biner akan menggunakan jalur dan ringkasan image untuk mencari pengesahan. Di sini, Otorisasi Biner memungkinkan image di-deploy karena pengesahan yang diperlukan telah dibuat.
Untuk men-deploy image, ikuti langkah-langkah berikut:
kubectl run hello-server --image ${IMAGE_TO_ATTEST} --port 8080
Untuk memastikan bahwa image telah di-deploy:
kubectl get pods
Perintah tersebut mencetak pesan yang mirip dengan yang berikut, yang menunjukkan bahwa deployment berhasil:
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
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.
Hapus cluster yang Anda buat di GKE:
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster
Langkah selanjutnya
- Pelajari Otorisasi Biner lebih lanjut
- Pelajari konsep utama yang digunakan dalam Otorisasi Biner
- Gunakan attestor
built-by-cloud-build
untuk men-deploy image yang di-build hanya oleh Cloud Build (Pratinjau). - Mengaktifkan mode uji coba untuk menonaktifkan penerapan
- Menggunakan akses darurat untuk mengabaikan penegakan kebijakan