使用 REST API 建立驗證者

本頁說明如何使用 REST API,在 Binary Authorization 中建立自訂簽署者。

您也可以使用 Google Cloud CLIGoogle Cloud 控制台執行這些步驟。這項工作是設定二進位授權流程的一部分。

Cloud Build 使用者:您可以改用built-by-cloud-build驗證者,只部署 Cloud Build 建構的映像檔

總覽

認證者是二進位授權用來驗證認證的 Google Cloud 資源。如要進一步瞭解認證,請參閱「二進位授權總覽」。

建立驗證者時,您必須執行下列操作:

  • Artifact Analysis 中建立附註,儲存驗證程序中使用的可信中繼資料。
  • 設定可用於驗證驗證者身分的公用金鑰基礎架構 (X.509) (PKIX) 金鑰組。(由 Cloud Key Management Service (Cloud KMS) 產生的非對稱金鑰配對採用 PKIX 相容格式)。您也可以使用 PGP 金鑰組,而非 PKIX 金鑰。
  • 在二進位授權中建立驗證者,並將您建立的附註和公開金鑰建立關聯。

單一專案設定中,您會在設定二進位授權政策的同一個 Google Cloud 專案中建立驗證者。在多專案設定中,您很可能會有部署者專案 (用於設定政策) 和驗證者專案 (用於儲存驗證者)。

事前準備

  1. 啟用二進位授權。

  2. 為平台設定二進位授權。

設定預設專案

如果尚未設定預設 Google Cloud 專案,請設定:

PROJECT_ID=PROJECT_ID
gcloud config set project ${PROJECT_ID}

設定環境

設定環境變數,儲存專案名稱和編號:

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

如果驗證者和部署者專案是同一個專案,請為這兩個變數使用相同的專案 ID。

您也必須取得專案的服務帳戶名稱:

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"

建立構件分析附註

二進位授權會使用構件分析功能,儲存授權程序中使用的可信中繼資料。您建立的每個認證者都必須建立一個構件分析記事。每項認證都會儲存為這則附註的例項。

如要建立構件分析記事:

  1. 設定環境變數,儲存記事 ID 和可供人閱讀的說明:

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

    更改下列內容:

    • NOTE_ID 是附註的內部名稱,由英數字元組成,且不含空格 (例如 test-attestor-note)
    • NOTE_URI 是記事資源的完整路徑
    • DESCRIPTION 是記事的使用者可讀顯示名稱 (例如 Test Attestor Note)。
  2. 在文字編輯器中,建立 JSON 檔案,說明構件分析附註:/tmp/note_payload.json

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "${DESCRIPTION}"
        }
      }
    }
    EOM
    
  3. 將 HTTP 要求傳送至 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}"
    

如要確認記事是否已成功建立,請執行下列指令:

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/"

設定記事的權限

您也必須在建立的 Artifact Analysis 附註中設定權限,讓驗證者專案服務帳戶可以存取。方法是更新記事的 IAM 政策,將 containeranalysis.notes.occurrences.viewer 角色指派給帳戶。

如何設定權限:

  1. 產生 JSON 檔案,其中包含在記事上設定 IAM 政策所需的資訊:

    cat > /tmp/iam_request.json << EOM
    {
      'resource': '${NOTE_URI}',
      'policy': {
        'bindings': [
          {
            'role': 'roles/containeranalysis.notes.occurrences.viewer',
            'members': [
              'serviceAccount:${ATTESTOR_SERVICE_ACCOUNT}'
            ]
          }
        ]
      }
    }
    EOM
    
  2. 將服務帳戶和要求的存取角色新增至您建立的記事 IAM 政策:

    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"
    

設定加密編譯金鑰

二進位授權可讓您使用 PKIX 金鑰,安全地驗證建立認證簽署者身分。確保只有經過驗證的當事人可以授權容器映像檔。除了 PKIX,您也可以使用 PGP 金鑰。

建立 PKIX 金鑰組

您可以使用非對稱式 PKIX 金鑰組,透過二進位授權驗證認證。金鑰組包含私密金鑰 (簽署者用來以數位方式簽署認證) 和公開金鑰 (您新增至認證者)。稍後,二進位授權執行者會使用驗證者中的公開金鑰,驗證簽署者是否建立了認證。

本指南建議使用橢圓曲線數位簽章演算法 (ECDSA),產生 PKIX 金鑰組。您也可以使用 RSA 或 PGP 金鑰簽署。如要進一步瞭解簽署演算法,請參閱金鑰用途與演算法一文。

Cloud KMS 中產生及儲存的非對稱金鑰配對符合 PKIX 格式。如要建立 Cloud KMS 金鑰以搭配使用二進位授權,請參閱建立非對稱金鑰。建立金鑰時,請務必選擇「非對稱式簽署」做為金鑰用途。

PKIX (Cloud KMS)

如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:

  1. 如要設定建立金鑰組所需的環境變數,請執行下列指令:

    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
    

    更改下列內容:

    • KMS_KEY_PROJECT_ID:儲存金鑰的專案 ID。
    • KMS_KEY_LOCATION:金鑰位置
    • KMS_KEYRING_NAME:金鑰環的名稱
    • KMS_KEY_NAME:金鑰名稱
    • KMS_KEY_VERSION:金鑰版本
    • KMS_KEY_ALGORITHM:演算法; 建議使用 ec-sign-p256-sha256
    • KMS_PROTECTION_LEVEL:防護等級,例如 software
  2. 如要建立金鑰環,請執行下列指令:

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
        --location ${KMS_KEY_LOCATION}
    
  3. 如要建立金鑰,請執行下列指令:

    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 (本機金鑰)

如要產生新的本機非對稱 PKIX 金鑰配對,並儲存在檔案中,請執行下列指令:

  1. 產生金鑰:

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. 由於這個檔案同時包含公開和私密金鑰,您必須將公開金鑰擷取到個別檔案,才能新增至驗證者:

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

建立驗證者

下一步是在二進位授權中建立驗證者本身,並附上相關的構件分析附註。您也必須新增加密公開金鑰。

如要建立驗證者,請按照下列步驟操作:

  1. 設定環境變數,儲存在 Binary Authorization 中定義的驗證者名稱:

    ATTESTOR_NAME=ATTESTOR_NAME
    

    其中 ATTESTOR_NAME 是要建立的認證者名稱 (例如 build-secureprod-qa)。

  2. 建立驗證者並附加公開安全金鑰:

    PKIX (Cloud KMS)

    1. 設定其他環境變數,儲存呼叫 Binary Authorization API 時使用的 Cloud KMS 金鑰配對相關資訊。

      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. 從 Cloud KMS 下載公開金鑰檔案,並儲存至本機系統中名為 /tmp/kms_public_key.pem 的檔案。

    3. 產生 JSON 檔案,其中包含建立認證者所需的資訊:

      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. 建立驗證者:

      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 (本機金鑰)

    1. 產生 JSON 檔案,其中包含建立認證者所需的資訊:

      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. 建立驗證者:

      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. 為部署者專案新增至驗證者的 IAM 角色繫結。二進位授權評估政策時,會使用這項資訊判斷專案是否有權存取參照的驗證者。

    產生 JSON 檔案,其中包含在驗證者上設定 IAM 政策所需的資訊:

    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
    

    將服務帳戶和要求的存取角色新增至您建立的記事 IAM 政策:

    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"
    

確認驗證者已建立

如要確認驗證者已建立,請執行下列指令:

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/"

後續步驟