Buat pengesahan dengan Voucher

Tutorial ini menjelaskan cara menyiapkan dan menggunakan Voucher untuk membuat pengesahan Otorisasi Biner.

Ringkasan Voucher

Voucher adalah alat open source yang menjalankan serangkaian pemeriksaan pada image container sebelum membuat attestations Otorisasi Biner untuk gambar. {i>Voucher<i} memiliki komponen klien dan server. Anda menjalankan Voucher Client sebagai langkah tambahan dalam pipeline build, setelah langkah yang mem-build image. Saat langkah build Klien Voucher berjalan, image akan dikirimkan ke Server Voucher yang akan melakukan pemeriksaan. Anda menentukan pemeriksaan yang dijalankan Voucher, beserta kriteria lainnya, di file konfigurasi Server Voucher.

Tutorial ini menunjukkan cara menggunakan pemeriksaan snakeoil Voucher untuk menguji kerentanan dalam gambar. Anda dapat mengaktifkan pemeriksaan di file konfigurasi dengan menetapkan opsi fail-on ke ambang batas kerentanan, seperti yang akan ditampilkan dalam tutorial ini.

Setelah pemeriksaan snakeoil selesai, jika semua kerentanan yang teridentifikasi berada di bawah batas, Server Voucher akan membuat pengesahan Otorisasi Biner untuk image. Jika salah satu kerentanan yang teridentifikasi memenuhi atau melampaui ambang batas, Server Voucher tidak akan membuat pengesahan.

Pada waktu deployment image container, tanpa pengesahan terverifikasi, pelaksana Otorisasi Biner tidak mengizinkan image di-deploy.

Tujuan

Dalam panduan ini, Anda akan melakukan hal-hal berikut:

  1. Siapkan Server Voucher di Cloud Run.
  2. Siapkan Klien Voucher.
  3. Menggunakan Voucher di contoh pipeline build.

Biaya

Panduan ini menggunakan produk Google Cloud berikut.

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service
  • Cloud Run

Gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan.

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. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

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

  4. Aktifkan API Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.

    Mengaktifkan API

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

    gcloud init
  7. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

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

  9. Aktifkan API Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.

    Mengaktifkan API

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

    gcloud init
  12. Sebaiknya Anda menyiapkan Otorisasi Biner dengan Google Kubernetes Engine. Tutorial ini menjelaskan cara membuat pengesahan. Agar dapat menggunakan penerapan waktu deployment untuk memverifikasi pengesahan dan men-deploy image terkait, Otorisasi Biner harus disiapkan. Pastikan Anda mengonfigurasi kebijakan agar mewajibkan pengesahan. Anda dapat mengonfigurasi kebijakan ini di Google Cloud Console atau di command line.
  13. Tentukan project Google Cloud Anda di variabel lingkungan.

      export PROJECT_ID=PROJECT_ID
    

    Ganti PROJECT_ID dengan project ID Anda.

  14. Tetapkan project ID untuk perintah gcloud:

    gcloud config set project ${PROJECT_ID}

  15. Tentukan nomor project dalam variabel lingkungan untuk langkah-langkah mendatang:

    export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \
      --format='value(project_number)')

Siapkan Server Voucher

Pada langkah-langkah berikut, Anda dapat menyiapkan Server Voucher.

Membuat kunci penandatanganan Cloud Key Management Service

Di bagian ini, Anda membuat kunci yang digunakan Server Voucher untuk membuat pengesahan Otorisasi Biner.

  1. Buat key ring:

    gcloud kms keyrings create KEY_RING\
       --location global
    

    Ganti KEY_RING dengan nama key ring, seperti voucher-key-ring.

  2. Buat kunci penandatanganan:

    gcloud kms keys create KEY_NAME \
      --keyring KEY_RING \
      --location global \
      --purpose "asymmetric-signing" \
      --default-algorithm "rsa-sign-pkcs1-4096-sha512"
    

    Ganti KEY_NAME dengan nama nama kunci, seperti voucher-key.

  3. Simpan ID resource versi kunci Cloud Key Management Service:

    export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    
  4. Berikan peran cloudkms.signer ke akun layanan mesin runtime Compute Engine.

    Pada langkah ini, Anda memberikan peran cloudkms.signer ke akun layanan yang menjalankan Voucher Server. Hal ini memungkinkan Server Voucher menandatangani pengesahan dengan kunci Cloud Key Management Service. Untuk melakukannya, jalankan perintah berikut:

    gcloud kms keys add-iam-policy-binding\
      KEY_NAME --keyring=KEY_RING\
      --location=global\
      --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com\
      --role=roles/cloudkms.signer
    

Membuat catatan Artifact Analysis

Di bagian ini, Anda akan membuat catatan.

  1. Simpan ID catatan:

    export NOTE_ID=snakeoil
    
  2. Simpan URI catatan:

    export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
    
  3. Membuat payload permintaan:

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "voucher note for snakeoil check"
        }
      }
    }
    EOM
    
  4. Buat catatan:

    curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $(gcloud --project ${PROJECT_ID} auth print-access-token)"  \
      -H "x-goog-user-project: ${PROJECT_ID}" \
      --data-binary @/tmp/note_payload.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
    

Membuat dan mengonfigurasi Server Voucher

Dalam penyiapan satu kali ini, Anda akan mendapatkan, mengonfigurasi, dan mem-build image Server Voucher. Selanjutnya, Anda menyimpannya di Container Registry.

  1. Clone repositori Voucher:

    git clone https://github.com/grafeas/voucher.git
    cd voucher/
    

    Repositori ini berisi:

    • Kode sumber untuk membuat Server Voucher.
    • Kode sumber untuk membuat Klien Voucher.
    • Contoh yang menunjukkan penggunaan Voucher.
  2. Memperbarui file konfigurasi Server Voucher.

    Linux

    Buat file konfigurasi Server Voucher dari template, dengan mengganti dan dengan nilai yang Anda tentukan di atas. Anda dapat melakukannya dengan menjalankan perintah berikut:

     cat tutorials/cloudrun/config.toml.template \
        | sed -e "s?<PROJECT_ID>?${PROJECT_ID}?g" \
        | sed -e "s?<KMS_KEY_NAME>?${KMS_RESOURCE_ID}?g" \
          > tutorials/cloudrun/config.toml
    

    OS lainnya

    1. Edit file tutorials/cloudrun/config.toml.template.

      • Ganti <PROJECT_ID> dengan nilai di ${PROJECT_ID}.
      • Ganti <KMS_KEY_NAME> dengan nilai di ${KMS_RESOURCE_ID}.
    2. Simpan file sebagai tutorials/cloudrun/config.toml.

  3. Lihat file konfigurasi Server Voucher:

    cat tutorials/cloudrun/config.toml
    

    Anda akan melihat output yang berisi hal berikut:

    failon = "high"
    

    Perhatikan bahwa dalam file konfigurasi, opsi failon ditetapkan ke high. Setelan ini mengonfigurasi Server Voucher untuk melakukan pemeriksaan kerentanan pada image. Jika image berisi kerentanan dengan tingkat keparahan HIGH, pemeriksaan akan gagal dan Server Voucher tidak akan membuat pengesahan Otorisasi Biner. Untuk informasi selengkapnya tentang setelan fail-on, lihat Fail-On: Gagal pada kerentanan.

  4. Buat dan upload image penampung Server Voucher:

    Di bagian ini, Anda akan menjalankan pipeline Cloud Build yang membuat image container Server Voucher. Build tersebut juga mengupload image Server Voucher ke gcr.io/$PROJECT_ID/voucher-server.

    gcloud  builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
    

Men-deploy Server Voucher di Cloud Run

  1. Pilih wilayah.

    Untuk melihat daftar wilayah yang tersedia, buka Melihat daftar wilayah yang tersedia. Buat variabel untuk menyimpan region yang dipilih:

    export REGION=REGION
    

    Ganti REGION dengan nama wilayah tempat Anda berencana untuk men-deploy Server Voucher Anda.

  2. Men-deploy Server Voucher di Cloud Run.

    gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \
      --platform managed voucher-server \
      --region ${REGION} \
      --no-allow-unauthenticated
    

    Anda akan melihat output seperti berikut:

    Service [voucher-server] revision [voucher-server-00001-caw] has been deployed and is serving 100 percent of traffic.
    Service URL: https://voucher-server-4wjtm2amga-uc.a.run.app
    
  3. Simpan URL layanan Server Voucher:

    export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
    

Siapkan Klien Voucher

Pada langkah-langkah berikut, Anda akan menyiapkan Klien Voucher.

  1. Buat akun layanan invoker untuk Klien Voucher:

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    Ganti INVOKER_ACCOUNT_NAME dengan nama untuk akun layanan invoker, seperti voucher-invoker.

  2. Tentukan akun layanan:

    export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Berikan peran run.invoker ke akun layanan invoker untuk project Anda.

    Berikan izin pada akun layanan invoker Anda untuk memanggil Server Voucher di Cloud Run. Untuk melakukannya, masukkan perintah berikut:

    gcloud run services add-iam-policy-binding voucher-server \
      --member serviceAccount:$INVOKER_SERVICE_ACCOUNT \
      --role roles/run.invoker \
      --platform managed \
      --region ${REGION}
    
  4. Berikan peran iam.serviceAccountTokenCreator ke akun layanan invoker untuk Cloud Build.

    Di bagian ini, Anda mengizinkan akun layanan Cloud Build untuk meniru identitas akun layanan invoice, sehingga Klien Voucher memiliki izin untuk mengirim permintaan ke Server Voucher selama proses build. Untuk melakukannya, masukkan perintah berikut:

    gcloud iam service-accounts add-iam-policy-binding $INVOKER_SERVICE_ACCOUNT \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountTokenCreator
    

Menggunakan Voucher untuk memeriksa kerentanan pada image

Di bagian ini, Anda akan menjalankan dua contoh pipeline Cloud Build. Di kedua pipeline, Anda membuat gambar, lalu menggunakan Voucher untuk memeriksa kerentanannya.

Kasus kegagalan

Di bagian ini, contoh pipeline build gagal membuat pengesahan. Image yang Anda build berbasis Debian 9 berisi setidaknya satu kerentanan dengan tingkat keparahan HIGH. Opsi fail-on di Server Voucher config.toml ditetapkan untuk gagal pada kerentanan tingkat keparahan HIGH. Dalam hal ini, Server Voucher tidak membuat pengesahan Otorisasi Biner.

  1. Jalankan pipeline build:

    gcloud builds submit \
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT \
      --config=tutorials/cloudrun/examples/cloudbuild-bad.yaml tutorials/cloudrun/examples
    
  2. Telusuri log dari build terakhir untuk menemukan temuan snakeoil Voucher:

    Konsol

    1. Catat ID build dari build terakhir.

    2. Di konsol Google Cloud, buka halaman Build History.

      Buka Histori Build

    3. Di bagian Build, klik item yang berisi beberapa karakter pertama ID build.

    4. Klik Lihat Mentah.

    5. Telusuri snakeoil menggunakan browser Anda.

      Anda akan melihat output seperti berikut:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

    gcloud

    1. Simpan ID build dari build tersebut:

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Telusuri log build Anda dengan memasukkan perintah berikut:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      Outputnya akan terlihat seperti berikut:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

Kasus keberhasilan

Di bagian ini, contoh pipeline build berhasil membuat pengesahan. Semua kerentanan yang teridentifikasi diklasifikasikan lebih rendah dari nilai minimum fail-on, sehingga pemeriksaan lulus pipeline akan membuat pengesahan.

  1. Menjalankan pipeline:

    gcloud builds submit\
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT\
      --config=tutorials/cloudrun/examples/cloudbuild-good.yaml tutorials/cloudrun/examples
    
  2. Telusuri log dari build terakhir untuk menemukan temuan snakeoil Voucher:

    Konsol

    1. Catat ID build dari build terakhir.

    2. Di konsol Google Cloud, buka halaman Build History.

      Buka Histori Build

    3. Di bagian Build, klik item yang berisi beberapa karakter pertama ID build.

    4. Klik Lihat Mentah.

    5. Telusuri snakeoil menggunakan browser Anda.

      Anda akan melihat output seperti berikut:

      "name":"snakeoil","success":true,"attested":true
      

    gcloud

    1. Simpan ID build dari build terakhir:

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Telusuri log build Anda dengan memasukkan perintah berikut:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      Outputnya akan terlihat seperti berikut:

      "name":"snakeoil","success":true,"attested":true
      

Pembersihan

Untuk membersihkan resource yang digunakan dalam dokumen ini, Anda dapat menghapus project dengan cara berikut:

gcloud projects delete ${PROJECT_ID}

Membuat attestor

Untuk membuat kebijakan yang memerlukan pengesahan yang Anda buat menggunakan metode yang dijelaskan dalam panduan ini, Anda harus membuat attestor terlebih dahulu.

Untuk membuat attestor, lakukan hal berikut:

  1. Ambil materi kunci publik dari kunci Cloud KMS yang Anda buat sebelumnya dalam panduan ini:

    gcloud kms keys versions get-public-key 1 \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location global \
    --output-file OUTPUT_PATH
    
    • KEY_NAME: adalah nama kunci
    • KEY_RING: nama key ring
    • OUTPUT_PATH: jalur file—misalnya, my-key.pem
  2. Buat attestor menggunakan materi kunci publik dalam file dan catatan yang Anda buat sebelumnya dalam panduan ini. Anda dapat membuat attestor melalui Google Cloud Console atau gcloud CLI.

  3. Buat kebijakan yang memerlukan pengesahan dan berikan attestor yang Anda buat di bagian ini. Anda dapat membuat kebijakan melalui Google Cloud Console atau gcloud CLI

Membuat pengesahan

Untuk membuat pengesahan menggunakan attestor, lihat Membuat pengesahan menggunakan Cloud KMS.

Langkah selanjutnya