Membuat attestor menggunakan gcloud CLI

Halaman ini menjelaskan cara membuat attestor dalam Otorisasi Biner menggunakan Google Cloud CLI. Sebagai alternatif, Anda dapat melakukan langkah-langkah ini dengan menggunakan Google Cloud Console atau REST API. Tugas ini adalah bagian dari menyiapkan Otorisasi Biner.

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

Untuk membuat attestor, lakukan langkah-langkah berikut:

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

Dalam penyiapan project tunggal, Anda membuat attestor di project Google Cloud yang sama, tempat Anda mengonfigurasi kebijakan Otorisasi Biner. Untuk tutorial project tunggal menyeluruh yang mencakup langkah-langkah ini, lihat Mulai menggunakan Google Cloud CLI atau Mulai menggunakan Konsol Google Cloud.

Dalam penyiapan multi-project, sebaiknya Anda memiliki project terpisah: project deployer, tempat kebijakan Anda dikonfigurasi; project attestor, tempat attestor Anda disimpan; dan project pengesahan untuk pengesahan. Untuk tutorial multi-project menyeluruh yang menyertakan langkah-langkah ini, lihat penyiapan multi-project.

Sebelum memulai

Sebelum Anda membuat attestor, lakukan hal berikut:

  1. Otorisasi Biner harus diaktifkan. Untuk mempelajari cara melakukannya, baca bagian Mengaktifkan Otorisasi Biner.

  2. Kebijakan ini harus dikonfigurasi untuk hanya mengizinkan gambar yang diverifikasi oleh attestor. Untuk mempelajari cara melakukannya, lihat Mengonfigurasi kebijakan menggunakan gcloud CLI.

Menyiapkan lingkungan proyek

Di bagian ini, Anda akan menyiapkan variabel lingkungan.

Siapkan variabel lingkungan untuk menyimpan nama dan nomor project Anda. Jika project attestor dan deployer Anda adalah project yang sama, gunakan project ID yang sama untuk kedua variabel.

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

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

Anda juga harus mendapatkan nama akun layanan untuk project tersebut:

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

Membuat catatan Artifact Analysis

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

Untuk membuat catatan, ikuti langkah-langkah berikut:

  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: nama internal catatan dalam karakter alfanumerik tanpa spasi—misalnya, test-attestor-note
    • NOTE_URI: jalur yang sepenuhnya memenuhi syarat ke resource catatan
    • DESCRIPTION: nama tampilan yang dapat dibaca manusia untuk catatan—misalnya, Test Attestor Note
  2. Di editor teks, buat file JSON yang mendeskripsikan catatan:

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

    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 memastikan 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 IAM pada catatan

Anda harus memberikan peran Identity and Access Management (IAM) ke akun layanan project attestor pada resource catatan Artifact Analysis. Anda dapat melakukannya dengan menambahkan akun layanan project attestor ke peran containeranalysis.notes.occurrences.viewer dalam kebijakan IAM catatan.

Untuk menambahkan peran, lakukan tindakan berikut:

  1. Buat file JSON yang berisi informasi yang diperlukan untuk menetapkan peran IAM di 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"
    

Penggunaan multi-project

Jika Anda menyimpan attestor dalam satu project, dan men-deploy dalam project terpisah, Anda harus memberikan peran roles/binaryauthorization.attestorsVerifier ke akun layanan yang terkait dengan project deployer di attestor.

Menyiapkan kunci kriptografis

Dengan Otorisasi Biner, Anda dapat menggunakan kunci PKIX untuk memverifikasi attestations.

Membuat pasangan kunci

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

Pasangan kunci PKIX terdiri dari kunci pribadi yang digunakan penanda tangan untuk menandatangani pengesahan, dan kunci publik yang Anda tambahkan ke attestor. Pada waktu deployment, Otorisasi Biner menggunakan kunci publik ini untuk memverifikasi pengesahan.

PKIX (Cloud KMS)

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

  1. Untuk menyiapkan variabel lingkungan yang diperlukan guna 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 key ring, 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}
    

    Ganti kode berikut:

    • KMS_KEY_NAME: nama kunci
    • KMS_KEY_LOCATION: lokasi kunci
    • KMS_KEYRING_NAME: nama key ring
    • KMS_KEY_PURPOSE: tujuan kunci, ditetapkan ke ASYMMETRIC_SIGN
    • KMS_KEY_ALGORITHM: algoritme, ec-sign-p256-sha256 direkomendasikan
    • KMS_PROTECTION_LEVEL: tingkat perlindungan—misalnya, software

PKIX (kunci lokal)

Untuk menghasilkan pasangan kunci PKIX asimetris lokal baru dan menyimpannya dalam file, lakukan langkah berikut:

  1. Buat kunci pribadi:

    PRIVATE_KEY_FILE adalah nama file yang berisi kunci pribadi yang digunakan untuk menandatangani payload pengesahan.

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. Ekstrak kunci publik dari kunci pribadi, lalu simpan dalam file:

    PUBLIC_KEY_FILE adalah nama file yang berisi kunci publik yang disimpan di attestor.

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

Membuat attestor

Untuk membuat attestor, ikuti langkah-langkah berikut:

  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 resource attestor di Otorisasi Biner:

    gcloud --project="${ATTESTOR_PROJECT_ID}" \
        container binauthz attestors create "${ATTESTOR_NAME}" \
        --attestation-authority-note="${NOTE_ID}" \
        --attestation-authority-note-project="${ATTESTOR_PROJECT_ID}"
    
  3. Tambahkan binding peran IAM untuk project deploy ke attestor. Hal ini digunakan oleh Otorisasi Biner saat mengevaluasi kebijakan untuk menentukan apakah project memiliki izin untuk mengakses pengesahan terkait.

    gcloud container binauthz attestors add-iam-policy-binding \
        "projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}" \
        --member="serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}" \
        --role=roles/binaryauthorization.attestorsVerifier
    
  4. Untuk menambahkan kunci publik ke attestor, lakukan langkah berikut:

    PKIX (Cloud KMS)

    Untuk menambahkan kunci publik dari pasangan kunci Cloud KMS ke attestor, jalankan perintah berikut:

    gcloud --project="${ATTESTOR_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}"
    

    PKIX (kunci lokal)

    Untuk menambahkan kunci publik PKIX yang disimpan secara lokal ke attestor, jalankan perintah berikut:

    gcloud --project="${ATTESTOR_PROJECT_ID}" \
        container binauthz attestors public-keys add \
        --attestor="${ATTESTOR_NAME}" \
        --pkix-public-key-file=${PUBLIC_KEY_FILE} \
        --pkix-public-key-algorithm=ecdsa-p256-sha256
    

    Jika Anda menambahkan kunci publik ke attestor dan tidak menentukan ID kunci (yang dapat berupa string apa pun), kunci tersebut akan otomatis diberikan dalam format RFC 6920: ni:///sha-256;..., dengan ... adalah hash yang dienkode dari kunci publik tersebut. Nilai ini ditampilkan di kolom id pada output perintah. ID yang ditampilkan dapat disimpan di PUBLIC_KEY_ID dan digunakan untuk membuat pengesahan.

Menyimpan ID kunci publik

Untuk membuat pengesahan, Anda memerlukan ID kunci publik.

Untuk menyimpan ID kunci publik, Anda dapat menyalinnya dari output perintah binauthz attestors public-keys add di atas.

Atau, Anda dapat melihat ID kunci publik attestor kapan saja menggunakan perintah berikut:

gcloud container binauthz attestors describe ${ATTESTOR}.

Untuk menyimpan ID kunci publik dalam variabel lingkungan, masukkan perintah berikut:

PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \
--format='value(userOwnedGrafeasNote.publicKeys[0].id)')

Memverifikasi bahwa attestor telah dibuat

Untuk memverifikasi bahwa attestor sudah dibuat, jalankan perintah berikut:

gcloud container binauthz attestors list \
    --project="${ATTESTOR_PROJECT_ID}"

Langkah selanjutnya