CLI を使用した認証者の作成

このページでは、コマンドラインで gcloud コマンドを使用、Binary Authorization で認証者を作成する方法について説明します。この手順は、Google Cloud Console または REST API でも実行できます。このタスクは、Binary Authorization の設定の一部です。

概要

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

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

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

単一プロジェクト設定では、Binary Authorization ポリシーを構成した Google Cloud プロジェクトに認証者を作成します。マルチプロジェクト設定では、多くの場合、デプロイ担当者プロジェクトにポリシーを構成し、それとは別の認証者プロジェクトに認証者を保存します。

デフォルト プロジェクトを設定する

デフォルトの 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"

Container Analysis メモを作成する

Binary Authorization は、Container Analysis を使用して、認証プロセスで使用される信頼できるメタデータを保存します。作成する認証者ごとに、1 つの Container Analysis メモを作成する必要があります。それぞれの証明書が、このメモのオカレンスとして保存されます。

Container 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. テキスト エディタで、Container Analysis メモを記述する JSON ファイルを /tmp/note_payload.json に作成します。

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "${DESCRIPTION}"
        }
      }
    }
    EOM
    
  3. HTTP リクエストを Container 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/"
    

メモに権限を設定する

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

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

新しいローカル非対称 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}
    

Cloud KMS で生成され、保存されている非対称鍵ペアは PKIX 形式に準拠しています。Binary Authorization で使用する Cloud KMS 鍵を作成する方法については、非対称鍵の作成をご覧ください。鍵を作成する場合は、鍵の目的として非対称署名を必ず選択してください。

認証者を作成する

次に、関連付けられた Container Analysis メモを使用して、Binary Authorization で認証者を作成します。また、暗号公開鍵も追加する必要があります。

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

  1. Binary Authorization で定義されている認証者の名前を格納する環境変数を設定します。

    ATTESTOR_NAME=ATTESTOR_NAME
    

    ATTESTOR_NAME は、作成する認証者の名前です(例: build-secureprod-qa)。

  2. Binary Authorization で認証者リソースを作成します。

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

    gcloud beta 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(ローカルキー)

    1. ローカルに保存された PKIX 公開鍵を認証者に追加します。

      次に、エクスポートした公開鍵を認証者に追加して、Binary Authorization で本人確認に使用できるようにします。

      gcloud --project="${ATTESTOR_PROJECT_ID}" \
         beta 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 に保存し、証明書の作成に使用できます。

    2. 公開鍵 ID を保存します。

      証明書を作成するときは、公開鍵 ID が必要です。公開鍵 ID を保存するには、上記の binauthz attestors public-keys add コマンドの出力から保存します。

      また、gcloud container binauthz attestors describe ${ATTESTOR} コマンドを使用すると、認証者の公開鍵 ID をいつでも確認できます。

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

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

    PKIX(Cloud KMS)

    1. Cloud KMS で管理される鍵ペアに関する情報を格納する環境変数を設定します。

      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_PROJECT_ID は、鍵が格納されているプロジェクトの ID です。
      • KMS_KEY_LOCATION は鍵の場所です。
      • KMS_KEYRING_NAME はキーリングの名前です。
      • KMS_KEY_NAME は鍵の名前です。
      • KMS_KEY_VERSION は鍵バージョンです。
    2. (省略可)KMS 鍵を設定します。

      認証者に保存できる KMS 鍵を作成します。この手順では、以下で使用する環境変数も設定します。

      鍵を作成して環境変数を設定するには:

      KMS_KEY_PROJECT_ID=${PROJECT_ID}
      KMS_KEYRING_NAME=my-binauthz-keyring
      KMS_KEY_NAME=my-binauthz-kms-key-name
      KMS_KEY_LOCATION=global
      KMS_KEY_PURPOSE=asymmetric-signing
      KMS_KEY_ALGORITHM=ec-sign-p256-sha256
      KMS_PROTECTION_LEVEL=software
      KMS_KEY_VERSION=1
      
      1. KMS キーリングを作成する
      gcloud kms keyrings create ${KMS_KEYRING_NAME} \
        --location ${KMS_KEY_LOCATION}
      
      1. 鍵を作成する
      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 鍵の作成の詳細については、非対称鍵の作成をご覧ください。

    3. 認証者に公開鍵を追加します。

      gcloud --project="${ATTESTOR_PROJECT_ID}" \
          alpha 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}"
      

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

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

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

次のステップ