ID の発行と使用を確認する


このページでは、ログを使用して、Google Kubernetes Engine(GKE)クラスタ コントロール プレーンによる Kubernetes ID(証明書とサービス アカウント トークンの形式)の発行と使用を確認する方法について説明します。この検証は完全に任意であり、コントロール プレーンの保護に必要ではありません。

このガイドは、認証情報の発行と署名を制御するための組織のコンプライアンス要件またはポリシー要件があるセキュリティ管理者とプラットフォーム オーナーを対象としています。GKE コントロール プレーン権限でセルフマネージド鍵と CA を設定している必要があります。

次のコンセプトに精通している必要があります。

このページでは、GKE のオプションのコントロール プレーン機能のセットについて説明します。この機能を使用すると、コントロール プレーンのセキュリティ対策の検証や、管理する鍵を使用してコントロール プレーンでの暗号化と認証情報の署名の構成などのタスクを実行できます。詳細については、GKE control plane authority についてをご覧ください。

デフォルトでは、Google Cloud はマネージド コントロール プレーンにさまざまなセキュリティ対策を適用します。このページでは、GKE コントロール プレーンの可視性と制御を強化するオプション機能について説明します。

ID 発行ログについて

GKE ID 発行ログは、コントロール プレーンが認証情報を発行したときと、それらの認証情報がクラスタで使用されたときを記録するコントロール プレーンの監査ログです。これらのログを使用して、ID 発行ログを Cloud KMS、Certificate Authority Service、Kubernetes API ログと関連付けることで、認証情報の有効期間(発行と使用を含む)を追跡できます。GKE コントロール プレーン権限を使用すると、GKE ID 発行ログが有効になります。これらのログは、次のタイプの認証情報の発行と使用を追跡します。

  • X.509 証明書
  • クラスタ JSON Web Token(JWT)

X.509 証明書

Kubernetes は、クライアント証明書認証に X.509 証明書を使用します。証明書を発行するために、Kubernetes コントロール プレーンは、承認済みの CertificateSigningRequest を CA Service の認証局(CA)に送信します。CA は、Cloud KMS 内の対応する鍵を使用して証明書を発行し、証明書ダイジェストを署名します。

Kubernetes API サーバー ログには、証明書で認証された Kubernetes API 呼び出しの証明書署名の詳細が含まれています。ログの認証情報 ID エントリの形式は次のとおりです。

"authentication.k8s.io/credential-id": "X509SHA256=CERTIFICATE_HASH"

CERTIFICATE_HASH 値は証明書の SHA256 ハッシュです。証明書のライフサイクルをトレースするために使用できます。

Kubernetes API サーバー証明書ログを使用して、次のサービスのログを関連付けることで、証明書のライフサイクルをトレースできます。

  • GKE ID 発行ログ: protoPayload.metadata.credentialId クエリを使用して、Kubernetes API サーバーログの認証情報 ID に基づいて特定の GKE ID 発行ログを見つけます。次に、GKE ID 発行ログの protoPayload.metadata.certificateFingerprint フィールドを使用して、ID 発行ログと CA Service ログを関連付けます。
  • CA Service ログ: 証明書発行ログエントリを見つけます。このエントリには次の ID が含まれています。
    • cert_fingerprint.sha256_hash: 署名付き証明書の SHA256 ハッシュ。この ID を使用して、ログを GKE と Kubernetes API イベントと照合します。
    • tbs_certificate_digest: Cloud KMS 鍵で署名するために送信された証明書の内容のハッシュ。この ID を使用して、ログを Cloud KMS ログと照合します。
  • Cloud KMS 署名ログ: CA Service ログの tbs_certificate_digest 値を使用して、想定される Cloud KMS 鍵が証明書に署名したことを確認します。

JSON Web Token(JWT)

署名付き JWT(JSON Web Token)は、Kubernetes API へのリクエストの認証時に、Kubernetes サービス アカウントなどのクラスタ内のエンティティのベアラートークンとして使用されます。特定のサービス アカウントを使用する Pod が作成されると、Kubernetes は JWT を作成し、Pod にマウントします。GKE コントロール プレーン権限を使用して独自の鍵と CA を実行する場合、この JWT は署名され、後で Cloud KMS のサービス アカウント署名鍵を使用して検証されます。

Kubernetes API サーバー ログには、JWT で認証された Kubernetes API 呼び出しのトークン署名の詳細が含まれます。ログ内のトークン署名エントリの形式は次のとおりです。

"authentication.kubernetes.io/credential-id":"JTI=JWT_ID"

JWT_ID 値は、Kubernetes API 呼び出しで使用された JWT を識別する文字列です。

Kubernetes API サーバーログの JWT ID を使用して、次のログを関連付けることで、JWT のライフサイクルをトレースできます。

  • GKE ID 発行ログ: Kubernetes API サーバー ログの JWT ID を使用して、特定の JWT 発行エントリを見つけます。各エントリには toBeSignedDigest フィールドも含まれ、その値は Cloud KMS ログと一致する場合があります。
  • Cloud KMS 署名ログ: GKE ID 発行ログの toBeSignedDigest フィールドの値を使用して、想定される Cloud KMS 鍵が JWT に署名したことを確認します。

料金

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. セルフマネージド CA または鍵を使用して GKE クラスタ コントロール プレーンを構成する

  2. 次の Cloud Audit Logging Service API を有効にします。

必要なロール

ID 発行ログにアクセスするために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

  • Logging のすべての操作を実行する: Logging 管理者roles/logging.admin)。
  • ログを表示する: プライベート ログ閲覧者roles/logging.privateLogViewer

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

要件と制限事項

次の要件と制限が適用されます。

  • GKE バージョン 1.31.1-gke.1846000 以降を使用する必要があります。
  • ID 発行ログは Cloud Audit Logs ログとして記録され、保持期間は 400 日間に設定されています。保持期間は構成できませんが、システム イベント監査ログを他の宛先に転送して、保持期間を長くすることができます。

証明書を確認する

GKE コントロール プレーンの認証情報発行ログを使用して、証明書が正常に発行または使用されたことを確認できます。証明書の発行と使用に関する情報を確認するには、次のログのいずれか、またはログの組み合わせを使用します。

証明書ログ

証明書の使用に関する Kubernetes API ログ

Kubernetes API に対して証明書が使用されるたびに、証明書署名の詳細がログに記録されます。

証明書発行オペレーションの GKE ログ

すべての証明書発行オペレーションをシステム イベント監査ログとしてログに記録します。これらのログは、GKE コントロール プレーン権限のユーザー管理鍵または CA を使用するクラスタでデフォルトで有効になっています。

CA Service の監査ログ

証明書が発行されるたびにエントリを記録します。

Cloud KMS 監査ログ

CA Service からの署名リクエストに応答して、ダイジェストが署名されるたびにエントリをログに記録します。

Kubernetes API ログで証明書の使用を確認する

証明書を使用して認証された API 呼び出しのログエントリを確認するには、次の操作を行います。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    log_id("cloudaudit.googleapis.com/activity")
    resource.type="k8s_cluster"
    labels."authentication.kubernetes.io/credential-id":"X509SHA256="
    
  3. [クエリを実行] をクリックします。

    このクエリは、関連する X.509 証明書を持つすべての Kubernetes API サーバーログを返します。セキュリティ ツールを使用するか、ログを手動で確認して、調査する特定のログエントリを見つけます。

これらのログを他のログタイプと関連付けるには、次のフィールドを見つけます。

"authentication.k8s.io/credential-id":"CREDENTIAL_ID"

CREDENTIAL_ID 値は、GKE、CA Service、Cloud KMS のログを関連付けるために使用できる ID です。CREDENTIAL_ID の形式は "X509SHA256=CERTIFICATE_HASH" です。

GKE ログで証明書の発行を確認する

証明書発行イベントの GKE ログエントリを確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event"
    resource.type="gke_cluster"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.metadata.credentialId="CREDENTIAL_ID"
    

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

  3. [クエリを実行] をクリックします。

CA Service ログで証明書の発行を確認する

GKE 証明書発行イベントに一致する CA Service ログを検索する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    resource.type="audited_resource"
    protoPayload.serviceName="privateca.googleapis.com"
    protoPayload.methodName="google.cloud.security.privateca.v1.CertificateAuthorityService.CreateCertificate"
    protoPayload.response.certificate_description.cert_fingerprint.sha256_hash="CERTIFICATE_HASH"
    

    CERTIFICATE_HASH は、Kubernetes API ログで証明書の使用状況を確認するセクションの CERTIFICATE_HASH に置き換えます。ハッシュから X509SHA256= 接頭辞を省略してください。

  3. [クエリを実行] をクリックします。

    このクエリは、証明書の説明レスポンス セクションに tbs_certificate_digest: DIGEST_VALUE フィールドを含むログを返します。

DIGEST_VALUE を使用すると、証明書の Cloud KMS 署名ログを照合できます。

Cloud KMS 署名ログで証明書の発行を確認する

CA Service 証明書発行イベントの Cloud KMS 署名イベントを確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    protoPayload.request.digest.sha256="DIGEST_VALUE"
    protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog"
    protoPayload.methodName="AsymmetricSign"
    protoPayload.serviceName="cloudkms.googleapis.com"
    

    DIGEST_VALUE は、CA Service ログで証明書の発行を確認するセクションのダイジェスト値に置き換えます。

  3. [クエリを実行] をクリックします。

    このクエリは、証明書発行イベントのログを返します。Cloud KMS ログでは証明書と JWT が区別されないため、両方のログエントリは同じです。

トークンを検証する

GKE コントロール プレーンの認証情報発行ログと Cloud KMS 署名ログを使用して、JSON Web Token(JWT)が正常に発行されたことを確認できます。

トークン発行イベントのトレースを開始するには、通常、サービス アカウント アクティビティの Kubernetes API ログをモニタリングします。詳細な調査が必要なアクティビティ ログを特定したら、次のログを使用して認証情報の発行と使用に関する情報を確認できます。

JWT ログ

JWT 使用の Kubernetes API ログ

Kubernetes API に対して JWT が使用されるたびに、JWT 署名の詳細をログに記録します。

JWT 発行オペレーションの GKE ログ

すべてのトークン発行オペレーションをシステム イベント監査ログとしてログに記録します。これらのログは、GKE コントロール プレーン権限のユーザー管理鍵または CA を使用するクラスタでデフォルトで有効になっています。

Cloud KMS 監査ログ

トークンが署名されて発行されるたびにエントリをログに記録します。

Kubernetes API サーバーログでトークンの使用状況を確認する

トークン使用イベントのログエントリを確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    log_id("cloudaudit.googleapis.com/activity")
    resource.type="k8s_cluster"
    labels."authentication.kubernetes.io/credential-id":"JTI="
    
  3. [クエリを実行] をクリックします。

    このクエリは、JWT が関連付けられているすべての Kubernetes API サーバーログを返します。セキュリティ ツールを使用するか、ログを手動で確認して、調査する特定のログエントリを見つけます。

これらのログを他のログタイプと関連付けるには、次のフィールドを見つけます。

"authentication.k8s.io/credential-id": "JTI=JWT_ID"

JWT_ID は、GKE と Cloud KMS のログを関連付けるために使用できるトークン ID です。

GKE ログでトークンの発行を確認する

トークン発行イベントのログエントリを検索する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    resource.type="gke_cluster"
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event"
    protoPayload.methodName="google.cloud.gkeauth.v1.Auth.SignServiceAccountJWT"
    protoPayload.metadata.credentialId="JTI=JWT_ID"
    

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

  3. [クエリを実行] をクリックします。

    このクエリは、toBeSignedDigest フィールドを含むログを返します。

toBeSignedDigest 値を使用して、Cloud KMS 署名イベントを見つけることができます。

Cloud KMS 署名ログを使用してトークン発行を確認する

署名付きダイジェストのログエントリを確認する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタのフィールドに次の式を貼り付けます。

    protoPayload.request.digest.sha256="DIGEST_VALUE"
    protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog"
    protoPayload.methodName="AsymmetricSign"
    protoPayload.serviceName="cloudkms.googleapis.com"
    

    DIGEST_VALUE は、GKE ログでトークン発行を確認するセクションの toBeSignedDigest フィールドの値に置き換えます。

  3. [クエリを実行] をクリックします。

    このクエリは、証明書発行イベントのログを返します。Cloud KMS ログでは証明書と JWT が区別されないため、両方のログエントリは同じです。

次のステップ