クイックスタート: 継続的検証で 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 ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、resourcemanager.projects.create 権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する
    • 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 権限を含む Service Usage 管理者 IAM ロール(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 ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、resourcemanager.projects.create 権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する
    • 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 権限を含む Service Usage 管理者 IAM ロール(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

次のステップ