Membuat pengautentikasi menggunakan REST API

Halaman ini menjelaskan cara membuat attestor kustom di Otorisasi Biner menggunakan REST API.

Sebagai alternatif, Anda juga dapat melakukan langkah-langkah ini menggunakan Google Cloud CLI, atau konsolGoogle Cloud . Tugas ini adalah bagian dari menyiapkan Otorisasi Biner.

Pengguna Cloud Build: Anda dapat menggunakan attestor built-by-cloud-build untuk men-deploy hanya image yang dibangun oleh Cloud Build.

Ringkasan

Attestor adalah resource Google Cloud yang digunakan Otorisasi Biner untuk memverifikasi pengesahan. Untuk mempelajari lebih lanjut pengesahan, lihat Ringkasan Otorisasi Biner.

Untuk membuat attestor, Anda harus melakukan hal berikut:

  • Buat catatan di Artifact Analysis untuk menyimpan metadata tepercaya yang digunakan dalam proses pengesahan.
  • Siapkan pasangan kunci Public-Key Infrastructure (X.509) (PKIX) yang dapat digunakan untuk memverifikasi identitas attestor. (Pasangan kunci asimetris yang dihasilkan oleh Cloud Key Management Service (Cloud KMS) dalam format yang kompatibel dengan PKIX.) Anda juga dapat menggunakan pasangan kunci PGP, bukan kunci PKIX.
  • Buat attestor itu sendiri di Otorisasi Biner, lalu kaitkan catatan dan kunci publik yang Anda buat.

Dalam penyiapan satu project, Anda membuat attestor di project Google Cloud yang sama tempat Anda mengonfigurasi kebijakan Otorisasi Biner. Dalam penyiapan multi-project, kemungkinan besar Anda memiliki project deployer tempat kebijakan Anda dikonfigurasi dan project attestor terpisah tempat attestor Anda disimpan.

Sebelum memulai

  1. Aktifkan Otorisasi Biner.

  2. Siapkan Otorisasi Biner untuk platform Anda.

Menetapkan project default

Tetapkan project default Google Cloud jika Anda belum melakukannya:

PROJECT_ID=PROJECT_ID
gcloud config set project ${PROJECT_ID}

Menyiapkan lingkungan

Siapkan variabel lingkungan untuk menyimpan nama dan nomor project Anda:

DEPLOYER_PROJECT_ID=${PROJECT_ID}
DEPLOYER_PROJECT_NUMBER="$(
    gcloud projects describe "${DEPLOYER_PROJECT_ID}" \
      --format="value(projectNumber)"
)"
ATTESTOR_PROJECT_ID=${PROJECT_ID}
ATTESTOR_PROJECT_NUMBER="$(
    gcloud projects describe "${ATTESTOR_PROJECT_ID}" \
    --format="value(projectNumber)"
)"

Jika project attestor dan deployer Anda adalah project yang sama, gunakan project ID yang sama untuk kedua variabel.

Anda juga harus mendapatkan nama akun layanan untuk project:

DEPLOYER_SERVICE_ACCOUNT="service-${DEPLOYER_PROJECT_NUMBER}@gcp-sa-binaryauthorization."
ATTESTOR_SERVICE_ACCOUNT="service-${ATTESTOR_PROJECT_NUMBER}@gcp-sa-binaryauthorization."

Membuat catatan Artifact Analysis

Otorisasi Biner menggunakan Artifact Analysis untuk menyimpan metadata tepercaya yang digunakan dalam proses otorisasi. Untuk setiap attestor yang Anda buat, Anda harus membuat satu catatan Artifact Analysis. Setiap pengesahan disimpan sebagai kemunculan catatan ini.

Untuk membuat catatan Artifact Analysis:

  1. Siapkan variabel lingkungan untuk menyimpan ID catatan dan deskripsi yang dapat dibaca manusia:

    NOTE_ID=NOTE_ID
    NOTE_URI="projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}"
    DESCRIPTION=DESCRIPTION
    

    Ganti kode berikut:

    • NOTE_ID adalah nama internal catatan dalam karakter alfanumerik tanpa spasi (misalnya, test-attestor-note)
    • NOTE_URI adalah jalur yang sepenuhnya memenuhi syarat ke resource catatan
    • DESCRIPTION adalah nama tampilan yang dapat dibaca manusia untuk catatan (misalnya, Test Attestor Note)
  2. Di editor teks, buat file JSON di /tmp/note_payload.json yang mendeskripsikan catatan Artifact Analysis:

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "${DESCRIPTION}"
        }
      }
    }
    EOM
    
  3. Buat catatan dengan mengirimkan permintaan HTTP ke REST API Artifact Analysis:

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

Untuk memverifikasi bahwa catatan berhasil dibuat, jalankan perintah berikut:

curl \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \
    "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/"

Menetapkan izin pada catatan

Anda juga harus menetapkan izin pada catatan Artifact Analysis yang Anda buat agar dapat diakses oleh akun layanan project attestor. Anda melakukannya dengan memperbarui kebijakan IAM untuk catatan guna menetapkan peran containeranalysis.notes.occurrences.viewer ke akun.

Untuk menetapkan izin:

  1. Buat file JSON yang berisi informasi yang diperlukan untuk menetapkan kebijakan IAM pada catatan Anda:

    cat > /tmp/iam_request.json << EOM
    {
      'resource': '${NOTE_URI}',
      'policy': {
        'bindings': [
          {
            'role': 'roles/containeranalysis.notes.occurrences.viewer',
            'members': [
              'serviceAccount:${ATTESTOR_SERVICE_ACCOUNT}'
            ]
          }
        ]
      }
    }
    EOM
    
  2. Tambahkan akun layanan dan peran akses yang diminta ke kebijakan IAM untuk catatan yang Anda buat:

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

Menyiapkan kunci kriptografis

Otorisasi Biner memungkinkan Anda menggunakan kunci PKIX untuk memverifikasi identitas penanda tangan yang membuat pengesahan dengan aman. Hal ini memastikan bahwa hanya pihak terverifikasi yang dapat mengizinkan image container. Sebagai alternatif untuk PKIX, Anda juga dapat menggunakan kunci PGP.

Membuat pasangan kunci PKIX

Otorisasi Biner memungkinkan Anda menggunakan pasangan kunci PKIX asimetris untuk memverifikasi pengesahan. Pasangan kunci terdiri dari kunci pribadi, yang digunakan oleh penanda tangan untuk menandatangani pengesahan secara digital, dan kunci publik, yang Anda tambahkan ke attestor. Kemudian, penegak Otorisasi Biner menggunakan kunci publik di attestor untuk memverifikasi bahwa pengesahan dibuat oleh penanda tangan.

Dalam panduan ini, Elliptic Curve Digital Signature Algorithm (ECDSA) yang direkomendasikan digunakan untuk membuat pasangan kunci PKIX. Anda juga dapat menggunakan kunci RSA atau PGP untuk penandatanganan. Lihat Tujuan utama dan algoritma untuk mengetahui informasi selengkapnya tentang algoritma penandatanganan.

Pasangan kunci asimetris yang dibuat dan disimpan di Cloud KMS mematuhi format PKIX. Untuk membuat kunci Cloud KMS yang akan digunakan dengan Otorisasi Biner, lihat Membuat Kunci Asimetris. Pastikan Anda memilih Asymmetric Sign sebagai tujuan kunci saat membuat kunci.

PKIX (Cloud KMS)

Untuk membuat pasangan kunci di Cloud KMS, lakukan hal berikut:

  1. Untuk menyiapkan variabel lingkungan yang diperlukan untuk membuat pasangan kunci, jalankan perintah berikut:

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEY_LOCATION=KMS_KEY_LOCATION
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_VERSION=KMS_KEY_VERSION
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=KMS_KEY_ALGORITHM
    KMS_PROTECTION_LEVEL=KMS_PROTECTION_LEVEL
    

    Ganti kode berikut:

    • KMS_KEY_PROJECT_ID: ID project tempat kunci disimpan.
    • KMS_KEY_LOCATION: lokasi kunci
    • KMS_KEYRING_NAME: nama key ring
    • KMS_KEY_NAME: nama kunci
    • KMS_KEY_VERSION: versi kunci
    • KMS_KEY_ALGORITHM: algoritma; ec-sign-p256-sha256 direkomendasikan
    • KMS_PROTECTION_LEVEL: tingkat perlindungan—misalnya, software
  2. Untuk membuat keyring, jalankan perintah berikut:

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
        --location ${KMS_KEY_LOCATION}
    
  3. 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}
    

PKIX (kunci lokal)

Untuk membuat pasangan kunci PKIX asimetris lokal baru dan menyimpannya dalam file:

  1. Buat kunci:

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. Karena file ini berisi kunci publik dan kunci pribadi, Anda perlu mengekstrak kunci publik ke dalam file terpisah agar dapat menambahkannya ke attestor:

    PUBLIC_KEY_FILE="/tmp/ec_public.pem"
    openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
    

Membuat attestor

Langkah selanjutnya adalah membuat attestor itu sendiri di Otorisasi Biner dengan catatan Artifact Analysis terkait. Anda juga harus menambahkan kunci publik kriptografis.

Untuk membuat attestor:

  1. Siapkan variabel lingkungan untuk menyimpan nama attestor seperti yang ditentukan dalam Otorisasi Biner:

    ATTESTOR_NAME=ATTESTOR_NAME
    

    dengan ATTESTOR_NAME adalah nama attestor yang ingin Anda buat (misalnya, build-secure atau prod-qa).

  2. Buat attestor dan lampirkan kunci keamanan publik:

    PKIX (Cloud KMS)

    1. Siapkan variabel lingkungan tambahan untuk menyimpan informasi tentang pasangan kunci Cloud KMS untuk panggilan ke Otorisasi Biner API.

      KMS_CRYPTO_KEY_URI="projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}"
      KMS_CRYPTO_KEY_VERSION_URI="${KMS_CRYPTO_KEY_URI}/cryptoKeyVersions/${KMS_KEY_VERSION}"
      KMS_KEY_ID="//cloudkms.googleapis.com/v1/${KMS_CRYPTO_KEY_VERSION_URI}"
      
    2. Download file kunci publik dari Cloud KMS dan simpan ke file bernama /tmp/kms_public_key.pem di sistem lokal Anda.

    3. Buat file JSON yang berisi informasi yang diperlukan untuk membuat attestor:

      cat > /tmp/attestor.json << EOM
      {
          "userOwnedDrydockNote": {
              "noteReference": "${NOTE_URI}",
              "publicKeys": {
                  "id": "${KMS_KEY_ID}",
                  "pkixPublicKey": {
                      "signatureAlgorithm": "${KMS_KEY_ALGORITHM}",
                      "publicKeyPem": $( \
                          python < /tmp/kms_public_key.pem \
                          -c 'import json, sys; print(json.dumps(sys.stdin.read()))' \
                      )
                  }
              }
          }
      }
      EOM
      
    4. Buat attestor:

      curl -X POST  \
          -H "Content-Type: application/json" \
          -H "Authorization: Bearer $(gcloud auth print-access-token)" \
          -H "X-Goog-User-Project: ${ATTESTOR_PROJECT_ID}" \
          --data-binary @/tmp/attestor.json \
      "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors?attestorId=${ATTESTOR_NAME}"
      

    PKIX (kunci lokal)

    1. Buat file JSON yang berisi informasi yang diperlukan untuk membuat attestor:

      cat > /tmp/attestor.json << EOM
      {
         "userOwnedGrafeasNote": {
             "noteReference": "${NOTE_URI}",
             "publicKeys": {
                 "pkixPublicKey": {
                     "signatureAlgorithm": "ecdsa_p256_sha256",
                     "publicKeyPem": $( \
                         python < ${PUBLIC_KEY_FILE} \
                         -c 'import json, sys; print(json.dumps(sys.stdin.read()))' \
                     )
                 }
             }
         }
      }
      EOM
      
    2. Buat attestor:

      curl -X POST  \
         -H "Content-Type: application/json" \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         -H "X-Goog-User-Project: ${ATTESTOR_PROJECT_ID}" \
         --data-binary @/tmp/attestor.json \
      "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors?attestorId=${ATTESTOR_NAME}"
      
  3. Tambahkan binding peran IAM untuk project deployer ke attestor. Ini digunakan oleh Otorisasi Biner saat mengevaluasi kebijakan untuk menentukan apakah project memiliki izin untuk mengakses attestor yang direferensikan.

    Buat file JSON yang berisi informasi yang diperlukan untuk menetapkan kebijakan IAM pada attestor Anda:

    cat > /tmp/iam_request.json << EOM
    {
      'resource': 'projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}',
      'policy': {
        'bindings': [
          {
            'role': 'roles/binaryauthorization.attestorsVerifier',
            'members': [
              'serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}'
            ]
          }
        ]
      }
    }
    EOM
    

    Tambahkan akun layanan dan peran akses yang diminta ke kebijakan IAM untuk catatan yang Anda buat:

    curl -X POST  \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \
        --data-binary @/tmp/iam_request.json \
        "https://binaryauthorization.googleapis.com/v1beta1/projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}:setIamPolicy"
    

    Jika Anda menerima error service account not found saat memberikan peran IAM, Anda mungkin perlu membuat agen layanan secara manual.

Memverifikasi bahwa attestor telah dibuat

Untuk memverifikasi bahwa attestor telah dibuat, jalankan perintah berikut:

curl \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \
    "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors/"

Langkah berikutnya