クイックスタート: 継続的検証で Pod のセキュリティをモニタリングする

チェックベースのポリシーを使用して Binary Authorization の継続的検証(CV)を開始する方法を学習します。このクイックスタートでは、次の CV チェックを使用して、次の条件で実行中の Pod を継続的に検証します。

  • 信頼できるディレクトリ: Pod に関連付けられたイメージが、ポリシーで指定された 1 つ以上の信頼できるディレクトリに存在することを確認します。
  • イメージの鮮度: ポリシーで指定した日数以内に Pod のイメージがアップロードされていることを確認します。

始める前に

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

  3. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  4. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  5. プロジェクト Google Cloud を選択または作成します

    プロジェクトを選択または作成するために必要なロール

    • プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール (roles/resourcemanager.projectCreator)が必要です。これには resourcemanager.projects.create 権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
    • プロジェクトを作成する Google Cloud :

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、 Google Cloud プロジェクトの名前に置き換えます。

  6. プロジェクト Google Cloud に対して課金が有効になっていることを確認します

  7. Binary Authorization API と Google Kubernetes Engine API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法をご覧ください

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  8. Google Cloud CLI をインストールします。

  9. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  10. gcloud CLI を初期化するには、次のコマンドを実行します:

    gcloud init
  11. プロジェクト Google Cloud を選択または作成します

    プロジェクトを選択または作成するために必要なロール

    • プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール (roles/resourcemanager.projectCreator)が必要です。これには resourcemanager.projects.create 権限が含まれています。詳しくは、ロールを付与する方法をご覧ください。
    • プロジェクトを作成する Google Cloud :

      gcloud projects create PROJECT_ID

      PROJECT_ID は、作成する Google Cloud プロジェクトの名前に置き換えます。

    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID

      PROJECT_ID は、 Google Cloud プロジェクトの名前に置き換えます。

  12. プロジェクト Google Cloud に対して課金が有効になっていることを確認します

  13. Binary Authorization API と Google Kubernetes Engine API を有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限が付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法をご覧ください

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  14. kubectl コマンドライン ツールをインストールします。
  15. Binary Authorization ポリシーと GKE クラスタが別々のプロジェクトにある場合は、両方のプロジェクトで Binary Authorization が有効になっていることを確認します。

プラットフォーム ポリシーを作成する

CV GKE プラットフォーム ポリシーを設定する手順は次のとおりです。

  1. プラットフォーム ポリシーの YAML ファイルを作成します。

    cat << EOF > /tmp/my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - trustedDirectoryCheck:
            trustedDirPatterns:
            - us-central1-docker.pkg.dev/my-project/my-directory
          displayName: My trusted directory check
        - imageFreshnessCheck:
            maxUploadAgeDays: 30
          displayName: My image freshness check
        displayName: My trusted directory and image freshness check set
    EOF
    

    このポリシーでは、次の条件がチェックされます。

    • Pod のイメージが us-central1-docker.pkg.dev/my-project/my-directory という名前の Artifact Registry リポジトリに保存されている。

    • Pod のイメージが過去 30 日以内に Artifact Registry または Container Registry リポジトリにアップロードされている。

  2. プラットフォーム ポリシーを作成します。

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=/tmp/my-policy.yaml \
        --project=POLICY_PROJECT_ID
    

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

    • POLICY_ID: 任意の ID
    • POLICY_PROJECT_ID: ポリシー プロジェクト ID

クラスタの作成または更新

クラスタで CV を有効にするには、新しいクラスタを作成するか、既存のクラスタを更新します。

  • チェックベースのプラットフォーム ポリシーを有効にしてクラスタを作成するには、次のコマンドを実行します。

    gcloud beta container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

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

    • CLUSTER_NAME: クラスタの名前
    • LOCATION: ロケーション(例: us-central1asia-south1
    • POLICY_PROJECT_ID: ポリシーが保存されているプロジェクトの ID
    • POLICY_ID: ポリシー ID
    • CLUSTER_PROJECT_ID: クラスタ プロジェクト ID

    クラスタが作成されるまで待ちます。

  • チェックベースのポリシーを有効にして既存のクラスタを更新するには、次のコマンドを実行します。

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

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

    • CLUSTER_NAME: クラスタの名前
    • LOCATION: ロケーション(例: us-central1asia-south1
    • POLICY_PROJECT_ID: ポリシーが保存されているプロジェクトの ID
    • POLICY_ID: ポリシー ID
    • CLUSTER_PROJECT_ID: クラスタ プロジェクト ID

    クラスタが更新されるまで待ちます。

イメージをデプロイする

  1. kubectl の認証情報を取得します。

    gcloud container clusters get-credentials CLUSTER_NAME
    
  2. イメージをデプロイします。

    kubectl run hello-app \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    

    イメージ us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 は、過去 30 日以内にリポジトリにアップロードされているため、鮮度チェックの条件を満たしています。ただし、イメージが us-central1-docker.pkg.dev/my-project/my-directory にないため、信頼できるディレクトリ チェックの条件を満たしていません。このため、Cloud Logging に TrustedDirectoryCheck ログエントリが生成されます。

ログを閲覧する

ログエントリは、Pod のデプロイから 24 時間以内に Cloud Logging に表示されます(数時間で表示される場合もあります)。

Cloud Logging でログを表示するには、次のフィルタを使用します。

logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation"
"policyName"

hello-app Pod のログは以下のようになります。一部のフィールドは、プロジェクト ID やクラスタ名などによって異なる場合があります。

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/1234567890/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "Default check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

ログエントリには、次の情報を含むポリシー違反に関する情報が表示されます。

  • policyName: CV が違反を特定したときに使用していたプラットフォーム ポリシー
  • checkResults: 次のフィールドを含む結果のブロック。

    • explanation: エラー メッセージ
    • checkSetName: チェックセットの displayName
    • checkSetIndex: ポリシーに設定されたチェックのインデックス
    • checkName: チェックの名前
    • checkIndex: チェックセット内のチェックのインデックス
    • verdict: ログエントリの判定結果。この例では、チェックの条件を満たしていないため、NOT_CONFORMANT になっています。

一部のチェックでは、チェック条件を満たしていない理由がわかる追加情報が提供される場合があります。

イメージの鮮度チェックの条件を満たしているため、ログに鮮度チェックは表示されていません。

クリーンアップ

このページで使用したリソースについて、アカウントに課金されないようにするには、リソースを含むプロジェクトを削除します。 Google Cloud Google Cloud

このセクションでは、このガイドの前半で構成した CV モニタリングをクリーンアップする方法について説明します。

クラスタで CV モニタリングを無効にするか、Binary Authorization と CV の両方を無効にできます。

クラスタで Binary Authorization を無効にする

クラスタで CV と Binary Authorization の両方を無効にするには、次のコマンドを実行します。

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

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

  • CLUSTER_NAME: クラスタの名前
  • LOCATION: クラスタのロケーション
  • CLUSTER_PROJECT_ID: クラスタ プロジェクト ID

クラスタでチェックベースのポリシー モニタリングを無効にする

クラスタでチェックベースのポリシーを使用して CV を無効にし、Binary Authorization 適用ポリシーを使用して適用を再度有効にするには、次のコマンドを実行します。

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

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

  • CLUSTER_NAME: クラスタの名前
  • LOCATION: クラスタのロケーション
  • CLUSTER_PROJECT_ID: クラスタ プロジェクト ID

--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE は、古いフラグ --enable-binauthz と同じです。

ポリシーを削除する

ポリシーを削除するには、次のコマンドを実行します。チェックベースのポリシー監査を無効にするために、チェックベースのプラットフォーム ポリシーを削除する必要はありません。

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

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

  • POLICY_ID: ポリシーの ID
  • POLICY_PROJECT_ID: ポリシー プロジェクト ID

次のステップ