Membuat 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 pengesahan Otorisasi Biner untuk image tersebut. Voucher 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, langkah tersebut akan mengirimkan image ke Server Voucher, yang 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 mengaktifkan pemeriksaan dalam file konfigurasi dengan menetapkan opsi fail-on ke nilai minimum kerentanan, seperti yang ditunjukkan nanti dalam tutorial ini.

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

Pada waktu deployment image container, tanpa pengesahan terverifikasi, penegak Binary Authorization tidak mengizinkan image di-deploy.

Tujuan

Dalam panduan ini, Anda akan melakukan hal berikut:

  1. Siapkan Server Voucher di Cloud Run.
  2. Siapkan Klien Voucher.
  3. Menggunakan Voucher dalam 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

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

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  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. Untuk menggunakan penerapan waktu deployment guna memverifikasi pengesahan dan men-deploy image terkait, Otorisasi Biner harus disiapkan. Pastikan Anda mengonfigurasi kebijakan untuk memerlukan pengesahan. Anda dapat mengonfigurasi kebijakan di Konsol Google Cloud atau di command line.
  13. Tentukan project Google Cloud Anda dalam 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 selanjutnya:

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

Menyiapkan Server Voucher

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

Membuat kunci penandatanganan Cloud Key Management Service

Di bagian ini, Anda akan 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 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 akan memberikan peran cloudkms.signer ke akun layanan yang menjalankan Server Voucher. Hal ini memungkinkan Server Voucher untuk 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. Buat 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}"
    

Mem-build dan mengonfigurasi Server Voucher

Dalam penyiapan satu kali ini, Anda akan mendapatkan, mengonfigurasi, dan mem-build image Server Voucher. Kemudian, 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 mem-build Server Voucher.
    • Kode sumber untuk mem-build Klien Voucher.
    • Contoh yang menunjukkan penggunaan Voucher.
  2. Perbarui file konfigurasi Server Voucher.

    Linux

    Buat file konfigurasi Server Voucher dari template, dengan mengganti dan dengan nilai yang Anda tentukan di atas. Anda 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 gambar. Jika image berisi kerentanan dengan tingkat keparahan HIGH, pemeriksaan akan gagal dan Server Voucher tidak akan membuat pengesahan Binary Authorization. Untuk mengetahui informasi selengkapnya tentang setelan fail-on, lihat Fail-On: Gagal pada kerentanan.

  4. Build dan upload image container Server Voucher:

    Di bagian ini, Anda akan menjalankan pipeline Cloud Build yang mem-build image container Server Voucher. Build 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 region yang tersedia, lihat Melihat daftar region yang tersedia. Buat variabel untuk menyimpan region yang Anda pilih:

    export REGION=REGION
    

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

  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)')
    

Menyiapkan 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 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 pemanggil untuk Cloud Build.

    Di bagian ini, Anda akan memberikan izin akun layanan Cloud Build untuk meniru identitas akun layanan pemanggil sehingga Klien Voucher memiliki izin untuk mengirim permintaan ke Server Voucher selama 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 image

Di bagian ini, Anda akan menjalankan dua contoh pipeline Cloud Build. Di kedua pipeline, Anda mem-build image, lalu menggunakan Voucher untuk memeriksa kerentanan.

Kasus kegagalan

Di bagian ini, contoh pipeline build gagal membuat pengesahan. Image yang Anda build berdasarkan Debian 9 berisi setidaknya satu kerentanan dengan tingkat keparahan HIGH. Opsi fail-on di Voucher Server 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 Voucher snakeoil:

    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 View Raw.

    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:

      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 diidentifikasi diklasifikasikan lebih rendah dari nilai minimum fail-on sehingga pemeriksaan lulus pipeline yang 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 Voucher snakeoil:

    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 View Raw.

    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 sebagai 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 pengesah terlebih dahulu.

Untuk membuat pengautentikasi, 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 pengautentikasi menggunakan materi kunci publik dalam file dan catatan yang Anda buat sebelumnya dalam panduan ini. Anda dapat membuat pengautentikasi melalui konsol Google Cloud atau gcloud CLI.

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

Membuat pengesahan

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

Langkah selanjutnya