REST API를 사용하여 증명자 만들기

이 페이지에서는 REST API를 사용하여 Binary Authorization의 커스텀 증명자를 만드는 방법을 설명합니다.

또는 Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 이러한 단계를 수행해도 됩니다. 이 태스크는 Binary Authorization 설정의 일부입니다.

Cloud Build 사용자: 대신 built-by-cloud-build 증명자를 사용하여 Cloud Build에서 빌드한 이미지만 배포할 수 있습니다.

개요

증명자는 Binary Authorization에서 증명을 확인하는 데 사용하는 Google Cloud 리소스입니다. 증명에 대한 자세한 내용은 Binary Authorization 개요를 참조하세요.

증명자를 만들려면 다음을 수행해야 합니다.

  • Artifact Analysis에서 메모를 만들어 증명 프로세스에 사용된 신뢰할 수 있는 메타데이터를 저장합니다.
  • 증명자의 ID를 확인하는 데 사용할 수 있는 공개 키 인프라 (X.509) (PKIX) 키 쌍을 설정합니다. Cloud Key Management Service(Cloud KMS)에서 생성된 비대칭 키 쌍은 PKIX와 호환되는 형식입니다. PKIX 키 대신 PGP 키 쌍을 사용할 수도 있습니다.
  • Binary Authorization에서 증명자를 만들고 메모와 생성한 공개 키를 연결합니다.

단일 프로젝트 설정 시 Binary Authorization 정책을 구성한 것과 동일한 Google Cloud 프로젝트에 증명자를 만듭니다. 다중 프로젝트 설정에는 정책이 구성된 배포자 프로젝트와 증명자가 저장된 증명자 프로젝트가 있을 가능성이 높습니다.

시작하기 전에

  1. Binary Authorization 사용 설정

  2. 플랫폼에 Binary Authorization 설정

기본 프로젝트 설정

아직 기본 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"

Artifact Analysis 메모 만들기

Binary Authorization은 Artifact Analysis를 사용하여 승인 프로세스에 사용된 신뢰할 수 있는 메타데이터를 저장합니다. 생성된 증명자마다 Artifact Analysis 메모를 하나씩 만들어야 합니다. 각 증명은 이 메모의 어커런스로 저장됩니다.

Artifact Analysis 메모를 만들려면 다음 안내를 따르세요.

  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. 텍스트 편집기를 사용하여 /tmp/note_payload.json에 Artifact Analysis 메모를 설명하는 JSON 파일을 만듭니다.

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "${DESCRIPTION}"
        }
      }
    }
    EOM
    
  3. Artifact Analysis REST API에 HTTP 요청을 보내 메모를 만듭니다.

    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. 메모에 IAM 정책을 설정하는 데 필요한 정보가 포함된 JSON 파일을 생성합니다.

    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"
    

암호화 키 설정

Binary Authorization에서는 PKIX 키를 사용하여 증명을 만든 서명자의 ID를 안전하게 확인할 수 있습니다. 이렇게 하면 확인된 당사자만 컨테이너 이미지를 승인할 수 있습니다. PKIX 대신 PGP 키를 사용해도 됩니다.

PKIX 키 쌍 만들기

Binary Authorization에서는 비대칭 PKIX 키 쌍 사용하여 증명을 확인할 수 있습니다. 키 쌍은 서명자가 증명을 디지털 서명하는 데 사용하는 비공개 키와 증명자에 추가하는 공개 키로 구성됩니다. 나중에 Binary Authorization 시행자는 증명자의 공개 키를 사용하여 서명자가 증명을 생성했는지 확인합니다.

이 가이드에서는 PKIX 키 쌍을 생성하는 데 타원 곡선 디지털 서명 알고리즘 (ECDSA) 사용이 권장됩니다. 서명에 RSA 또는 PGP 키를 사용할 수도 있습니다. 서명 알고리즘에 대한 자세한 내용은 키 용도 및 알고리즘을 참조하세요.

Cloud KMS에서 생성되고 저장된 비대칭 키 쌍은 PKIX와 호환되는 형식입니다. Binary Authorization에서 사용할 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}
    

증명자 만들기

다음 단계는 Binary Authorization에서 Artifact Analysis 메모가 연결된 증명자를 만드는 것입니다. 암호화 공개 키도 추가해야 합니다.

증명자를 만들려면 다음 안내를 따르세요.

  1. Binary Authorization에 정의된 대로 증명자의 이름을 저장할 환경 변수를 설정합니다.

    ATTESTOR_NAME=ATTESTOR_NAME
    

    여기서 ATTESTOR_NAME은 만들려는 증명자의 이름입니다(예: build-secure 또는 prod-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 역할 바인딩을 추가합니다. 이는 Binary Authorization에서 프로젝트에 참조된 증명자에 액세스할 수 있는 권한이 있는지 확인하기 위해 정책을 평가할 때 사용됩니다.

    증명자에 IAM 정책을 설정하는 데 필요한 정보가 포함된 JSON 파일을 생성합니다.

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

다음 단계