Voucher を使用して証明書を作成する

このチュートリアルでは、Voucher を設定して使用し、Binary Authorization 証明書を作成する方法について説明します。

Voucher の概要

Voucher はオープンソース ツールで、イメージの Binary Authorization 証明書を作成する前に、コンテナ イメージの一連のチェックを行います。Voucher にはクライアント コンポーネントとサーバー コンポーネントがあります。イメージをビルドするステップの後に、ビルド パイプライン内の追加ステップとして Voucher クライアントを実行します。Voucher クライアントのビルドステップが実行されると、Voucher Server にイメージが送信され、そこでチェックが実行されます。Voucher Server 構成ファイルで、Voucher が実行するチェックを他の基準とともに定義します。

このチュートリアルでは、Voucher の snakeoil チェックを使用して、イメージの脆弱性をテストする方法について説明します。構成ファイルのチェックを有効にするには、このチュートリアルの後半で説明するように fail-on オプションを脆弱性しきい値に設定します。

snakeoil のチェックが完了した後、検出されたすべての脆弱性がしきい値を下回る場合、Voucher Server はイメージの Binary Authorization 証明書を作成します。検出された脆弱性のいずれかがしきい値を上回る場合、Voucher Server は証明書を作成しません。

コンテナ イメージのデプロイ時に、検証済みの証明書がなければ、Binary Authorization 適用者はイメージのデプロイを拒否します。

目標

このガイドでは、次のことを行います。

  1. Cloud Run で Voucher Server を設定します。
  2. Voucher クライアントを設定します。
  3. サンプル ビルド パイプラインで Voucher を使用します。

料金

このガイドでは、次の Google Cloud プロダクトを使用します。

  • Container Registry
  • Container Analysis
  • Cloud Build
  • Cloud Key Management Service
  • Cloud Run

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Build, Container Registry, Container Analysis, Cloud KMS, Cloud Run, and Identity and Access Management API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. Google Kubernetes Engine で Binary Authorization を設定することをおすすめします。このチュートリアルでは、証明書の作成方法について説明します。デプロイ時の適用を使用して証明書を検証し、関連するイメージをデプロイするには、Binary Authorization を設定する必要があります。必ず、証明書を要求するようにポリシーを構成します。Google Cloud Console またはコマンドラインでポリシーを構成できます。
  7. 環境変数に Google Cloud プロジェクトを指定します。

      export PROJECT_ID=PROJECT_ID
    

    PROJECT_ID を実際のプロジェクト ID に置き換えます。

  8. gcloud コマンドのプロジェクト ID を設定します。

    gcloud config set project ${PROJECT_ID}

  9. 以降のステップのために、プロジェクト番号を環境変数に指定します。

    export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \
      --format='value(project_number)')

Voucher Server の設定

以下の手順で Voucher Server を設定します。

Cloud Key Management Service の署名鍵の作成

このセクションでは、Voucher Server が Binary Authorization 証明書の作成に使用する鍵を作成します。

  1. キーリングの作成

    gcloud kms keyrings create KEY_RING\
       --location global
    

    KEY_RINGvoucher-key-ring などのキーリング名に置き換えます。

  2. 署名鍵を作成します。

    gcloud kms keys create KEY_NAME \
      --keyring KEY_RING \
      --location global \
      --purpose "asymmetric-signing" \
      --default-algorithm "rsa-sign-pkcs1-4096-sha512"
    

    KEY_NAME は、voucher-key などのキー名に置き換えます。

  3. Cloud Key Management Service の鍵バージョンのリソース ID を保存します。

    export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    
  4. Compute Engine ランタイム エンジン サービス アカウントcloudkms.signer ロールを付与します。

    このステップでは、Voucher Server を実行するサービス アカウントに cloudkms.signer ロールを付与します。これにより、Voucher Server で Cloud Key Management Service の鍵を使用して証明書に署名できるようになります。これを行うには、次のコマンドを実行します。

    gcloud kms keys add-iam-policy-binding\
      KEY_NAME --keyring=KEY_RING\
      --location=global\
      --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com\
      --role=roles/cloudkms.signer
    

Container Analysis メモを作成する

このセクションでは、メモを作成します。

  1. メモの ID を保存します。

    export NOTE_ID=snakeoil
    
  2. メモの URI を保存します。

    export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
    
  3. リクエストのペイロードを作成します。

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "voucher note for snakeoil check"
        }
      }
    }
    EOM
    
  4. メモを作成します。

    curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $(gcloud --project ${PROJECT_ID} auth print-access-token)"  \
      -H "x-goog-user-project: ${PROJECT_ID}" \
      --data-binary @/tmp/note_payload.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
    

Voucher Server の構築と構成

この 1 回限りの設定では、Voucher Server イメージを取得、構成、ビルドします。その後、イメージを Container Registry に格納します。

  1. Voucher リポジトリのクローンを作成します。

    git clone https://github.com/grafeas/voucher.git
    cd voucher/
    

    このリポジトリには以下が含まれます。

    • Voucher Server をビルドするソースコード。
    • Voucher クライアントをビルドするソースコード。
    • Voucher の使用を示す例。
  2. Voucher Server 構成ファイルを更新します。

    Linux

    テンプレートから Voucher Server 構成ファイルを作成します。 は、先ほど定義した値に置き換えます。これを行うには、次のコマンドを実行します。

     cat tutorials/cloudrun/config.toml.template \
        | sed -e "s?<PROJECT_ID>?${PROJECT_ID}?g" \
        | sed -e "s?<KMS_KEY_NAME>?${KMS_RESOURCE_ID}?g" \
          > tutorials/cloudrun/config.toml
    

    その他の OS

    1. tutorials/cloudrun/config.toml.template ファイルを編集します。

      • <PROJECT_ID> は、${PROJECT_ID} の値に置き換えます。
      • <KMS_KEY_NAME> は、${KMS_RESOURCE_ID} の値に置き換えます。
    2. ファイルを tutorials/cloudrun/config.toml として保存します。

  3. Voucher Server 構成ファイルを表示します。

    cat tutorials/cloudrun/config.toml
    

    次の内容を含む出力が表示されます。

    failon = "high"
    

    構成ファイルでは、failon オプションを high に設定しています。この設定により、イメージの脆弱性チェックを実行するように Voucher サーバーが構成されます。イメージに重大度が HIGH の脆弱性が含まれている場合、チェックは失敗し、Voucher Server は Binary Authorization 証明書を作成しません。fail-on の設定の詳細については、フェイルオン: 脆弱性による失敗をご覧ください。

  4. Voucher Server のコンテナ イメージをビルドしてアップロードします。

    このセクションでは、Cloud Build パイプラインを実行して Voucher Server コンテナ イメージをビルドします。このビルドにより、Voucher Server イメージが、gcr.io/$PROJECT_ID/voucher-server にアップロードされます。

    gcloud  builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
    

Cloud Run での Voucher サーバーのデプロイ

  1. リージョンを選択します。

    使用可能なリージョンのリストを表示するには、使用可能なリージョンのリストの表示をご覧ください。選択したリージョンを格納する変数を作成します。

    export REGION=REGION
    

    REGION は、Voucher Server をデプロイする予定のリージョンの名前に置き換えます。

  2. Cloud Run に Voucher Server をデプロイします。

    gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \
      --platform managed voucher-server \
      --region ${REGION} \
      --no-allow-unauthenticated
    

    次のような出力が表示されます。

    Service [voucher-server] revision [voucher-server-00001-caw] has been deployed and is serving 100 percent of traffic.
    Service URL: https://voucher-server-4wjtm2amga-uc.a.run.app
    
  3. Voucher Server のサービス URL を保存します。

    export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
    

Voucher クライアントの設定

以下の手順では、Voucher クライアントを設定します。

  1. Voucher クライアント用の呼び出し元サービス アカウントを作成します。

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    INVOKER_ACCOUNT_NAME は、呼び出し元サービス アカウントの名前(voucher-invoker など)に置き換えます。

  2. サービス アカウントを指定します。

    export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  3. プロジェクトの呼び出し元サービス アカウントに run.invoker ロールを付与します。

    呼び出し元サービス アカウントに Cloud Run で Voucher Server を呼び出す権限を付与します。これを行うには、次のコマンドを入力します。

    gcloud run services add-iam-policy-binding voucher-server \
      --member serviceAccount:$INVOKER_SERVICE_ACCOUNT \
      --role roles/run.invoker \
      --platform managed \
      --region ${REGION}
    
  4. Cloud Build の呼び出し元サービス アカウントに iam.serviceAccountTokenCreator ロールを付与します。

    このセクションでは、Cloud Build サービス アカウントに呼び出し元サービス アカウントの権限借用を許可して、Voucher クライアントがビルド中に Voucher Server にリクエストを送信できるようにします。これを行うには、次のコマンドを入力します。

    gcloud iam service-accounts add-iam-policy-binding $INVOKER_SERVICE_ACCOUNT \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountTokenCreator
    

Voucher を使用したイメージの脆弱性の確認

このセクションでは、2 つのサンプル Cloud Build パイプラインを実行します。どちらのパイプラインでも、イメージをビルドしてから Voucher を使用して脆弱性を確認します。

障害のケース

このセクションでは、サンプルのビルド パイプラインが証明書の作成に失敗します。Debian 9 に基づいてビルドされたイメージには、重大度 HIGH の脆弱性が 1 つ以上含まれています。Voucher Server config.tomlfail-on オプションは、重大度が HIGH の脆弱性で失敗するように設定されています。この場合、Voucher Server は Binary Authorization 証明書を作成しません。

  1. ビルド パイプラインを実行します。

    gcloud builds submit \
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT \
      --config=tutorials/cloudrun/examples/cloudbuild-bad.yaml tutorials/cloudrun/examples
    
  2. 前回のビルドからログを検索して、Voucher snakeoil の結果を見つけます。

    Console

    1. 最後のビルドのビルド ID をメモします。

    2. Google Cloud Console で [ビルド履歴] ページに移動します。

      [ビルド履歴] に移動

    3. [ビルド] で、ビルド ID の最初の数文字を含む項目をクリックします。

    4. [View Raw] をクリックします。

    5. ブラウザを使用して「snakeoil」を検索します。

      次のような出力が表示されます。

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

    gcloud

    1. ビルドのビルド ID を保存します。

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. 次のコマンドを入力して、ビルドログを検索します。

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      出力は次のようになります。

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

成功のケース

このセクションでは、サンプルのビルド パイプラインが証明書の作成に成功します。検出されたすべての脆弱性は fail-on しきい値よりも低い値に分類されるため、チェックは合格し、パイプラインにより証明書が作成されます。

  1. パイプラインを実行します。

    gcloud builds submit\
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT\
      --config=tutorials/cloudrun/examples/cloudbuild-good.yaml tutorials/cloudrun/examples
    
  2. 前回のビルドからログを検索して、Voucher snakeoil の結果を見つけます。

    Console

    1. 最後のビルドのビルド ID をメモします。

    2. Google Cloud Console で [ビルド履歴] ページに移動します。

      [ビルド履歴] に移動

    3. [ビルド] で、ビルド ID の最初の数文字を含む項目をクリックします。

    4. [View Raw] をクリックします。

    5. ブラウザを使用して「snakeoil」を検索します。

      次のような出力が表示されます。

      "name":"snakeoil","success":true,"attested":true
      

    gcloud

    1. 最後のビルドのビルド ID を保存します。

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. 次のコマンドを入力して、ビルドログを検索します。

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      出力は次のようになります。

      "name":"snakeoil","success":true,"attested":true
      

クリーンアップ

このドキュメントで使用されたリソースをクリーンアップするには、次のようにプロジェクトを削除します。

gcloud projects delete ${PROJECT_ID}

次のステップ