gcloud CLI を使用して認証者を作成する

このページでは、Google Cloud CLI を使用して Binary Authorization の認証者を作成する方法について説明します。この手順は、Google Cloud コンソールまたは REST API でも行うことができます。このタスクは Binary Authorization の設定の一部です。

Cloud Build ユーザー: 代わりに built-by-cloud-build 認証者を使用して、Cloud Build によってビルドされたイメージのみをデプロイできます。

認証者は、Binary Authorization が証明書の検証で使用する Google Cloud リソースです。証明書の詳細については、Binary Authorization の概要をご覧ください。

認証者の作成手順は次のとおりです。

  • Artifact Analysisメモを作成して、認証プロセスで使用される信頼できるメタデータを保存します。
  • 認証者の ID 確認に使用する PKIX 鍵ペアを設定します。Cloud Key Management Service(Cloud KMS)で生成された非対称鍵ペアは PKIX と互換性があります。
  • Binary Authorization で認証者を作成し、作成したメモと公開鍵を関連付けます。

単一プロジェクト設定では、Binary Authorization ポリシーを構成した Google Cloud プロジェクトに認証者を作成します。これらのステップを含むエンドツーエンドの単一プロジェクト チュートリアルについては、Google Cloud CLI の使用を開始するまたは Google Cloud コンソールの使用を開始するをご覧ください。

マルチプロジェクト設定では、個別のプロジェクトを用意することをおすすめします。ポリシーが構成されている場所にデプロイ担当者プロジェクトを、証明者が保管されている場所に証明者プロジェクトを、証明書用に証明書プロジェクトをそれぞれ用意することをおすすめします。これらのステップを含むエンドツーエンドのマルチプロジェクト チュートリアルについては、マルチプロジェクト設定をご覧ください。

始める前に

認証者を作成する前に、次のことを行います。

  1. Binary Authorization を有効にします。

  2. プラットフォームに Binary Authorization を設定します。

プロジェクト環境の設定

このセクションでは、環境変数を設定します。

プロジェクト名と番号を格納する環境変数を設定します。証明書とデプロイ担当者のプロジェクトが同じプロジェクトの場合は、両方の変数に同じプロジェクト ID を使用します。

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

プロジェクトのサービス アカウント名も取得する必要があります。

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 を使用して、認証プロセスで使用される信頼できるメタデータを保存します。作成する認証者ごとに、1 つの 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. テキスト エディタで、メモを含む 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/"
    

メモに IAM 権限を設定する

Artifact Analysis メモリソースの認証者プロジェクト サービス アカウントに Identity and Access Management(IAM)ロールを付与する必要があります。これを行うには、認証者のプロジェクト サービス アカウントをメモの 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"
    

マルチプロジェクトの使用

認証者を 1 つのプロジェクトに保存して別のプロジェクトにデプロイする場合は、認証者のデプロイ担当者プロジェクトに関連付けられたサービス アカウントに roles/binaryauthorization.attestorsVerifier ロールを付与する必要があります。

暗号鍵を設定する

Binary Authorization では、PKIX 鍵を使用して証明書を検証できます。

鍵ペアを生成する

このガイドでは、PKIX 鍵ペアの生成に推奨の楕円曲線デジタル署名アルゴリズム(ECDSA)を使用していますが、RSA または PGP 鍵ペアを使用することもできます。署名アルゴリズムの詳細については、鍵の目的とアルゴリズムをご覧ください。

PKIX 鍵ペアは、署名者が証明書に署名する秘密鍵と、認証者に追加する公開鍵で構成されます。デプロイ時に、Binary Authorization はこの公開鍵を使用して証明書を検証します。

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}
    

    次のように置き換えます。

    • KMS_KEY_NAME: 鍵の名前
    • KMS_KEY_LOCATION: 鍵のロケーション
    • KMS_KEYRING_NAME: キーリングの名前
    • KMS_KEY_PURPOSE: 鍵の目的(ASYMMETRIC_SIGN に設定)
    • KMS_KEY_ALGORITHM: アルゴリズム(ec-sign-p256-sha256 を推奨)
    • KMS_PROTECTION_LEVEL: 保護レベル(software など)

PKIX(ローカル鍵)

新しいローカル非対称 PKIX 鍵ペアを生成してファイルに保存するには、次の操作を行います。

  1. 秘密鍵を生成します。

    PRIVATE_KEY_FILE は、証明書ペイロードの署名に使用される秘密鍵を含むファイルの名前です。

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. 秘密鍵から公開鍵を抽出し、ファイルに保存します。

    PUBLIC_KEY_FILE は、認証者に保存されている公開鍵を含むファイルの名前です。

    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. Binary Authorization で認証者リソースを作成します。

    gcloud --project="${ATTESTOR_PROJECT_ID}" \
        container binauthz attestors create "${ATTESTOR_NAME}" \
        --attestation-authority-note="${NOTE_ID}" \
        --attestation-authority-note-project="${ATTESTOR_PROJECT_ID}"
    
  3. デプロイ担当者プロジェクトの IAM ロール バインディングを認証者に追加します。これは、Binary Authorization がポリシーを評価して、関連する証明書にアクセスする権限があるかどうかを判定するときに使用されます。

    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. 認証者に公開鍵を追加するには、次のようにします。

    PKIX(Cloud KMS)

    Cloud KMS 鍵ペアから認証者に公開鍵を追加するには、次のコマンドを実行します。

    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(ローカル鍵)

    ローカルに保存された PKIX 公開鍵を認証者に追加するには、次のコマンドを実行します。

    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
    

    認証者に公開鍵を追加し、鍵 ID(任意の文字列)を指定しない場合、RFC 6920 形式 ni:///sha-256;... の ID が自動的に付与されます(... は公開鍵のエンコードされたハッシュです)。この値は、コマンド出力の id フィールドに返されます。返された ID を PUBLIC_KEY_ID に保存し、証明書の作成に使用できます。

公開鍵 ID を保存する

証明書を作成するには、公開鍵 ID が必要です。

公開鍵 ID を保存するには、上記の binauthz attestors public-keys add コマンドの出力からコピーします。

また、次のコマンドを使用すると、認証者の公開鍵 ID をいつでも確認できます。

gcloud container binauthz attestors describe ${ATTESTOR}

公開鍵 ID を環境変数に格納するには、次のコマンドを入力します。

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

認証者が作成されたことを確認する

認証者が作成されたことを確認するには、次のコマンドを実行します。

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

次のステップ